AwesomePlayer.cpp revision b5ce361d19e69fe156f7188c9ee0f4734b259874
1bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber/*
2bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
4bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * you may not use this file except in compliance with the License.
6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * You may obtain a copy of the License at
7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
8bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
10bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * See the License for the specific language governing permissions and
14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * limitations under the License.
15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber */
16bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0
18bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer"
19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h>
20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
21988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h>
22988e3f0b2c74095deae580157c57935a98573052Andreas Huber
23cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/ARTSPController.h"
24bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h"
25733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h"
260a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h"
270a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h"
28bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h"
29bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
304844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h>
317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h>
327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h>
33e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h>
34e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h>
35bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h>
36bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h>
37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h>
38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h>
39717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h>
40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h>
41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h>
42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h>
43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h>
44717826ececd8d39596f62418677721d70776add1Andreas Huber
455daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h>
461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h>
483cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
49cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h>
5014acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h>
51e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
52e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1
5364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber#define FRAME_DROP_FREQ 0
54e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber
55bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android {
56bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll;  // 2secs
588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll;  // 10secs
59100a4408968b90e314526185d572c72ea4cc784aAndreas Huberstatic int64_t kHighWaterMarkRTSPUs = 4000000ll;  // 4secs
60ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000;
61ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000;
628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event {
64c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    AwesomeEvent(
65c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            AwesomePlayer *player,
66c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            void (AwesomePlayer::*method)())
67bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        : mPlayer(player),
68c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber          mMethod(method) {
69bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
70bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
71bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected:
72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual ~AwesomeEvent() {}
73bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
75c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        (mPlayer->*mMethod)();
76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate:
79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomePlayer *mPlayer;
80c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    void (AwesomePlayer::*mMethod)();
81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent(const AwesomeEvent &);
83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent &operator=(const AwesomeEvent &);
84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber};
85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
86733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer {
87733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(
881173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta)
891173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        : mTarget(new SoftwareRenderer(nativeWindow, meta)) {
90733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
91733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
92733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual void render(MediaBuffer *buffer) {
93fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        render((const uint8_t *)buffer->data() + buffer->range_offset(),
94fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber               buffer->range_length());
95fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
96fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
97fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    void render(const void *data, size_t size) {
98fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mTarget->render(data, size, NULL);
99733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
100733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
101733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected:
102733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual ~AwesomeLocalRenderer() {
103733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        delete mTarget;
104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        mTarget = NULL;
105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate:
1080a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    SoftwareRenderer *mTarget;
109988e3f0b2c74095deae580157c57935a98573052Andreas Huber
110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(const AwesomeLocalRenderer &);
111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber};
113733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
1146a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer {
115ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    AwesomeNativeWindowRenderer(
116ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            const sp<ANativeWindow> &nativeWindow,
117ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            int32_t rotationDegrees)
1186a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        : mNativeWindow(nativeWindow) {
119ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        applyRotation(rotationDegrees);
1206a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1216a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1226a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual void render(MediaBuffer *buffer) {
1236a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        status_t err = mNativeWindow->queueBuffer(
1246a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                mNativeWindow.get(), buffer->graphicBuffer().get());
1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        if (err != 0) {
1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            LOGE("queueBuffer failed with error %s (%d)", strerror(-err),
1276a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                    -err);
1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            return;
1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        }
1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        sp<MetaData> metaData = buffer->meta_data();
1326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        metaData->setInt32(kKeyRendered, 1);
1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected:
1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual ~AwesomeNativeWindowRenderer() {}
1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate:
1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<ANativeWindow> mNativeWindow;
1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
141ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    void applyRotation(int32_t rotationDegrees) {
142ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        uint32_t transform;
143ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        switch (rotationDegrees) {
144ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 0: transform = 0; break;
145ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 90: transform = HAL_TRANSFORM_ROT_90; break;
146ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 180: transform = HAL_TRANSFORM_ROT_180; break;
147ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 270: transform = HAL_TRANSFORM_ROT_270; break;
148ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            default: transform = 0; break;
149ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
150ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
151ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        if (transform) {
152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            CHECK_EQ(0, native_window_set_buffers_transform(
153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                        mNativeWindow.get(), transform));
154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
1576a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &);
1586a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer &operator=(
1596a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            const AwesomeNativeWindowRenderer &);
1606a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis};
1616a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1627cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage
1637cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) {
1647cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    sp<IBinder> binder =
1657cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        defaultServiceManager()->getService(String16("media.player"));
1667cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
1677cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    CHECK(service.get() != NULL);
1687cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1697cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    service->addBatteryData(params);
1707cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang}
171e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
1727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang////////////////////////////////////////////////////////////////////////////////
173bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer()
1742e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    : mQueueStarted(false),
1752e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber      mTimeSource(NULL),
176fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber      mVideoRendererIsPreview(false),
177bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mAudioPlayer(NULL),
178b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong      mDisplayWidth(0),
179b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong      mDisplayHeight(0),
180bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber      mFlags(0),
181acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber      mExtractorFlags(0),
1827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber      mVideoBuffer(NULL),
183dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang      mDecryptHandle(NULL) {
184e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    CHECK_EQ(mClient.connect(), (status_t)OK);
185bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
186bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    DataSource::RegisterDefaultSniffers();
187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
188c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
190c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone);
191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
192c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate);
19366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
194145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate);
195145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoEventPending = false;
196c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
197c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mCheckAudioStatusEvent = new AwesomeEvent(
198c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onCheckAudioStatus);
199c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2001862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
201bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
202bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
204bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() {
2062e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mQueueStarted) {
2072e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.stop();
2082e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mClient.disconnect();
213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
21566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) {
216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mVideoEvent->eventID());
217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mStreamDoneEvent->eventID());
219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
2201862a33b246249630b654182afb5914da3480d4cAndreas Huber    mQueue.cancelEvent(mCheckAudioStatusEvent->eventID());
2211862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
222145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mQueue.cancelEvent(mVideoLagEvent->eventID());
223145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = false;
22466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
22566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (!keepBufferingGoing) {
22666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mQueue.cancelEvent(mBufferingEvent->eventID());
22766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mBufferingEventPending = false;
22866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2310726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) {
232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mListener = listener;
234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2365561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource(
2375561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
2397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(uri, headers);
2407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
246bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri = uri;
24766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
248bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (headers) {
249bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mUriHeaders = *headers;
2507314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2517314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log"));
2527314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        if (index >= 0) {
2537314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            // Browser is in "incognito" mode, suppress logging URLs.
2547314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2557314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            // This isn't something that should be passed to the server.
2567314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            mUriHeaders.removeItemsAt(index);
2577314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2587314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            mFlags |= INCOGNITO;
2597314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        }
2607314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    }
2617314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2627314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    if (!(mFlags & INCOGNITO)) {
2637314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        LOGI("setDataSource_l('%s')", mUri.string());
2647314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    } else {
2657314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        LOGI("setDataSource_l(URL suppressed)");
26666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
26766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
268bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // The actual work will be done during preparation in the call to
269bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // ::finishSetDataSource_l to avoid blocking the calling thread in
270bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // setDataSource for any significant time.
27166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
272bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return OK;
273bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
274bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
275bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource(
276bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int fd, int64_t offset, int64_t length) {
277bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<DataSource> dataSource = new FileSource(fd, offset, length);
282bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    status_t err = dataSource->initCheck();
284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2897b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource = dataSource;
2907b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
2917b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(dataSource);
2927b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
2937b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
294e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) {
29585704836f33a199d7e442a23db82abbd5620d35dAndreas Huber    return INVALID_OPERATION;
296e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
297e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
2987b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2997b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const sp<DataSource> &dataSource) {
3007b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (extractor == NULL) {
303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
304bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
306b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang    dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient);
3078f64134f749e4f7861a08a3063450fc714c4651dGloria Wang    if (mDecryptHandle != NULL) {
3088f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        CHECK(mDrmManagerClient);
3098f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) {
3108f64134f749e4f7861a08a3063450fc714c4651dGloria Wang            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE);
3118f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        }
312dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
313dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return setDataSource_l(extractor);
315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
3187fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // Attempt to approximate overall stream bitrate by summing all
3197fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // tracks' individual bitrates, if not all of them advertise bitrate,
3207fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // we have to fail.
3217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3227fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t totalBitRate = 0;
3237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
3257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
3267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        int32_t bitrate;
3287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        if (!meta->findInt32(kKeyBitRate, &bitrate)) {
3297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            totalBitRate = -1;
3307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            break;
3317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        }
3327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        totalBitRate += bitrate;
3347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
3357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = totalBitRate;
3377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    LOGV("mBitrate = %lld bits/sec", mBitrate);
3397fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveAudio = false;
341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveVideo = false;
342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const char *mime;
346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
34988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setVideoSource(extractor->getTrack(i));
35088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveVideo = true;
351b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong
352b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            // Set the presentation/display size
353b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            int32_t displayWidth, displayHeight;
354b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth);
355b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            if (success) {
356b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                success = meta->findInt32(kKeyDisplayHeight, &displayHeight);
357b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            }
358b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            if (success) {
359b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                mDisplayWidth = displayWidth;
360b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                mDisplayHeight = displayHeight;
361b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            }
362b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong
363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
36488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setAudioSource(extractor->getTrack(i));
36588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveAudio = true;
3668ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber
3676954535ba64374e4e941cd83019a7af53edfb098Andreas Huber            if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
3686954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // Only do this for vorbis audio, none of the other audio
3696954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // formats even support this ringtone specific hack and
3706954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // retrieving the metadata on some extractors may turn out
3716954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // to be very expensive.
3726954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                sp<MetaData> fileMeta = extractor->getMetaData();
3736954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                int32_t loop;
3746954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                if (fileMeta != NULL
3756954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                        && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) {
3766954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                    mFlags |= AUTO_LOOPING;
3776954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                }
3788ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber            }
379bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
380bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
381bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (haveAudio && haveVideo) {
382bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            break;
383bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
384bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
386acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    if (!haveAudio && !haveVideo) {
387acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return UNKNOWN_ERROR;
388acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
389acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
390acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = extractor->flags();
391acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
392acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
394bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
395bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() {
396bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
399bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
400bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() {
401b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    mDisplayWidth = 0;
402b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    mDisplayHeight = 0;
40365a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber
404dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
405dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
406dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::STOP, 0);
407dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDecryptHandle = NULL;
408dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient = NULL;
409dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
410dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
4117cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mFlags & PLAYING) {
4127cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
4137cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
4147cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            params |= IMediaPlayerService::kBatteryDataTrackAudio;
4157cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        }
4167cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        if (mVideoSource != NULL) {
4177cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            params |= IMediaPlayerService::kBatteryDataTrackVideo;
4187cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        }
4197cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        addBatteryData(params);
4207cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
4217cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
422e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mFlags & PREPARING) {
423e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mFlags |= PREPARE_CANCELLED;
424e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (mConnectingDataSource != NULL) {
425e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            LOGI("interrupting the connection process");
426e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource->disconnect();
427f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        } else if (mConnectingRTSPController != NULL) {
428f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber            LOGI("interrupting the connection process");
429f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber            mConnectingRTSPController->disconnect();
430e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
4316a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
4326a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        if (mFlags & PREPARING_CONNECTED) {
4336a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // We are basically done preparing, we're just buffering
4346a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // enough data to start playback, we can safely interrupt that.
4356a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            finishAsyncPrepare_l();
4366a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        }
437e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
438e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
439bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
440bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mPreparedCondition.wait(mLock);
441bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
442bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    cancelPlayerEvents();
444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
4450a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mCachedSource.clear();
44688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack.clear();
44788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack.clear();
44888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
4497b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // Shutdown audio first, so that the respone to the reset request
4507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // appears to happen instantaneously as far as the user is concerned
4517b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // If we did this later, audio would continue playing while we
4527b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // shutdown the video-related resources and the player appear to
4537b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // not be as responsive to a reset request.
454e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mAudioPlayer == NULL && mAudioSource != NULL) {
455e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // If we had an audio player, it would have effectively
456e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // taken possession of the audio source and stopped it when
457e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // _it_ is stopped. Otherwise this is still our responsibility.
458e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mAudioSource->stop();
459e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
4607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioSource.clear();
4617b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
4627b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mTimeSource = NULL;
4637b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
4647b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete mAudioPlayer;
4657b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioPlayer = NULL;
4667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
467b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber    mVideoRenderer.clear();
468b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber
469bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoBuffer) {
470bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer->release();
471bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer = NULL;
472bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
473bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
474cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    if (mRTSPController != NULL) {
475cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        mRTSPController->disconnect();
476cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        mRTSPController.clear();
477cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    }
478cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber
479bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
480bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoSource->stop();
48169f5f4c021ee55055df39718244c036faf2d3382Andreas Huber
48269f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // The following hack is necessary to ensure that the OMX
48369f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // component is completely released by the time we may try
48469f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // to instantiate it again.
48569f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        wp<MediaSource> tmp = mVideoSource;
486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoSource.clear();
48769f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        while (tmp.promote() != NULL) {
48869f5f4c021ee55055df39718244c036faf2d3382Andreas Huber            usleep(1000);
48969f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        }
49069f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        IPCThreadState::self()->flushCommands();
491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
492bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
493bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mDurationUs = -1;
494bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags = 0;
495acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = 0;
496bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mTimeSourceDeltaUs = 0;
497bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoTimeUs = 0;
498bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
49964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = NO_SEEK;
5001321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    mSeekNotificationSent = false;
501bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = 0;
50266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
503bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri.setTo("");
504bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUriHeaders.clear();
5057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5067b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource.clear();
5077b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5087fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = -1;
509bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
510bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
511c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) {
5120726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber    if (mListener != NULL) {
5130726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        sp<MediaPlayerBase> listener = mListener.promote();
5140726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
5150726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        if (listener != NULL) {
516c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            listener->sendEvent(msg, ext1, ext2);
51766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        }
51866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
51966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
52066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
5217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) {
522c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t size;
5237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mDurationUs >= 0 && mCachedSource != NULL
5247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            && mCachedSource->getSize(&size) == OK) {
5257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = size * 8000000ll / mDurationUs;  // in bits/sec
5267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
5277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
5287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mBitrate >= 0) {
5307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = mBitrate;
5317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
5327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
5337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    *bitrate = 0;
5357fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    return false;
5377fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber}
5387fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable.
5408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) {
5417fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t bitrate;
5428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
5438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mRTSPController != NULL) {
5448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        *durationUs = mRTSPController->getQueueDurationUs(eos);
5458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return true;
5467fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    } else if (mCachedSource != NULL && getBitrate(&bitrate)) {
5471bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        status_t finalStatus;
5481bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
5498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        *durationUs = cachedDataRemaining * 8000000ll / bitrate;
5501bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        *eos = (finalStatus != OK);
5518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return true;
5528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
5538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
5548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    return false;
5558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
5568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
55734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() {
55834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    if (mCachedSource != NULL) {
55934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber        mCachedSource->resumeFetchingIfNecessary();
56034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    }
56134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber}
56234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
563145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() {
564145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    Mutex::Autolock autoLock(mLock);
565145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (!mVideoLagEventPending) {
566145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        return;
567145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
568145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = false;
569145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
570145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs();
571145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    int64_t videoLateByUs = audioTimeUs - mVideoTimeUs;
572145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
573145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (videoLateByUs > 300000ll) {
574145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        LOGV("video late by %lld ms.", videoLateByUs / 1000ll);
575145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
576145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        notifyListener_l(
577145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                MEDIA_INFO,
578145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                MEDIA_INFO_VIDEO_TRACK_LAGGING,
579145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                videoLateByUs / 1000ll);
580145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
581145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
582145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    postVideoLagEvent_l();
583145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber}
584145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
58566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() {
58666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    Mutex::Autolock autoLock(mLock);
587d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mBufferingEventPending) {
588d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
589d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
59066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
59166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
5928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mCachedSource != NULL) {
5931bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        status_t finalStatus;
5941bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
5951bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        bool eos = (finalStatus != OK);
596c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
5978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (eos) {
5981bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney            if (finalStatus == ERROR_END_OF_STREAM) {
5991bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney                notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
6001bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney            }
60183977eb230d829cfe520f55d7977037a904ce548Andreas Huber            if (mFlags & PREPARING) {
60283977eb230d829cfe520f55d7977037a904ce548Andreas Huber                LOGV("cache has reached EOS, prepare is done.");
60383977eb230d829cfe520f55d7977037a904ce548Andreas Huber                finishAsyncPrepare_l();
60483977eb230d829cfe520f55d7977037a904ce548Andreas Huber            }
6058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        } else {
6067fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            int64_t bitrate;
6077fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            if (getBitrate(&bitrate)) {
6088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                size_t cachedSize = mCachedSource->cachedSize();
6098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate;
610c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
6128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if (percentage > 100) {
6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    percentage = 100;
6148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
615c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else {
6188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // We don't know the bitrate of the stream, use absolute size
6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // limits to maintain the cache.
6208650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
6218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if ((mFlags & PLAYING) && !eos
6228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        && (cachedDataRemaining < kLowWaterMarkBytes)) {
6238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    LOGI("cache is running low (< %d) , pausing.",
6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                         kLowWaterMarkBytes);
6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    mFlags |= CACHE_UNDERRUN;
6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    pause_l();
62734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber                    ensureCacheIsFetching_l();
6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
6298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) {
6308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    if (mFlags & CACHE_UNDERRUN) {
6318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        LOGI("cache has filled up (> %d), resuming.",
6328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
6338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        mFlags &= ~CACHE_UNDERRUN;
6348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        play_l();
6358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
6368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    } else if (mFlags & PREPARING) {
6378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        LOGV("cache has filled up (> %d), prepare is done",
6388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
6398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        finishAsyncPrepare_l();
6408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    }
6418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
6428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            }
6438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        }
6442415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
6452415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber
6468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    int64_t cachedDurationUs;
6472a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber    bool eos;
6488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (getCachedDuration_l(&cachedDurationUs, &eos)) {
64934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber        LOGV("cachedDurationUs = %.2f secs, eos=%d",
65034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber             cachedDurationUs / 1E6, eos);
65134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
652100a4408968b90e314526185d572c72ea4cc784aAndreas Huber        int64_t highWaterMarkUs =
653100a4408968b90e314526185d572c72ea4cc784aAndreas Huber            (mRTSPController != NULL) ? kHighWaterMarkRTSPUs : kHighWaterMarkUs;
654100a4408968b90e314526185d572c72ea4cc784aAndreas Huber
6558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if ((mFlags & PLAYING) && !eos
6568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                && (cachedDurationUs < kLowWaterMarkUs)) {
6578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            LOGI("cache is running low (%.2f secs) , pausing.",
6588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                 cachedDurationUs / 1E6);
6598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            mFlags |= CACHE_UNDERRUN;
6608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            pause_l();
66134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber            ensureCacheIsFetching_l();
6628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
663100a4408968b90e314526185d572c72ea4cc784aAndreas Huber        } else if (eos || cachedDurationUs > highWaterMarkUs) {
6648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            if (mFlags & CACHE_UNDERRUN) {
6658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                LOGI("cache has filled up (%.2f secs), resuming.",
6668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
6678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                mFlags &= ~CACHE_UNDERRUN;
6688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                play_l();
6698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
6708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else if (mFlags & PREPARING) {
6718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                LOGV("cache has filled up (%.2f secs), prepare is done",
6728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
6738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                finishAsyncPrepare_l();
6742a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber            }
6752a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber        }
6760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
6770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
6780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    postBufferingEvent_l();
6790726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber}
6800726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
681bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() {
682bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    // Posted whenever any stream finishes playing.
683bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
684bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
685d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mStreamDoneEventPending) {
686d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
687d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
688bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
689bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
690ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber    if (mStreamDoneStatus != ERROR_END_OF_STREAM) {
6915d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        LOGV("MEDIA_ERROR %d", mStreamDoneStatus);
6925d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
6935d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(
6945d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber                MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
6955d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
696b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
6975d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
6985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mFlags |= AT_EOS;
6995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
7005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
7015d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
7025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    const bool allDone =
7035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS))
7045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber            && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS));
7055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
7065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!allDone) {
7075d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
7085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
7095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
7108ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    if (mFlags & (LOOPING | AUTO_LOOPING)) {
711bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        seekTo_l(0);
712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
713a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        if (mVideoSource != NULL) {
714bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            postVideoEvent_l();
715bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
716bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
7175d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        LOGV("MEDIA_PLAYBACK_COMPLETE");
7185d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
719bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
720b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
7212e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
7222e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mFlags |= AT_EOS;
723bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
724bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
725bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
726bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() {
727bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
7280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
7290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mFlags &= ~CACHE_UNDERRUN;
7300a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
7317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return play_l();
7327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
733bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
7347b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() {
7352b1222f8938356669672f35e0e53e176c78c40efAndreas Huber    mFlags &= ~SEEK_PREVIEW;
7362b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
737bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & PLAYING) {
738bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
739bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
740bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
741bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (!(mFlags & PREPARED)) {
742bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        status_t err = prepare_l();
743bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
744bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        if (err != OK) {
745bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            return err;
746bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
747bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
748bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
749bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags |= PLAYING;
750bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags |= FIRST_FRAME;
751bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
752fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    bool deferredAudioSeek = false;
753fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber
754c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang    if (mDecryptHandle != NULL) {
755c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        int64_t position;
756c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        getPosition(&position);
757c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
758c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang                Playback::START, position / 1000);
759c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang    }
760c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang
761bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
762bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mAudioPlayer == NULL) {
763bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mAudioSink != NULL) {
764ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber                mAudioPlayer = new AudioPlayer(mAudioSink, this);
765bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mAudioPlayer->setSource(mAudioSource);
766e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
767f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mTimeSource = mAudioPlayer;
76888c030e0e0152791ff74f90249f55fce01371198Andreas Huber
769f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                deferredAudioSeek = true;
77088c030e0e0152791ff74f90249f55fce01371198Andreas Huber
771f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mWatchForAudioSeekComplete = false;
772f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mWatchForAudioEOS = true;
773f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            }
774f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
77588c030e0e0152791ff74f90249f55fce01371198Andreas Huber
776f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        CHECK(!(mFlags & AUDIO_RUNNING));
777c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang
778f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (mVideoSource == NULL) {
779f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            status_t err = startAudioPlayer_l();
780bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
781f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            if (err != OK) {
782f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                delete mAudioPlayer;
783f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mAudioPlayer = NULL;
784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
785f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mFlags &= ~(PLAYING | FIRST_FRAME);
7861862a33b246249630b654182afb5914da3480d4cAndreas Huber
787f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                if (mDecryptHandle != NULL) {
788f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                    mDrmManagerClient->setPlaybackStatus(
789f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                            mDecryptHandle, Playback::STOP, 0);
790f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                }
791f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
792f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                return err;
793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
796bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
797bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mTimeSource == NULL && mAudioPlayer == NULL) {
7985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSource = &mSystemTimeSource;
799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
801bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
802a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        // Kick off video playback
803a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        postVideoEvent_l();
804145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
805145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        if (mAudioSource != NULL && mVideoSource != NULL) {
806145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber            postVideoLagEvent_l();
807145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        }
808bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
809bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
810fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    if (deferredAudioSeek) {
811fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        // If there was a seek request while we were paused
812fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        // and we're just starting up again, honor the request now.
813fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        seekAudioIfNecessary_l();
814fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    }
815fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber
8162e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mFlags & AT_EOS) {
8172e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // Legacy behaviour, if a stream finishes playing and then
8182e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // is started again, we play from the start...
8192e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        seekTo_l(0);
8202e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
8212e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
8227cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted
8237cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        | IMediaPlayerService::kBatteryDataTrackDecoder;
8247cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
8257cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackAudio;
8267cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
8277cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mVideoSource != NULL) {
8287cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackVideo;
8297cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
8307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    addBatteryData(params);
8317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
832bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
833bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
834bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
835f03034408506051f2f836e59305fcd5f662bf19aAndreas Huberstatus_t AwesomePlayer::startAudioPlayer_l() {
836f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    CHECK(!(mFlags & AUDIO_RUNNING));
837f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
838f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioSource == NULL || mAudioPlayer == NULL) {
839f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        return OK;
840f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
841f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
842f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (!(mFlags & AUDIOPLAYER_STARTED)) {
843f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        mFlags |= AUDIOPLAYER_STARTED;
844f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
845f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        // We've already started the MediaSource in order to enable
846f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        // the prefetcher to read its data.
847f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        status_t err = mAudioPlayer->start(
848f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                true /* sourceAlreadyStarted */);
849f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
850f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (err != OK) {
851f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
852f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            return err;
853f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
854f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    } else {
855f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        mAudioPlayer->resume();
856f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
857f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
858f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    mFlags |= AUDIO_RUNNING;
859f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
860f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    mWatchForAudioEOS = true;
861f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
862f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    return OK;
863f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber}
864f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
8655daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() {
8665daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
8675daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
868f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t cropLeft, cropTop, cropRight, cropBottom;
869f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    if (!meta->findRect(
870f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) {
871f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t width, height;
872f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        CHECK(meta->findInt32(kKeyWidth, &width));
873f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        CHECK(meta->findInt32(kKeyHeight, &height));
874f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
875f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropLeft = cropTop = 0;
876f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropRight = width - 1;
877f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropBottom = height - 1;
878f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
879f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        LOGV("got dimensions only %d x %d", width, height);
880f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    } else {
881f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        LOGV("got crop rect %d, %d, %d, %d",
882f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber             cropLeft, cropTop, cropRight, cropBottom);
883f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    }
884f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
885f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t usableWidth = cropRight - cropLeft + 1;
886f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t usableHeight = cropBottom - cropTop + 1;
887b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    if (mDisplayWidth != 0) {
888b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong        usableWidth = mDisplayWidth;
889b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    }
890b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    if (mDisplayHeight != 0) {
891b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong        usableHeight = mDisplayHeight;
892b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    }
8935daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
894ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
895ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
896ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
897ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
898ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
899ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
900ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (rotationDegrees == 90 || rotationDegrees == 270) {
901ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
902f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth);
903ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    } else {
904ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
905f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight);
906ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
9075daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
9085daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() {
9101173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (mNativeWindow == NULL) {
9110a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        return;
9120a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    }
913bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9140a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
915bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9160a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t format;
9170a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    const char *component;
9180a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t decodedWidth, decodedHeight;
9190a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyColorFormat, &format));
9200a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findCString(kKeyDecoderComponent, &component));
9210a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
9220a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
9234844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
924ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
925ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
926ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
927ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
928ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
929ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
9300a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    mVideoRenderer.clear();
9314844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
9320a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // Must ensure that mVideoRenderer's destructor is actually executed
9330a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // before creating a new one.
9340a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    IPCThreadState::self()->flushCommands();
9350a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber
9360a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) {
9370a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Hardware decoders avoid the CPU color conversion by decoding
9380a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // directly to ANativeBuffers, so we must use a renderer that
9390a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // just pushes those buffers to the ANativeWindow.
940ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        mVideoRenderer =
9411173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees);
9420a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    } else {
9430a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Other decoders are instantiated locally and as a consequence
9440a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // allocate their buffers in local address space.  This renderer
9450a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // then performs a color conversion and copy to get the data
9460a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // into the ANativeBuffer.
9471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta);
948bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
949bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
950bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
951bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() {
952bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
9530a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
9540a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mFlags &= ~CACHE_UNDERRUN;
9550a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
956bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause_l();
957bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
958bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
959b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) {
960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!(mFlags & PLAYING)) {
961bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
962bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
963bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
96466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    cancelPlayerEvents(true /* keepBufferingGoing */);
965bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
966f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) {
967b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        if (at_eos) {
968b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // If we played the audio stream to completion we
969b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // want to make sure that all samples remaining in the audio
970b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // track's queue are played out.
971b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioPlayer->pause(true /* playPendingSamples */);
972b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        } else {
973b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioPlayer->pause();
974b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        }
975f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
976f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        mFlags &= ~AUDIO_RUNNING;
977bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
978bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
979bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags &= ~PLAYING;
980bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
981dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
982dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
983dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                Playback::PAUSE, 0);
984dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
985dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
9867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
9877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
9887cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackAudio;
9897cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
9907cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mVideoSource != NULL) {
9917cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackVideo;
9927cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
9937cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
9947cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    addBatteryData(params);
9957cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
996bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
997bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
998bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
999bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const {
10000a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN);
1001bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1002bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10035daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) {
10045daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    Mutex::Autolock autoLock(mLock);
10055daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
10065daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    mSurface = surface;
10071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    mNativeWindow = surface;
10081173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
10091173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
10101173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
10111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    Mutex::Autolock autoLock(mLock);
10121173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
10131173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    mSurface.clear();
10141173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (surfaceTexture != NULL) {
10151173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        mNativeWindow = new SurfaceTextureClient(surfaceTexture);
10161173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
10171173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
10185daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
10195daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1020bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink(
1021bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const sp<MediaPlayerBase::AudioSink> &audioSink) {
1022bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1023bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1024bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mAudioSink = audioSink;
1025bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1026bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1027bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) {
1028bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1029bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1030bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags = mFlags & ~LOOPING;
1031bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1032bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (shouldLoop) {
1033bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mFlags |= LOOPING;
1034bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1035bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1036bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1037bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1038bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1039bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) {
10402415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    Mutex::Autolock autoLock(mMiscStateLock);
1041bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1042bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mDurationUs < 0) {
1043bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
1044bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1045bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1046bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *durationUs = mDurationUs;
1047bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1048bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1049bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1050bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1051bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) {
10528d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    if (mRTSPController != NULL) {
10538d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber        *positionUs = mRTSPController->getNormalPlayTimeUs();
10548d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    }
105564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    else if (mSeeking != NO_SEEK) {
1056dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber        *positionUs = mSeekTimeUs;
1057dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber    } else if (mVideoSource != NULL) {
10582415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        Mutex::Autolock autoLock(mMiscStateLock);
1059bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mVideoTimeUs;
1060bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else if (mAudioPlayer != NULL) {
1061bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mAudioPlayer->getMediaTimeUs();
1062bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
1063bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = 0;
1064bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1065bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1066bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1067bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1068bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1069bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) {
107070f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber    if (mExtractorFlags & MediaExtractor::CAN_SEEK) {
1071acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        Mutex::Autolock autoLock(mLock);
1072acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return seekTo_l(timeUs);
1073acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
1074acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
1075acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
1076bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1077bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10780dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static
10790dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) {
10800dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone();
10810dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber}
10820dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber
10830dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() {
10840dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    notifyListener_l(MEDIA_SEEK_COMPLETE);
10850dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    mSeekNotificationSent = true;
10860dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber}
10870dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber
1088bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) {
1089cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    if (mRTSPController != NULL) {
10900dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber        mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this);
1091cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        return OK;
1092cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    }
1093cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber
10940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    if (mFlags & CACHE_UNDERRUN) {
10950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        mFlags &= ~CACHE_UNDERRUN;
10960a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        play_l();
10970a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
10980a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
109964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = SEEK;
11001321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    mSeekNotificationSent = false;
1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = timeUs;
11025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS);
1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    seekAudioIfNecessary_l();
1105bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
11061321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    if (!(mFlags & PLAYING)) {
11071321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        LOGV("seeking while paused, sending SEEK_COMPLETE notification"
11081321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber             " immediately.");
11091321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
11101321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
11111321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        mSeekNotificationSent = true;
11122b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
11132b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if ((mFlags & PREPARED) && mVideoSource != NULL) {
11142b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            mFlags |= SEEK_PREVIEW;
11152b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            postVideoEvent_l();
11162b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        }
11171321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    }
11181321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
1119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1120bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1121bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1122bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() {
112364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) {
1124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mAudioPlayer->seekTo(mSeekTimeUs);
1125bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
11261862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = true;
11271862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = true;
11281321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        mSeekNotificationSent = false;
1129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
1130dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        if (mDecryptHandle != NULL) {
1131dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1132dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::PAUSE, 0);
1133dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1134dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::START, mSeekTimeUs / 1000);
1135dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        }
1136bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1137bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1138bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
113988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) {
114088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
114288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack = source;
114388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
114488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
114588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() {
114688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    sp<MetaData> meta = mAudioTrack->getFormat();
1147717826ececd8d39596f62418677721d70776add1Andreas Huber
1148717826ececd8d39596f62418677721d70776add1Andreas Huber    const char *mime;
1149717826ececd8d39596f62418677721d70776add1Andreas Huber    CHECK(meta->findCString(kKeyMIMEType, &mime));
1150717826ececd8d39596f62418677721d70776add1Andreas Huber
1151717826ececd8d39596f62418677721d70776add1Andreas Huber    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
115288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        mAudioSource = mAudioTrack;
1153717826ececd8d39596f62418677721d70776add1Andreas Huber    } else {
1154717826ececd8d39596f62418677721d70776add1Andreas Huber        mAudioSource = OMXCodec::Create(
115588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mClient.interface(), mAudioTrack->getFormat(),
1156717826ececd8d39596f62418677721d70776add1Andreas Huber                false, // createEncoder
115788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mAudioTrack);
1158717826ececd8d39596f62418677721d70776add1Andreas Huber    }
1159bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1160bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
1161bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
116288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
11632415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1164bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1165bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1166bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1167bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1168bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1169a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        status_t err = mAudioSource->start();
1170a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber
1171a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        if (err != OK) {
1172a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            mAudioSource.clear();
1173a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            return err;
1174a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        }
117581f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) {
117681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // For legacy reasons we're simply going to ignore the absence
117781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // of an audio decoder for QCELP instead of aborting playback
117881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // altogether.
117981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        return OK;
118081f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    }
1181e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
1182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mAudioSource != NULL ? OK : UNKNOWN_ERROR;
1183bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
118588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) {
118688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
118888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack = source;
118988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
119088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
11912a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) {
1192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoSource = OMXCodec::Create(
119388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            mClient.interface(), mVideoTrack->getFormat(),
1194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            false, // createEncoder
119539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            mVideoTrack,
11961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
1197bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1198bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
1199bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
120088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
12012415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1202bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1204bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1206bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1207139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        status_t err = mVideoSource->start();
1208139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber
1209139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        if (err != OK) {
1210139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            mVideoSource.clear();
1211139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            return err;
1212139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        }
1213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mVideoSource != NULL ? OK : UNKNOWN_ERROR;
1216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12184769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) {
121964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == SEEK_VIDEO_ONLY) {
122064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        mSeeking = NO_SEEK;
122164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        return;
122264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
122364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
122464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) {
12254769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        return;
12264769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    }
12274769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
12284769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    if (mAudioPlayer != NULL) {
1229f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis        LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6);
12304769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
12314769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // If we don't have a video time, seek audio to the originally
12324769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // requested seek time instead.
12334769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
12344769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs);
12354769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mWatchForAudioSeekComplete = true;
12364769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    } else if (!mSeekNotificationSent) {
12374769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // If we're playing video only, report seek complete now,
12384769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // otherwise audio player will notify us later.
12394769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
12404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    }
12414769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
12424769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    mFlags |= FIRST_FRAME;
124364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = NO_SEEK;
12444769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    mSeekNotificationSent = false;
1245a89082944308805b0def7de87c67e370e74b8789Gloria Wang
1246a89082944308805b0def7de87c67e370e74b8789Gloria Wang    if (mDecryptHandle != NULL) {
1247a89082944308805b0def7de87c67e370e74b8789Gloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1248a89082944308805b0def7de87c67e370e74b8789Gloria Wang                Playback::PAUSE, 0);
1249a89082944308805b0def7de87c67e370e74b8789Gloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1250a89082944308805b0def7de87c67e370e74b8789Gloria Wang                Playback::START, videoTimeUs / 1000);
1251a89082944308805b0def7de87c67e370e74b8789Gloria Wang    }
12524769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber}
12534769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
1254c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() {
1255bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
12567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (!mVideoEventPending) {
12577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // The event has been cancelled in reset_l() but had already
12587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // been scheduled for execution at that time.
12597b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return;
12607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
1262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
126364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking != NO_SEEK) {
1264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mVideoBuffer) {
1265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer->release();
1266bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer = NULL;
1267bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
12680a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
126964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (mSeeking == SEEK && mCachedSource != NULL && mAudioSource != NULL
12702b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                && !(mFlags & SEEK_PREVIEW)) {
12710a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // We're going to seek the video source first, followed by
12720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // the audio source.
12730a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // In order to avoid jumps in the DataSource offset caused by
12740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // the audio codec prefetching data from the old locations
12750a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // while the video codec is already reading data from the new
12760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // locations, we'll "pause" the audio source, causing it to
12770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // stop reading input data until a subsequent seek.
12780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1279f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) {
12800a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber                mAudioPlayer->pause();
1281f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
1282f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mFlags &= ~AUDIO_RUNNING;
12830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            }
12840a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            mAudioSource->pause();
12850a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        }
1286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!mVideoBuffer) {
1289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        MediaSource::ReadOptions options;
129064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (mSeeking != NO_SEEK) {
1291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6);
1292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1293abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber            options.setSeekTo(
129464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    mSeekTimeUs,
129564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    mSeeking == SEEK_VIDEO_ONLY
129664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                        ? MediaSource::ReadOptions::SEEK_NEXT_SYNC
129764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                        : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC);
1298bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        for (;;) {
1300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            status_t err = mVideoSource->read(&mVideoBuffer, &options);
1301c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber            options.clearSeekTo();
1302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (err != OK) {
1304e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                CHECK(mVideoBuffer == NULL);
1305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                if (err == INFO_FORMAT_CHANGED) {
1307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    LOGV("VideoSource signalled format change.");
1308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13095daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber                    notifyVideoSize_l();
13105daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1311a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    if (mVideoRenderer != NULL) {
1312fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        mVideoRendererIsPreview = false;
1313a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                        initRenderer_l();
1314a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    }
1315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    continue;
1316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                }
1317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13184769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // So video playback is complete, but we may still have
13194769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // a seek request pending that needs to be applied
13204769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // to the audio track.
132164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                if (mSeeking != NO_SEEK) {
13224769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                    LOGV("video stream ended while seeking!");
13234769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                }
13244769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                finishSeekIfNecessary(-1);
13254769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
13265d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber                mFlags |= VIDEO_AT_EOS;
13275295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber                postStreamDoneEvent_l(err);
1328bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                return;
1329bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1330bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13314844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            if (mVideoBuffer->range_length() == 0) {
133208411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // Some decoders, notably the PV AVC software decoder
133308411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // return spurious empty buffers that we just want to ignore.
133408411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber
13354844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer->release();
13364844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer = NULL;
13374844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                continue;
13384844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            }
13394844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
1340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            break;
1341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t timeUs;
1345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
1346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
134764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == SEEK_VIDEO_ONLY) {
134864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (mSeekTimeUs > timeUs) {
134964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us",
135064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                 mSeekTimeUs, timeUs);
135164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
135264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
135364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
13542415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    {
13552415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        Mutex::Autolock autoLock(mMiscStateLock);
13562415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        mVideoTimeUs = timeUs;
13572415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
1358bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
135964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    SeekType wasSeeking = mSeeking;
13604769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    finishSeekIfNecessary(timeUs);
1361bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1362f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) {
1363f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        status_t err = startAudioPlayer_l();
1364f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (err != OK) {
1365f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            LOGE("Startung the audio player failed w/ err %d", err);
1366f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            return;
1367f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
1368f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
1369f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
13705d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource;
13715d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
1372bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & FIRST_FRAME) {
1373bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mFlags &= ~FIRST_FRAME;
1374aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale        mSinceLastDropped = 0;
13755d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs;
1376bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1377bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1378bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t realTimeUs, mediaTimeUs;
13795d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL
1380bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) {
1381bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;
1382bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1383bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
138464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking == SEEK_VIDEO_ONLY) {
138564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
138664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
138764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        int64_t latenessUs = nowUs - timeUs;
138864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
138964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (latenessUs > 0) {
139064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6);
139164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
139264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
139364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
139464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking == NO_SEEK) {
139502a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber        // Let's display the first frame after seeking right away.
1396f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber
13972b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
1398bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13992b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        int64_t latenessUs = nowUs - timeUs;
14002b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
140164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (latenessUs > 500000ll
140264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mRTSPController == NULL
140364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mAudioPlayer != NULL
140464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mAudioPlayer->getMediaTimeMapping(
140564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    &realTimeUs, &mediaTimeUs)) {
140664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            LOGI("we're much too late (%.2f secs), video skipping ahead",
140764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                 latenessUs / 1E6);
140864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
140964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mVideoBuffer->release();
141064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mVideoBuffer = NULL;
141164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
141264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mSeeking = SEEK_VIDEO_ONLY;
141364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mSeekTimeUs = mediaTimeUs;
141464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
141564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            postVideoEvent_l();
141664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            return;
141764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
141864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
14192b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if (latenessUs > 40000) {
14202b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            // We're more than 40ms late.
14212b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            LOGV("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6);
14222b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            if ( mSinceLastDropped > FRAME_DROP_FREQ)
14232b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            {
14242b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                LOGV("we're late by %lld us (%.2f secs) dropping one after %d frames", latenessUs, latenessUs / 1E6, mSinceLastDropped);
14252b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                mSinceLastDropped = 0;
14262b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                mVideoBuffer->release();
14272b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                mVideoBuffer = NULL;
14282b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
14292b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                postVideoEvent_l();
14302b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                return;
14312b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            }
1432aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale        }
1433bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
14342b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if (latenessUs < -10000) {
14352b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            // We're more than 10ms early.
1436bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
14372b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            postVideoEvent_l(10000);
14382b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            return;
14392b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        }
1440bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1441bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1442fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
1443fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRendererIsPreview = false;
1444fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1445a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        initRenderer_l();
1446a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1447a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber
1448a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mVideoRenderer != NULL) {
1449aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale        mSinceLastDropped++;
1450a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        mVideoRenderer->render(mVideoBuffer);
1451a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1452bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1453f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    mVideoBuffer->release();
1454bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoBuffer = NULL;
1455bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
145664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) {
14572b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        mFlags &= ~SEEK_PREVIEW;
14582b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        return;
14592b1222f8938356669672f35e0e53e176c78c40efAndreas Huber    }
14602b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
1461bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    postVideoEvent_l();
1462bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1464bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) {
1465bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoEventPending) {
1466bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1467bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1468bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1469bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = true;
1470bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs);
1471bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1472bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
14735295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) {
1474bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mStreamDoneEventPending) {
1475bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1476bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1477bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = true;
14785295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber
14795295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    mStreamDoneStatus = status;
1480bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEvent(mStreamDoneEvent);
1481bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
148366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() {
148466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mBufferingEventPending) {
148566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        return;
148666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
148766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = true;
148866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mQueue.postEventWithDelay(mBufferingEvent, 1000000ll);
148966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
149066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
1491145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() {
1492145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (mVideoLagEventPending) {
1493145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        return;
1494145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
1495145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = true;
1496145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll);
1497145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber}
1498145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
14991862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l() {
15001862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mAudioStatusEventPending) {
15011862a33b246249630b654182afb5914da3480d4cAndreas Huber        return;
15021862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
15031862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = true;
1504ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber    mQueue.postEvent(mCheckAudioStatusEvent);
15051862a33b246249630b654182afb5914da3480d4cAndreas Huber}
15061862a33b246249630b654182afb5914da3480d4cAndreas Huber
15071862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() {
15081862a33b246249630b654182afb5914da3480d4cAndreas Huber    Mutex::Autolock autoLock(mLock);
1509d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mAudioStatusEventPending) {
1510d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        // Event was dispatched and while we were blocking on the mutex,
1511d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        // has already been cancelled.
1512d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
1513d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
1514d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber
15151862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
15161862a33b246249630b654182afb5914da3480d4cAndreas Huber
15171862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) {
15181862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = false;
15191321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
15201321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        if (!mSeekNotificationSent) {
15211321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            notifyListener_l(MEDIA_SEEK_COMPLETE);
15221321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            mSeekNotificationSent = true;
15231321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        }
1524dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber
152564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        mSeeking = NO_SEEK;
15261862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
15271862a33b246249630b654182afb5914da3480d4cAndreas Huber
15285295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    status_t finalStatus;
15295295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) {
15301862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = false;
15315d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mFlags |= AUDIO_AT_EOS;
15325d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mFlags |= FIRST_FRAME;
15335295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        postStreamDoneEvent_l(finalStatus);
15341862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
15351862a33b246249630b654182afb5914da3480d4cAndreas Huber}
15361862a33b246249630b654182afb5914da3480d4cAndreas Huber
1537c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() {
1538c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1539bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return prepare_l();
1540bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
1541c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1542bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() {
1543bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARED) {
1544bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return OK;
1545bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1546bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1547bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1548bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1549bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1550bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1551bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = false;
1552c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    status_t err = prepareAsync_l();
1553c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1554c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    if (err != OK) {
1555c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        return err;
1556c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1557c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1558bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
1559c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        mPreparedCondition.wait(mLock);
1560c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1561c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1562bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return mPrepareResult;
1563c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1564c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1565c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() {
1566c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1567bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1568bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1569bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1570bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1571bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1572bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = true;
1573c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return prepareAsync_l();
1574c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1575c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1576c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() {
1577bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1578bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1579c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1580c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
15812e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (!mQueueStarted) {
15822e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.start();
15832e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueueStarted = true;
15842e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
15852e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
1586bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mFlags |= PREPARING;
1587c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = new AwesomeEvent(
1588c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onPrepareAsyncEvent);
1589c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1590c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mQueue.postEvent(mAsyncPrepareEvent);
1591c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1592c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return OK;
1593c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1594c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1595bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() {
1596e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    sp<DataSource> dataSource;
1597e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
15988cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber    if (!strncasecmp("http://", mUri.string(), 7)
15998cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber            || !strncasecmp("https://", mUri.string(), 8)) {
16001156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mConnectingDataSource = HTTPBase::Create(
16011156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                (mFlags & INCOGNITO)
16021156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                    ? HTTPBase::kFlagIncognito
16031156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                    : 0);
1604e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1605e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.unlock();
160679f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber        status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders);
1607e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.lock();
1608e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1609e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (err != OK) {
1610e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource.clear();
1611e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1612e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            LOGI("mConnectingDataSource->connect() returned %d", err);
1613e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            return err;
1614e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
1615e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
16160a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0
16170a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        mCachedSource = new NuCachedSource2(
16180a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber                new ThrottledSource(
16190a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber                    mConnectingDataSource, 50 * 1024 /* bytes/sec */));
16200a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else
16210a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        mCachedSource = new NuCachedSource2(mConnectingDataSource);
16220a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif
1623e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mConnectingDataSource.clear();
16240a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
16250a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        dataSource = mCachedSource;
1626ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
1627ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        // We're going to prefill the cache before trying to instantiate
1628ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        // the extractor below, as the latter is an operation that otherwise
1629ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        // could block on the datasource for a significant amount of time.
1630ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        // During that time we'd be unable to abort the preparation phase
1631ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        // without this prefill.
1632ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
1633ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        mLock.unlock();
1634ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
1635ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        for (;;) {
1636ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            status_t finalStatus;
1637ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            size_t cachedDataRemaining =
1638ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber                mCachedSource->approxDataRemaining(&finalStatus);
1639ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
1640ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes
1641ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber                    || (mFlags & PREPARE_CANCELLED)) {
1642ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber                break;
1643ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            }
1644ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
1645ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            usleep(200000);
1646ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        }
1647ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
1648ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        mLock.lock();
1649ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
1650ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        if (mFlags & PREPARE_CANCELLED) {
1651ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            LOGI("Prepare cancelled while waiting for initial cache fill.");
1652ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            return UNKNOWN_ERROR;
1653ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        }
1654cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    } else if (!strncasecmp("rtsp://", mUri.string(), 7)) {
1655cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        if (mLooper == NULL) {
1656cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mLooper = new ALooper;
1657a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber            mLooper->setName("rtsp");
1658cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mLooper->start();
1659cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
1660cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        mRTSPController = new ARTSPController(mLooper);
1661f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        mConnectingRTSPController = mRTSPController;
1662f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber
1663f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        mLock.unlock();
1664cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        status_t err = mRTSPController->connect(mUri.string());
1665f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        mLock.lock();
1666f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber
1667f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        mConnectingRTSPController.clear();
1668cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
1669cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        LOGI("ARTSPController::connect returned %d", err);
1670cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
1671cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        if (err != OK) {
1672cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mRTSPController.clear();
1673cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            return err;
1674cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
1675e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
1676cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        sp<MediaExtractor> extractor = mRTSPController.get();
1677e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber        return setDataSource_l(extractor);
1678e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    } else {
1679e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
1680e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
1681bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1682bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (dataSource == NULL) {
1683bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1684bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1685bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1686bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
1687bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1688bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (extractor == NULL) {
1689bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1690bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1691bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1692b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang    dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient);
1693b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang
1694b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    if (mDecryptHandle != NULL) {
16958f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        CHECK(mDrmManagerClient);
1696b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        if (RightsStatus::RIGHTS_VALID == mDecryptHandle->status) {
1697b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            if (DecryptApiType::WV_BASED == mDecryptHandle->decryptApiType) {
1698b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang                LOGD("Setting mCachedSource to NULL for WVM\n");
1699b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang                mCachedSource.clear();
1700b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            }
1701b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        } else {
1702b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE);
1703b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        }
1704dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
1705dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
1706bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return setDataSource_l(extractor);
1707bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
1708bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
170988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) {
171088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(err != OK);
171188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
171288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    if (mIsAsyncPrepare) {
171388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
171488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    }
171588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
171688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPrepareResult = err;
17176a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber    mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED);
171888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAsyncPrepareEvent = NULL;
171988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPreparedCondition.broadcast();
172088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
172188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
1722e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static
1723e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) {
1724e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie);
1725e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
1726e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    return (me->mFlags & PREPARE_CANCELLED) == 0;
1727e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber}
1728e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
1729c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() {
17308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    Mutex::Autolock autoLock(mLock);
1731bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
17328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mFlags & PREPARE_CANCELLED) {
17338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        LOGI("prepare was cancelled before doing anything");
17348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        abortPrepare(UNKNOWN_ERROR);
17358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return;
17368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
1737e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
17388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mUri.size() > 0) {
17398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = finishSetDataSource_l();
1740bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
17418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
17428650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
17438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
1744bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
17458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
1746bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
17478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mVideoTrack != NULL && mVideoSource == NULL) {
17488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initVideoDecoder();
17491322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
17508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
17518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
17528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
17531322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
17548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
17551322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
17568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mAudioTrack != NULL && mAudioSource == NULL) {
17578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initAudioDecoder();
17581322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
17598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
17608650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
17618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
17621322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
1763c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1764c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
17656a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber    mFlags |= PREPARING_CONNECTED;
17666a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
17678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mCachedSource != NULL || mRTSPController != NULL) {
17688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        postBufferingEvent_l();
17698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    } else {
17708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        finishAsyncPrepare_l();
17718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
17728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
1773c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
17748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() {
1775bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mIsAsyncPrepare) {
17765daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber        if (mVideoSource == NULL) {
1777bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0);
1778bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        } else {
17795daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber            notifyVideoSize_l();
1780bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
1781c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1782bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        notifyListener_l(MEDIA_PREPARED);
1783bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1784c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1785bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPrepareResult = OK;
17866a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber    mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED);
1787bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mFlags |= PREPARED;
1788c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = NULL;
1789bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPreparedCondition.broadcast();
1790c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1791c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1792acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const {
1793acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return mExtractorFlags;
1794acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber}
1795acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
1796ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioEOS() {
1797ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber    postCheckAudioStatusEvent_l();
1798ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
1799ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
1800ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() {
1801ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber    postCheckAudioStatusEvent_l();
1802ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
1803ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
1804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}  // namespace android
1805