AwesomePlayer.cpp revision 80ec929862bcfe8582984f3a28e7a4ca5f4f27bb
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
176c00983982d167bdb348c437f0480a480f38696cGlenn Kasten#undef DEBUG_HDCP
18eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten
19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0
20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer"
21bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h>
22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
23988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h>
24988e3f0b2c74095deae580157c57935a98573052Andreas Huber
25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/ARTSPController.h"
26bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h"
27681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/DRMExtractor.h"
28733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h"
290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h"
300a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h"
31bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h"
32681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/WVMExtractor.h"
33bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
34965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang#include "timedtext/TimedTextPlayer.h"
35965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang
364844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h>
377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h>
387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h>
39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h>
40e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h>
41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h>
42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h>
43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h>
44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h>
45717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h>
46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h>
47bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h>
48bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h>
49bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h>
50717826ececd8d39596f62418677721d70776add1Andreas Huber
515daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h>
521173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h>
542eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten#include <surfaceflinger/ISurfaceComposer.h>
553cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
56cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h>
5714acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h>
58e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
59eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#include <cutils/properties.h>
60eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten
61e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1
62e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber
63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android {
64bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll;  // 2secs
668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll;  // 10secs
67100a4408968b90e314526185d572c72ea4cc784aAndreas Huberstatic int64_t kHighWaterMarkRTSPUs = 4000000ll;  // 4secs
68ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000;
69ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000;
708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
71bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event {
72c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    AwesomeEvent(
73c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            AwesomePlayer *player,
74c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            void (AwesomePlayer::*method)())
75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        : mPlayer(player),
76c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber          mMethod(method) {
77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected:
80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual ~AwesomeEvent() {}
81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
83c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        (mPlayer->*mMethod)();
84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate:
87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomePlayer *mPlayer;
88c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    void (AwesomePlayer::*mMethod)();
89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
90bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent(const AwesomeEvent &);
91bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent &operator=(const AwesomeEvent &);
92bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber};
93bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
94733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer {
95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(
961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta)
971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        : mTarget(new SoftwareRenderer(nativeWindow, meta)) {
98733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
99733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
100733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual void render(MediaBuffer *buffer) {
101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        render((const uint8_t *)buffer->data() + buffer->range_offset(),
102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber               buffer->range_length());
103fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
104fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
105fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    void render(const void *data, size_t size) {
106fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mTarget->render(data, size, NULL);
107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected:
110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual ~AwesomeLocalRenderer() {
111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        delete mTarget;
112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        mTarget = NULL;
113733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
114733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
115733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate:
1160a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    SoftwareRenderer *mTarget;
117988e3f0b2c74095deae580157c57935a98573052Andreas Huber
118733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(const AwesomeLocalRenderer &);
119733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
120733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber};
121733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
1226a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer {
123ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    AwesomeNativeWindowRenderer(
124ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            const sp<ANativeWindow> &nativeWindow,
125ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            int32_t rotationDegrees)
1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        : mNativeWindow(nativeWindow) {
127ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        applyRotation(rotationDegrees);
1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1306a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual void render(MediaBuffer *buffer) {
131593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        int64_t timeUs;
132593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs));
133593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        native_window_set_buffers_timestamp(mNativeWindow.get(), timeUs * 1000);
1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        status_t err = mNativeWindow->queueBuffer(
1356a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                mNativeWindow.get(), buffer->graphicBuffer().get());
1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        if (err != 0) {
1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            LOGE("queueBuffer failed with error %s (%d)", strerror(-err),
1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                    -err);
1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            return;
1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        }
1416a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        sp<MetaData> metaData = buffer->meta_data();
1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        metaData->setInt32(kKeyRendered, 1);
1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1466a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected:
1476a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual ~AwesomeNativeWindowRenderer() {}
1486a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1496a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate:
1506a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<ANativeWindow> mNativeWindow;
1516a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    void applyRotation(int32_t rotationDegrees) {
153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        uint32_t transform;
154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        switch (rotationDegrees) {
155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 0: transform = 0; break;
156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 90: transform = HAL_TRANSFORM_ROT_90; break;
157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 180: transform = HAL_TRANSFORM_ROT_180; break;
158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 270: transform = HAL_TRANSFORM_ROT_270; break;
159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            default: transform = 0; break;
160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
162ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        if (transform) {
163ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            CHECK_EQ(0, native_window_set_buffers_transform(
164ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                        mNativeWindow.get(), transform));
165ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
166ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
167ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
1686a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &);
1696a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer &operator=(
1706a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            const AwesomeNativeWindowRenderer &);
1716a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis};
1726a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage
1747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) {
1757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    sp<IBinder> binder =
1767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        defaultServiceManager()->getService(String16("media.player"));
1777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
1787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    CHECK(service.get() != NULL);
1797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    service->addBatteryData(params);
1817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang}
182e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
1837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang////////////////////////////////////////////////////////////////////////////////
184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer()
1852e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    : mQueueStarted(false),
1869b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mUIDValid(false),
1872e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber      mTimeSource(NULL),
188fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber      mVideoRendererIsPreview(false),
189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mAudioPlayer(NULL),
190b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong      mDisplayWidth(0),
191b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong      mDisplayHeight(0),
192bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber      mFlags(0),
193acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber      mExtractorFlags(0),
1947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber      mVideoBuffer(NULL),
195150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber      mDecryptHandle(NULL),
1967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang      mLastVideoTimeUs(-1),
1977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang      mTextPlayer(NULL) {
198e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    CHECK_EQ(mClient.connect(), (status_t)OK);
199bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
200bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    DataSource::RegisterDefaultSniffers();
201bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
202c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
204c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone);
205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
206c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate);
20766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
208145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate);
209145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoEventPending = false;
210c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
211c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mCheckAudioStatusEvent = new AwesomeEvent(
212c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onCheckAudioStatus);
213c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2141862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() {
2202e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mQueueStarted) {
2212e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.stop();
2222e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mClient.disconnect();
227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
22966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) {
230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mVideoEvent->eventID());
231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mStreamDoneEvent->eventID());
233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
2341862a33b246249630b654182afb5914da3480d4cAndreas Huber    mQueue.cancelEvent(mCheckAudioStatusEvent->eventID());
2351862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
236145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mQueue.cancelEvent(mVideoLagEvent->eventID());
237145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = false;
23866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
23966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (!keepBufferingGoing) {
24066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mQueue.cancelEvent(mBufferingEvent->eventID());
24166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mBufferingEventPending = false;
24266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2450726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) {
246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mListener = listener;
248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid AwesomePlayer::setUID(uid_t uid) {
2519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    LOGI("AwesomePlayer running on behalf of uid %d", uid);
2529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
2539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
2549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
2559b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
2569b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
2575561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource(
2585561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
2607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(uri, headers);
2617b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2637b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2647b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
266bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
267bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri = uri;
26866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
269bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (headers) {
270bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mUriHeaders = *headers;
2717314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2727314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log"));
2737314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        if (index >= 0) {
2747314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            // Browser is in "incognito" mode, suppress logging URLs.
2757314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2767314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            // This isn't something that should be passed to the server.
2777314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            mUriHeaders.removeItemsAt(index);
2787314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
279a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(INCOGNITO, SET);
2807314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        }
2817314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    }
2827314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2837314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    if (!(mFlags & INCOGNITO)) {
2847314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        LOGI("setDataSource_l('%s')", mUri.string());
2857314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    } else {
2867314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        LOGI("setDataSource_l(URL suppressed)");
28766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
28866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
289bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // The actual work will be done during preparation in the call to
290bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // ::finishSetDataSource_l to avoid blocking the calling thread in
291bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // setDataSource for any significant time.
29266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
293a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
294a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
295a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFd = -1;
296a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mURI = mUri;
297a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
298a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
299bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return OK;
300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource(
303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int fd, int64_t offset, int64_t length) {
304bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3087b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<DataSource> dataSource = new FileSource(fd, offset, length);
309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    status_t err = dataSource->initCheck();
311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3167b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource = dataSource;
3177b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
318a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
319a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
320a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFd = fd;
321a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mURI = String8();
322a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
323a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
3247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(dataSource);
3257b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
3267b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
327e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) {
32885704836f33a199d7e442a23db82abbd5620d35dAndreas Huber    return INVALID_OPERATION;
329e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
330e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
3317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
3327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const sp<DataSource> &dataSource) {
3337b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (extractor == NULL) {
336bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
338bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
339b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang    dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient);
3408f64134f749e4f7861a08a3063450fc714c4651dGloria Wang    if (mDecryptHandle != NULL) {
3418f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        CHECK(mDrmManagerClient);
3428f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) {
3437340743ce30766af6334bbd9acf813eb66dd5a60Gloria Wang            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
3448f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        }
345dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
346dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return setDataSource_l(extractor);
348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
3517fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // Attempt to approximate overall stream bitrate by summing all
3527fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // tracks' individual bitrates, if not all of them advertise bitrate,
3537fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // we have to fail.
3547fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3557fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t totalBitRate = 0;
3567fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3577fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
3587fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
3597fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3607fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        int32_t bitrate;
3617fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        if (!meta->findInt32(kKeyBitRate, &bitrate)) {
362a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            const char *mime;
363a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            CHECK(meta->findCString(kKeyMIMEType, &mime));
364a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            LOGW("track of type '%s' does not publish bitrate", mime);
365a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
3667fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            totalBitRate = -1;
3677fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            break;
3687fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        }
3697fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3707fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        totalBitRate += bitrate;
3717fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
3727fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3737fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = totalBitRate;
3747fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3757fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    LOGV("mBitrate = %lld bits/sec", mBitrate);
3767fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
377a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
378a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
379a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mBitrate = mBitrate;
380a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mTracks.clear();
381a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mAudioTrackIndex = -1;
382a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoTrackIndex = -1;
383a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
384a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
385bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveAudio = false;
386bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveVideo = false;
387bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const char *mime;
391bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
392bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
39488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setVideoSource(extractor->getTrack(i));
39588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveVideo = true;
396b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong
397b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            // Set the presentation/display size
398b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            int32_t displayWidth, displayHeight;
399b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth);
400b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            if (success) {
401b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                success = meta->findInt32(kKeyDisplayHeight, &displayHeight);
402b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            }
403b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            if (success) {
404b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                mDisplayWidth = displayWidth;
405b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                mDisplayHeight = displayHeight;
406b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            }
407b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong
408a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
409a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                Mutex::Autolock autoLock(mStatsLock);
410a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mVideoTrackIndex = mStats.mTracks.size();
411a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mTracks.push();
412a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                TrackStat *stat =
413a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex);
414a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                stat->mMIME = mime;
415a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            }
416bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
41788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setAudioSource(extractor->getTrack(i));
41888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveAudio = true;
4198ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber
420a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
421a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                Mutex::Autolock autoLock(mStatsLock);
422a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mAudioTrackIndex = mStats.mTracks.size();
423a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mTracks.push();
424a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                TrackStat *stat =
425a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex);
426a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                stat->mMIME = mime;
427a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            }
428a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
4296954535ba64374e4e941cd83019a7af53edfb098Andreas Huber            if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
4306954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // Only do this for vorbis audio, none of the other audio
4316954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // formats even support this ringtone specific hack and
4326954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // retrieving the metadata on some extractors may turn out
4336954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // to be very expensive.
4346954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                sp<MetaData> fileMeta = extractor->getMetaData();
4356954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                int32_t loop;
4366954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                if (fileMeta != NULL
4376954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                        && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) {
438a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    modifyFlags(AUTO_LOOPING, SET);
4396954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                }
4408ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber            }
4417a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        } else if (!strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP)) {
4427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            addTextSource(extractor->getTrack(i));
443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
445bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
446acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    if (!haveAudio && !haveVideo) {
447acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return UNKNOWN_ERROR;
448acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
449acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
450acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = extractor->flags();
451acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
452acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
453bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
454bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
455bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() {
456bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
457bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
458bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
459bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
460bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() {
461b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    mDisplayWidth = 0;
462b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    mDisplayHeight = 0;
46365a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber
464dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
465dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
466dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::STOP, 0);
467dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDecryptHandle = NULL;
468dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient = NULL;
469dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
470dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
4717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mFlags & PLAYING) {
4727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
4737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
4747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            params |= IMediaPlayerService::kBatteryDataTrackAudio;
4757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        }
4767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        if (mVideoSource != NULL) {
4777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            params |= IMediaPlayerService::kBatteryDataTrackVideo;
4787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        }
4797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        addBatteryData(params);
4807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
4817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
482e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mFlags & PREPARING) {
483a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(PREPARE_CANCELLED, SET);
484e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (mConnectingDataSource != NULL) {
485e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            LOGI("interrupting the connection process");
486e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource->disconnect();
487f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        } else if (mConnectingRTSPController != NULL) {
488f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber            LOGI("interrupting the connection process");
489f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber            mConnectingRTSPController->disconnect();
490e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
4916a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
4926a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        if (mFlags & PREPARING_CONNECTED) {
4936a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // We are basically done preparing, we're just buffering
4946a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // enough data to start playback, we can safely interrupt that.
4956a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            finishAsyncPrepare_l();
4966a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        }
497e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
498e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
499bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
500bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mPreparedCondition.wait(mLock);
501bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
502bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
503bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    cancelPlayerEvents();
504bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
505681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    mWVMExtractor.clear();
5060a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mCachedSource.clear();
50788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack.clear();
50888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack.clear();
50988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
5107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // Shutdown audio first, so that the respone to the reset request
5117b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // appears to happen instantaneously as far as the user is concerned
5127b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // If we did this later, audio would continue playing while we
5137b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // shutdown the video-related resources and the player appear to
5147b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // not be as responsive to a reset request.
515e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mAudioPlayer == NULL && mAudioSource != NULL) {
516e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // If we had an audio player, it would have effectively
517e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // taken possession of the audio source and stopped it when
518e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // _it_ is stopped. Otherwise this is still our responsibility.
519e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mAudioSource->stop();
520e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
5217b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioSource.clear();
5227b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5237b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mTimeSource = NULL;
5247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5257b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete mAudioPlayer;
5267b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioPlayer = NULL;
5277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5287a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if (mTextPlayer != NULL) {
5297a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        delete mTextPlayer;
5307a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        mTextPlayer = NULL;
5317a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
5327a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
533b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber    mVideoRenderer.clear();
534b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber
535cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    if (mRTSPController != NULL) {
536cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        mRTSPController->disconnect();
537cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        mRTSPController.clear();
538cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    }
539cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber
540bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
541150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        shutdownVideoDecoder_l();
542bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
543bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
544bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mDurationUs = -1;
545a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(0, ASSIGN);
546acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = 0;
547bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mTimeSourceDeltaUs = 0;
548bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoTimeUs = 0;
549bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
55064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = NO_SEEK;
5511321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    mSeekNotificationSent = false;
552bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = 0;
55366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
554bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri.setTo("");
555bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUriHeaders.clear();
5567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource.clear();
5587b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5597fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = -1;
560150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mLastVideoTimeUs = -1;
561a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
562a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
563a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
564a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFd = -1;
565a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mURI = String8();
566a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mBitrate = -1;
567a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mAudioTrackIndex = -1;
568a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoTrackIndex = -1;
569a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mNumVideoFramesDecoded = 0;
570a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mNumVideoFramesDropped = 0;
571a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoWidth = -1;
572a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoHeight = -1;
573a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFlags = 0;
574a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mTracks.clear();
575a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
576a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
577bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
578bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
579c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) {
5800726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber    if (mListener != NULL) {
5810726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        sp<MediaPlayerBase> listener = mListener.promote();
5820726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
5830726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        if (listener != NULL) {
584c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            listener->sendEvent(msg, ext1, ext2);
58566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        }
58666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
58766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
58866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
5897fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) {
590c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t size;
5917fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mDurationUs >= 0 && mCachedSource != NULL
5927fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            && mCachedSource->getSize(&size) == OK) {
5937fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = size * 8000000ll / mDurationUs;  // in bits/sec
5947fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
5957fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
5967fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5977fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mBitrate >= 0) {
5987fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = mBitrate;
5997fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
6007fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
6017fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6027fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    *bitrate = 0;
6037fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6047fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    return false;
6057fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber}
6067fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable.
6088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) {
6097fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t bitrate;
6108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
6118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mRTSPController != NULL) {
6128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        *durationUs = mRTSPController->getQueueDurationUs(eos);
6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return true;
6147fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    } else if (mCachedSource != NULL && getBitrate(&bitrate)) {
6151bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        status_t finalStatus;
6161bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        *durationUs = cachedDataRemaining * 8000000ll / bitrate;
6181bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        *eos = (finalStatus != OK);
6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return true;
620681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else if (mWVMExtractor != NULL) {
621681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        status_t finalStatus;
622681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        *durationUs = mWVMExtractor->getCachedDurationUs(&finalStatus);
623681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        *eos = (finalStatus != OK);
624681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        return true;
6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
6278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    return false;
6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
6298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
63034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() {
63134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    if (mCachedSource != NULL) {
63234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber        mCachedSource->resumeFetchingIfNecessary();
63334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    }
63434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber}
63534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
636145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() {
637145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    Mutex::Autolock autoLock(mLock);
638145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (!mVideoLagEventPending) {
639145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        return;
640145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
641145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = false;
642145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
643145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs();
644145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    int64_t videoLateByUs = audioTimeUs - mVideoTimeUs;
645145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
6465dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) {
647145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        LOGV("video late by %lld ms.", videoLateByUs / 1000ll);
648145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
649145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        notifyListener_l(
650145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                MEDIA_INFO,
651145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                MEDIA_INFO_VIDEO_TRACK_LAGGING,
652145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                videoLateByUs / 1000ll);
653145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
654145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
655145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    postVideoLagEvent_l();
656145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber}
657145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
65866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() {
65966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    Mutex::Autolock autoLock(mLock);
660d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mBufferingEventPending) {
661d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
662d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
66366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
66466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
6658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mCachedSource != NULL) {
6661bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        status_t finalStatus;
6671bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
6681bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        bool eos = (finalStatus != OK);
669c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (eos) {
6711bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney            if (finalStatus == ERROR_END_OF_STREAM) {
6721bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney                notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
6731bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney            }
67483977eb230d829cfe520f55d7977037a904ce548Andreas Huber            if (mFlags & PREPARING) {
67583977eb230d829cfe520f55d7977037a904ce548Andreas Huber                LOGV("cache has reached EOS, prepare is done.");
67683977eb230d829cfe520f55d7977037a904ce548Andreas Huber                finishAsyncPrepare_l();
67783977eb230d829cfe520f55d7977037a904ce548Andreas Huber            }
6788650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        } else {
6797fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            int64_t bitrate;
6807fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            if (getBitrate(&bitrate)) {
6818650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                size_t cachedSize = mCachedSource->cachedSize();
6828650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate;
683c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6848650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
6858650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if (percentage > 100) {
6868650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    percentage = 100;
6878650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
688c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
6908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else {
6918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // We don't know the bitrate of the stream, use absolute size
6928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // limits to maintain the cache.
6938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
6948650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if ((mFlags & PLAYING) && !eos
6958650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        && (cachedDataRemaining < kLowWaterMarkBytes)) {
6968650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    LOGI("cache is running low (< %d) , pausing.",
6978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                         kLowWaterMarkBytes);
698a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    modifyFlags(CACHE_UNDERRUN, SET);
6998650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    pause_l();
70034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber                    ensureCacheIsFetching_l();
7015b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong                    sendCacheStats();
7028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
7038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) {
7048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    if (mFlags & CACHE_UNDERRUN) {
7058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        LOGI("cache has filled up (> %d), resuming.",
7068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
707a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                        modifyFlags(CACHE_UNDERRUN, CLEAR);
7088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        play_l();
7098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
7108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    } else if (mFlags & PREPARING) {
7118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        LOGV("cache has filled up (> %d), prepare is done",
7128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
7138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        finishAsyncPrepare_l();
7148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    }
7158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
7168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            }
7178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        }
718681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else if (mWVMExtractor != NULL) {
719681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        status_t finalStatus;
720681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
721681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        int64_t cachedDurationUs
722681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            = mWVMExtractor->getCachedDurationUs(&finalStatus);
723681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
724681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        bool eos = (finalStatus != OK);
725681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
726681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (eos) {
727681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (finalStatus == ERROR_END_OF_STREAM) {
728681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
729681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
730681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (mFlags & PREPARING) {
731681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                LOGV("cache has reached EOS, prepare is done.");
732681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                finishAsyncPrepare_l();
733681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
734681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        } else {
735681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
736681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (percentage > 100) {
737681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                percentage = 100;
738681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
739681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
740681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
741681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
7422415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
7432415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber
7448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    int64_t cachedDurationUs;
7452a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber    bool eos;
7468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (getCachedDuration_l(&cachedDurationUs, &eos)) {
74734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber        LOGV("cachedDurationUs = %.2f secs, eos=%d",
74834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber             cachedDurationUs / 1E6, eos);
74934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
750100a4408968b90e314526185d572c72ea4cc784aAndreas Huber        int64_t highWaterMarkUs =
751100a4408968b90e314526185d572c72ea4cc784aAndreas Huber            (mRTSPController != NULL) ? kHighWaterMarkRTSPUs : kHighWaterMarkUs;
752100a4408968b90e314526185d572c72ea4cc784aAndreas Huber
7538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if ((mFlags & PLAYING) && !eos
7548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                && (cachedDurationUs < kLowWaterMarkUs)) {
7558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            LOGI("cache is running low (%.2f secs) , pausing.",
7568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                 cachedDurationUs / 1E6);
757a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(CACHE_UNDERRUN, SET);
7588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            pause_l();
75934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber            ensureCacheIsFetching_l();
7605b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            sendCacheStats();
7618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
762100a4408968b90e314526185d572c72ea4cc784aAndreas Huber        } else if (eos || cachedDurationUs > highWaterMarkUs) {
7638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            if (mFlags & CACHE_UNDERRUN) {
7648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                LOGI("cache has filled up (%.2f secs), resuming.",
7658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
766a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(CACHE_UNDERRUN, CLEAR);
7678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                play_l();
7688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
7698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else if (mFlags & PREPARING) {
7708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                LOGV("cache has filled up (%.2f secs), prepare is done",
7718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
7728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                finishAsyncPrepare_l();
7732a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber            }
7742a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber        }
7750a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
7760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
7770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    postBufferingEvent_l();
7780726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber}
7790726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
7805b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongvoid AwesomePlayer::sendCacheStats() {
7815b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    sp<MediaPlayerBase> listener = mListener.promote();
782b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong    if (listener != NULL && mCachedSource != NULL) {
7835b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        int32_t kbps = 0;
7845b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        status_t err = mCachedSource->getEstimatedBandwidthKbps(&kbps);
7855b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        if (err == OK) {
7865b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            listener->sendEvent(
7875b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong                MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps);
7885b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        }
7895b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    }
7905b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong}
7915b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong
792bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() {
793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    // Posted whenever any stream finishes playing.
794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
796d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mStreamDoneEventPending) {
797d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
798d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
801ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber    if (mStreamDoneStatus != ERROR_END_OF_STREAM) {
8025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        LOGV("MEDIA_ERROR %d", mStreamDoneStatus);
8035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(
8055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber                MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
8065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
807b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
8085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
809a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AT_EOS, SET);
8105d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
8115d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
8125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    const bool allDone =
8145d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS))
8155d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber            && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS));
8165d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8175d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!allDone) {
8185d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
8195d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
8205d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8218ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    if (mFlags & (LOOPING | AUTO_LOOPING)) {
822bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        seekTo_l(0);
823bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
824a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        if (mVideoSource != NULL) {
825bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            postVideoEvent_l();
826bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
827bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
8285d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        LOGV("MEDIA_PLAYBACK_COMPLETE");
8295d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
830bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
831b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
8322e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
833a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AT_EOS, SET);
834bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
835bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
836bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
837bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() {
838bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
8390a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
840a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(CACHE_UNDERRUN, CLEAR);
8410a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
8427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return play_l();
8437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
844bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
8457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() {
846a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(SEEK_PREVIEW, CLEAR);
8472b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
848bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & PLAYING) {
849bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
850bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
851bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
852bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (!(mFlags & PREPARED)) {
853bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        status_t err = prepare_l();
854bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
855bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        if (err != OK) {
856bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            return err;
857bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
858bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
859bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
860a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PLAYING, SET);
861a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(FIRST_FRAME, SET);
862bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
863c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang    if (mDecryptHandle != NULL) {
864c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        int64_t position;
865c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        getPosition(&position);
866c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
867c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang                Playback::START, position / 1000);
868c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang    }
869c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang
870bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
871bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mAudioPlayer == NULL) {
872bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mAudioSink != NULL) {
873ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber                mAudioPlayer = new AudioPlayer(mAudioSink, this);
874bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mAudioPlayer->setSource(mAudioSource);
875e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
876f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mTimeSource = mAudioPlayer;
87788c030e0e0152791ff74f90249f55fce01371198Andreas Huber
878b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                // If there was a seek request before we ever started,
879b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                // honor the request now.
880b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                // Make sure to do this before starting the audio player
881b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                // to avoid a race condition.
882b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                seekAudioIfNecessary_l();
883f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            }
884f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
88588c030e0e0152791ff74f90249f55fce01371198Andreas Huber
886f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        CHECK(!(mFlags & AUDIO_RUNNING));
887c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang
888f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (mVideoSource == NULL) {
8895442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            // We don't want to post an error notification at this point,
8905442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            // the error returned from MediaPlayer::start() will suffice.
8915442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber
8925442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            status_t err = startAudioPlayer_l(
8935442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber                    false /* sendErrorNotification */);
894bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
895f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            if (err != OK) {
896f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                delete mAudioPlayer;
897f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mAudioPlayer = NULL;
898bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
899a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags((PLAYING | FIRST_FRAME), CLEAR);
9001862a33b246249630b654182afb5914da3480d4cAndreas Huber
901f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                if (mDecryptHandle != NULL) {
902f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                    mDrmManagerClient->setPlaybackStatus(
903f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                            mDecryptHandle, Playback::STOP, 0);
904f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                }
905f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
906f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                return err;
907bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
908bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
911bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mTimeSource == NULL && mAudioPlayer == NULL) {
9125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSource = &mSystemTimeSource;
913bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
914bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
915bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
916a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        // Kick off video playback
917a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        postVideoEvent_l();
918145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
919145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        if (mAudioSource != NULL && mVideoSource != NULL) {
920145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber            postVideoLagEvent_l();
921145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        }
922bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9242e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mFlags & AT_EOS) {
9252e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // Legacy behaviour, if a stream finishes playing and then
9262e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // is started again, we play from the start...
9272e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        seekTo_l(0);
9282e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
9292e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
9307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted
9317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        | IMediaPlayerService::kBatteryDataTrackDecoder;
9327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
9337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackAudio;
9347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
9357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mVideoSource != NULL) {
9367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackVideo;
9377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
9387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    addBatteryData(params);
9397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
940bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
941bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
942bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9435442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huberstatus_t AwesomePlayer::startAudioPlayer_l(bool sendErrorNotification) {
944f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    CHECK(!(mFlags & AUDIO_RUNNING));
945f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
946f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioSource == NULL || mAudioPlayer == NULL) {
947f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        return OK;
948f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
949f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
950f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (!(mFlags & AUDIOPLAYER_STARTED)) {
951a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AUDIOPLAYER_STARTED, SET);
952f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
953c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        bool wasSeeking = mAudioPlayer->isSeeking();
954c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
955f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        // We've already started the MediaSource in order to enable
956f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        // the prefetcher to read its data.
957f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        status_t err = mAudioPlayer->start(
958f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                true /* sourceAlreadyStarted */);
959f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
960f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (err != OK) {
9615442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            if (sendErrorNotification) {
9625442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber                notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
9635442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            }
9645442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber
965f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            return err;
966f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
967c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
968c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        if (wasSeeking) {
969c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber            CHECK(!mAudioPlayer->isSeeking());
970c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
971c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber            // We will have finished the seek while starting the audio player.
972c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber            postAudioSeekComplete_l();
973c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        }
974f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    } else {
975f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        mAudioPlayer->resume();
976f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
977f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
978a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(AUDIO_RUNNING, SET);
979f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
980f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    mWatchForAudioEOS = true;
981f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
982f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    return OK;
983f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber}
984f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
9855daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() {
9865daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
9875daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
988f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t cropLeft, cropTop, cropRight, cropBottom;
989f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    if (!meta->findRect(
990f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) {
991f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t width, height;
992f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        CHECK(meta->findInt32(kKeyWidth, &width));
993f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        CHECK(meta->findInt32(kKeyHeight, &height));
994f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
995f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropLeft = cropTop = 0;
996f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropRight = width - 1;
997f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropBottom = height - 1;
998f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
999f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        LOGV("got dimensions only %d x %d", width, height);
1000f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    } else {
1001f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        LOGV("got crop rect %d, %d, %d, %d",
1002f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber             cropLeft, cropTop, cropRight, cropBottom);
1003f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    }
1004f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
10059cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    int32_t displayWidth;
10069cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) {
10079cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong        LOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth);
10089cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong        mDisplayWidth = displayWidth;
10099cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    }
10109cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    int32_t displayHeight;
10119cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) {
10129cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong        LOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight);
10139cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong        mDisplayHeight = displayHeight;
10149cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    }
10159cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong
1016f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t usableWidth = cropRight - cropLeft + 1;
1017f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t usableHeight = cropBottom - cropTop + 1;
1018b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    if (mDisplayWidth != 0) {
1019b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong        usableWidth = mDisplayWidth;
1020b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    }
1021b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    if (mDisplayHeight != 0) {
1022b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong        usableHeight = mDisplayHeight;
1023b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    }
10245daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1025a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
1026a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
1027a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoWidth = usableWidth;
1028a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoHeight = usableHeight;
1029a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
1030a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1031ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
1032ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
1033ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
1034ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
1035ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
1036ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
1037ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (rotationDegrees == 90 || rotationDegrees == 270) {
1038ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
1039f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth);
1040ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    } else {
1041ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
1042f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight);
1043ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
10445daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
10455daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1046bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() {
10471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (mNativeWindow == NULL) {
10480a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        return;
10490a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    }
1050bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10510a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
1052bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10530a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t format;
10540a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    const char *component;
10550a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t decodedWidth, decodedHeight;
10560a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyColorFormat, &format));
10570a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findCString(kKeyDecoderComponent, &component));
10580a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
10590a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
10604844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
1061ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
1062ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
1063ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
1064ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
1065ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
1066ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
10670a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    mVideoRenderer.clear();
10684844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
10690a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // Must ensure that mVideoRenderer's destructor is actually executed
10700a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // before creating a new one.
10710a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    IPCThreadState::self()->flushCommands();
10720a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber
1073bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    if (USE_SURFACE_ALLOC
1074bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            && !strncmp(component, "OMX.", 4)
1075bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            && strncmp(component, "OMX.google.", 11)) {
10760a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Hardware decoders avoid the CPU color conversion by decoding
10770a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // directly to ANativeBuffers, so we must use a renderer that
10780a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // just pushes those buffers to the ANativeWindow.
1079ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        mVideoRenderer =
10801173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees);
10810a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    } else {
10820a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Other decoders are instantiated locally and as a consequence
10830a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // allocate their buffers in local address space.  This renderer
10840a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // then performs a color conversion and copy to get the data
10850a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // into the ANativeBuffer.
10861173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta);
1087bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1088bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1089bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1090bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() {
1091bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
10920a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1093a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(CACHE_UNDERRUN, CLEAR);
10940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1095bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause_l();
1096bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1097bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1098b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) {
1099bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!(mFlags & PLAYING)) {
1100bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
110366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    cancelPlayerEvents(true /* keepBufferingGoing */);
1104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1105f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) {
1106b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        if (at_eos) {
1107b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // If we played the audio stream to completion we
1108b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // want to make sure that all samples remaining in the audio
1109b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // track's queue are played out.
1110b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioPlayer->pause(true /* playPendingSamples */);
1111b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        } else {
1112b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioPlayer->pause();
1113b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        }
1114f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
1115a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AUDIO_RUNNING, CLEAR);
1116bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1117bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
11187a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if (mFlags & TEXTPLAYER_STARTED) {
11197a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        mTextPlayer->pause();
1120a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(TEXT_RUNNING, CLEAR);
11217a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
11227a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1123a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PLAYING, CLEAR);
1124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1125dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
1126dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1127dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                Playback::PAUSE, 0);
1128dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
1129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
11307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
11317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
11327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackAudio;
11337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
11347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mVideoSource != NULL) {
11357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackVideo;
11367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
11377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
11387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    addBatteryData(params);
11397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1140bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1142bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1143bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const {
11440a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN);
1145bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1146bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
11475daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) {
11485daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    Mutex::Autolock autoLock(mLock);
11495daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
11505daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    mSurface = surface;
1151150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    setNativeWindow_l(surface);
11521173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
11531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
11541173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
11551173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    Mutex::Autolock autoLock(mLock);
11561173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
11571173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    mSurface.clear();
11581173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (surfaceTexture != NULL) {
1159150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        setNativeWindow_l(new SurfaceTextureClient(surfaceTexture));
116080ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang    } else {
116180ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang        setNativeWindow_l(NULL);
11621173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
1163150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber}
11641173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
1165150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::shutdownVideoDecoder_l() {
1166150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mVideoBuffer) {
1167150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mVideoBuffer->release();
1168150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mVideoBuffer = NULL;
1169150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1170150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1171150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoSource->stop();
1172150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1173150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // The following hack is necessary to ensure that the OMX
1174150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // component is completely released by the time we may try
1175150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // to instantiate it again.
1176150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    wp<MediaSource> tmp = mVideoSource;
1177150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoSource.clear();
1178150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    while (tmp.promote() != NULL) {
1179150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        usleep(1000);
1180150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1181150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    IPCThreadState::self()->flushCommands();
11829eff287f4f59d6a0c9ca1d5dd8a7bb6e64acf5a4James Dong    LOGI("video decoder shutdown completed");
1183150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber}
1184150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1185150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
1186150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mNativeWindow = native;
1187150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1188150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mVideoSource == NULL) {
1189150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        return;
1190150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1191150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1192150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    LOGI("attempting to reconfigure to use new surface");
1193150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1194150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    bool wasPlaying = (mFlags & PLAYING) != 0;
1195150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1196150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    pause_l();
1197150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoRenderer.clear();
1198150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1199150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    shutdownVideoDecoder_l();
1200150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1201150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    CHECK_EQ(initVideoDecoder(), (status_t)OK);
1202150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1203150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mLastVideoTimeUs >= 0) {
1204150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mSeeking = SEEK;
1205150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mSeekNotificationSent = true;
1206150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mSeekTimeUs = mLastVideoTimeUs;
1207a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR);
1208150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1209150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1210150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (wasPlaying) {
1211150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        play_l();
1212150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
12135daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
12145daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink(
1216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const sp<MediaPlayerBase::AudioSink> &audioSink) {
1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mAudioSink = audioSink;
1220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) {
1223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1225a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(LOOPING, CLEAR);
1226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (shouldLoop) {
1228a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(LOOPING, SET);
1229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) {
12352415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    Mutex::Autolock autoLock(mMiscStateLock);
1236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mDurationUs < 0) {
1238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
1239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *durationUs = mDurationUs;
1242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) {
12478d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    if (mRTSPController != NULL) {
12488d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber        *positionUs = mRTSPController->getNormalPlayTimeUs();
12498d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    }
125064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    else if (mSeeking != NO_SEEK) {
1251dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber        *positionUs = mSeekTimeUs;
12525dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    } else if (mVideoSource != NULL
12535dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber            && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) {
12542415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        Mutex::Autolock autoLock(mMiscStateLock);
1255bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mVideoTimeUs;
1256bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else if (mAudioPlayer != NULL) {
1257bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mAudioPlayer->getMediaTimeUs();
1258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
1259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = 0;
1260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1263bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) {
126670f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber    if (mExtractorFlags & MediaExtractor::CAN_SEEK) {
1267acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        Mutex::Autolock autoLock(mLock);
1268acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return seekTo_l(timeUs);
1269acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
1270acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
1271acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
1272bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1273bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12747a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wangstatus_t AwesomePlayer::setTimedTextTrackIndex(int32_t index) {
12757a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if (mTextPlayer != NULL) {
12767a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        if (index >= 0) { // to turn on a text track
12777a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            status_t err = mTextPlayer->setTimedTextTrackIndex(index);
12787a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            if (err != OK) {
12797a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang                return err;
12807a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            }
12817a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1282a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(TEXT_RUNNING, SET);
1283a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(TEXTPLAYER_STARTED, SET);
12847a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            return OK;
12857a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        } else { // to turn off the text track display
12867a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            if (mFlags  & TEXT_RUNNING) {
1287a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(TEXT_RUNNING, CLEAR);
12887a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            }
12897a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            if (mFlags  & TEXTPLAYER_STARTED) {
1290a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(TEXTPLAYER_STARTED, CLEAR);
12917a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            }
12927a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
12937a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            return mTextPlayer->setTimedTextTrackIndex(index);
12947a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        }
12957a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    } else {
12967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        return INVALID_OPERATION;
12977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
12987a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang}
12997a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
13000dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static
13010dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) {
13020dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone();
13030dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber}
13040dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber
13050dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() {
13060dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    notifyListener_l(MEDIA_SEEK_COMPLETE);
13070dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    mSeekNotificationSent = true;
13080dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber}
13090dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber
1310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) {
1311cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    if (mRTSPController != NULL) {
13120dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber        mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this);
1313cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        return OK;
1314cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    }
1315cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber
13160a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    if (mFlags & CACHE_UNDERRUN) {
1317a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(CACHE_UNDERRUN, CLEAR);
13180a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        play_l();
13190a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
13200a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
13215dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) {
13225dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // Video playback completed before, there's no pending
13235dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // video event right now. In order for this new seek
13245dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // to be honored, we need to post one.
13255dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber
13265dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        postVideoEvent_l();
13275dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    }
13285dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber
132964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = SEEK;
13301321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    mSeekNotificationSent = false;
1331bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = timeUs;
1332a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR);
1333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    seekAudioIfNecessary_l();
1335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13367a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if (mFlags & TEXTPLAYER_STARTED) {
13377a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        mTextPlayer->seekTo(mSeekTimeUs);
13387a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
13397a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
13401321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    if (!(mFlags & PLAYING)) {
13411321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        LOGV("seeking while paused, sending SEEK_COMPLETE notification"
13421321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber             " immediately.");
13431321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
13441321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
13451321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        mSeekNotificationSent = true;
13462b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
13472b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if ((mFlags & PREPARED) && mVideoSource != NULL) {
1348a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(SEEK_PREVIEW, SET);
13492b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            postVideoEvent_l();
13502b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        }
13511321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    }
13521321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
1353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1354bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1355bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1356bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() {
135764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) {
1358bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mAudioPlayer->seekTo(mSeekTimeUs);
1359bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13601862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = true;
13611862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = true;
1362dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
1363dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        if (mDecryptHandle != NULL) {
1364dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1365dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::PAUSE, 0);
1366dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1367dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::START, mSeekTimeUs / 1000);
1368dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        }
1369bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1370bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1371bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
137288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) {
137388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1374bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
137588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack = source;
137688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
137788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
13787a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wangvoid AwesomePlayer::addTextSource(sp<MediaSource> source) {
1379965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang    Mutex::Autolock autoLock(mTimedTextLock);
13807a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    CHECK(source != NULL);
13817a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
13827a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if (mTextPlayer == NULL) {
13837a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        mTextPlayer = new TimedTextPlayer(this, mListener, &mQueue);
13847a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
13857a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
13867a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    mTextPlayer->addTextSource(source);
13877a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang}
13887a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
138988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() {
139088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    sp<MetaData> meta = mAudioTrack->getFormat();
1391717826ececd8d39596f62418677721d70776add1Andreas Huber
1392717826ececd8d39596f62418677721d70776add1Andreas Huber    const char *mime;
1393717826ececd8d39596f62418677721d70776add1Andreas Huber    CHECK(meta->findCString(kKeyMIMEType, &mime));
1394717826ececd8d39596f62418677721d70776add1Andreas Huber
1395717826ececd8d39596f62418677721d70776add1Andreas Huber    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
139688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        mAudioSource = mAudioTrack;
1397717826ececd8d39596f62418677721d70776add1Andreas Huber    } else {
1398717826ececd8d39596f62418677721d70776add1Andreas Huber        mAudioSource = OMXCodec::Create(
139988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mClient.interface(), mAudioTrack->getFormat(),
1400717826ececd8d39596f62418677721d70776add1Andreas Huber                false, // createEncoder
140188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mAudioTrack);
1402717826ececd8d39596f62418677721d70776add1Andreas Huber    }
1403bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1404bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
1405bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
140688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
14072415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1408bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1409bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1410bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1411bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1412bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1413a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        status_t err = mAudioSource->start();
1414a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber
1415a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        if (err != OK) {
1416a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            mAudioSource.clear();
1417a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            return err;
1418a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        }
141981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) {
142081f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // For legacy reasons we're simply going to ignore the absence
142181f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // of an audio decoder for QCELP instead of aborting playback
142281f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // altogether.
142381f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        return OK;
142481f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    }
1425e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
1426a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mAudioSource != NULL) {
1427a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
1428a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex);
1429a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1430a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        const char *component;
1431a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if (!mAudioSource->getFormat()
1432a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                ->findCString(kKeyDecoderComponent, &component)) {
1433a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            component = "none";
1434a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
1435a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1436a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        stat->mDecoderName = component;
1437a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
1438a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1439bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mAudioSource != NULL ? OK : UNKNOWN_ERROR;
1440bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1441bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
144288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) {
144388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
144588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack = source;
144688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
144788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
14482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) {
14492eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten
14502eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // Either the application or the DRM system can independently say
14512eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // that there must be a hardware-protected path to an external video sink.
14522eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // For now we always require a hardware-protected path to external video sink
14532eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // if content is DRMed, but eventually this could be optional per DRM agent.
14542eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // When the application wants protection, then
14552eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    //   (USE_SURFACE_ALLOC && (mSurface != 0) &&
14562eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    //   (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp))
14572eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // will be true, but that part is already handled by SurfaceFlinger.
1458eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten
1459eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP
1460eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // For debugging, we allow a system property to control the protected usage.
1461eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // In case of uninitialized or unexpected property, we default to "DRM only".
1462eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    bool setProtectionBit = false;
1463eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    char value[PROPERTY_VALUE_MAX];
1464eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    if (property_get("persist.sys.hdcp_checking", value, NULL)) {
1465eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        if (!strcmp(value, "never")) {
1466eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            // nop
1467eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else if (!strcmp(value, "always")) {
1468eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            setProtectionBit = true;
1469eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else if (!strcmp(value, "drm-only")) {
1470eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            if (mDecryptHandle != NULL) {
1471eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten                setProtectionBit = true;
1472eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            }
1473eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        // property value is empty, or unexpected value
1474eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else {
1475eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            if (mDecryptHandle != NULL) {
1476eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten                setProtectionBit = true;
1477eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            }
1478eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        }
1479eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // can' read property value
1480eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    } else {
1481eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        if (mDecryptHandle != NULL) {
1482eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            setProtectionBit = true;
1483eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        }
1484eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    }
1485eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // note that usage bit is already cleared, so no need to clear it in the "else" case
1486eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    if (setProtectionBit) {
1487eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        flags |= OMXCodec::kEnableGrallocUsageProtected;
1488eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    }
1489eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else
14902eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    if (mDecryptHandle != NULL) {
14912eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten        flags |= OMXCodec::kEnableGrallocUsageProtected;
14922eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    }
1493eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif
14942eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    LOGV("initVideoDecoder flags=0x%x", flags);
1495bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoSource = OMXCodec::Create(
149688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            mClient.interface(), mVideoTrack->getFormat(),
1497bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            false, // createEncoder
149839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            mVideoTrack,
14991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
1500bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1501bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
1502bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
150388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
15042415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1505bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1507bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1508bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1509bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1510139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        status_t err = mVideoSource->start();
1511139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber
1512139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        if (err != OK) {
1513139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            mVideoSource.clear();
1514139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            return err;
1515139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        }
1516bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1517bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1518a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mVideoSource != NULL) {
1519a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
1520a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex);
1521a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1522a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        const char *component;
1523a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        CHECK(mVideoSource->getFormat()
1524a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                ->findCString(kKeyDecoderComponent, &component));
1525a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1526a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        stat->mDecoderName = component;
1527a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
1528a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1529bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mVideoSource != NULL ? OK : UNKNOWN_ERROR;
1530bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1531bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
15324769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) {
153364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == SEEK_VIDEO_ONLY) {
153464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        mSeeking = NO_SEEK;
153564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        return;
153664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
153764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
153864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) {
15394769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        return;
15404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    }
15414769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
15424769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    if (mAudioPlayer != NULL) {
1543f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis        LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6);
15444769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
15454769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // If we don't have a video time, seek audio to the originally
15464769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // requested seek time instead.
15474769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
15484769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs);
15494769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mWatchForAudioSeekComplete = true;
15505dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        mWatchForAudioEOS = true;
15514769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    } else if (!mSeekNotificationSent) {
15524769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // If we're playing video only, report seek complete now,
15534769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // otherwise audio player will notify us later.
15544769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
1555512895089f2035bc86d3f502255199809aca721bAndreas Huber        mSeekNotificationSent = true;
15564769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    }
15574769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
1558a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(FIRST_FRAME, SET);
155964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = NO_SEEK;
1560a89082944308805b0def7de87c67e370e74b8789Gloria Wang
1561a89082944308805b0def7de87c67e370e74b8789Gloria Wang    if (mDecryptHandle != NULL) {
1562a89082944308805b0def7de87c67e370e74b8789Gloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1563a89082944308805b0def7de87c67e370e74b8789Gloria Wang                Playback::PAUSE, 0);
1564a89082944308805b0def7de87c67e370e74b8789Gloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1565a89082944308805b0def7de87c67e370e74b8789Gloria Wang                Playback::START, videoTimeUs / 1000);
1566a89082944308805b0def7de87c67e370e74b8789Gloria Wang    }
15674769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber}
15684769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
1569c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() {
1570bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
15717b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (!mVideoEventPending) {
15727b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // The event has been cancelled in reset_l() but had already
15737b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // been scheduled for execution at that time.
15747b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return;
15757b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
1576bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
1577bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
157864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking != NO_SEEK) {
1579bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mVideoBuffer) {
1580bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer->release();
1581bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer = NULL;
1582bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
15830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1584681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (mSeeking == SEEK && isStreamingHTTP() && mAudioSource != NULL
15852b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                && !(mFlags & SEEK_PREVIEW)) {
15860a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // We're going to seek the video source first, followed by
15870a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // the audio source.
15880a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // In order to avoid jumps in the DataSource offset caused by
15890a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // the audio codec prefetching data from the old locations
15900a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // while the video codec is already reading data from the new
15910a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // locations, we'll "pause" the audio source, causing it to
15920a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // stop reading input data until a subsequent seek.
15930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1594f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) {
15950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber                mAudioPlayer->pause();
1596f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
1597a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(AUDIO_RUNNING, CLEAR);
15980a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            }
15990a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            mAudioSource->pause();
16000a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        }
1601bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1602bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1603bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!mVideoBuffer) {
1604bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        MediaSource::ReadOptions options;
160564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (mSeeking != NO_SEEK) {
1606bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6);
1607bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1608abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber            options.setSeekTo(
160964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    mSeekTimeUs,
161064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    mSeeking == SEEK_VIDEO_ONLY
161164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                        ? MediaSource::ReadOptions::SEEK_NEXT_SYNC
161264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                        : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC);
1613bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1614bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        for (;;) {
1615bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            status_t err = mVideoSource->read(&mVideoBuffer, &options);
1616c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber            options.clearSeekTo();
1617bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1618bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (err != OK) {
1619e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                CHECK(mVideoBuffer == NULL);
1620bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1621bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                if (err == INFO_FORMAT_CHANGED) {
1622bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    LOGV("VideoSource signalled format change.");
1623bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
16245daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber                    notifyVideoSize_l();
16255daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1626a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    if (mVideoRenderer != NULL) {
1627fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        mVideoRendererIsPreview = false;
1628a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                        initRenderer_l();
1629a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    }
1630bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    continue;
1631bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                }
1632bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
16334769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // So video playback is complete, but we may still have
16344769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // a seek request pending that needs to be applied
16354769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // to the audio track.
163664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                if (mSeeking != NO_SEEK) {
16374769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                    LOGV("video stream ended while seeking!");
16384769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                }
16394769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                finishSeekIfNecessary(-1);
16404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
16415dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber                if (mAudioPlayer != NULL
16425dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber                        && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) {
16435dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber                    startAudioPlayer_l();
16445dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber                }
16455dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber
1646a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(VIDEO_AT_EOS, SET);
16475295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber                postStreamDoneEvent_l(err);
1648bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                return;
1649bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1650bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
16514844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            if (mVideoBuffer->range_length() == 0) {
165208411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // Some decoders, notably the PV AVC software decoder
165308411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // return spurious empty buffers that we just want to ignore.
165408411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber
16554844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer->release();
16564844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer = NULL;
16574844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                continue;
16584844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            }
16594844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
1660bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            break;
1661bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1662a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1663a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        {
1664a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            Mutex::Autolock autoLock(mStatsLock);
1665a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            ++mStats.mNumVideoFramesDecoded;
1666a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
1667bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1668bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1669bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t timeUs;
1670bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
1671bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1672150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mLastVideoTimeUs = timeUs;
1673150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
167464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == SEEK_VIDEO_ONLY) {
167564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (mSeekTimeUs > timeUs) {
167664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us",
167764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                 mSeekTimeUs, timeUs);
167864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
167964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
168064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
16812415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    {
16822415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        Mutex::Autolock autoLock(mMiscStateLock);
16832415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        mVideoTimeUs = timeUs;
16842415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
1685bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
168664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    SeekType wasSeeking = mSeeking;
16874769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    finishSeekIfNecessary(timeUs);
1688bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1689f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) {
1690f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        status_t err = startAudioPlayer_l();
1691f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (err != OK) {
16925442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            LOGE("Starting the audio player failed w/ err %d", err);
1693f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            return;
1694f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
1695f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
1696f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
16977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if ((mFlags & TEXTPLAYER_STARTED) && !(mFlags & (TEXT_RUNNING | SEEK_PREVIEW))) {
16987a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        mTextPlayer->resume();
1699a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(TEXT_RUNNING, SET);
17007a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
17017a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
17025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource;
17035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
1704bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & FIRST_FRAME) {
1705a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(FIRST_FRAME, CLEAR);
17065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs;
1707bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1708bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1709bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t realTimeUs, mediaTimeUs;
17105d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL
1711bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) {
1712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;
1713bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1714bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
171564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking == SEEK_VIDEO_ONLY) {
171664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
171764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
171864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        int64_t latenessUs = nowUs - timeUs;
171964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
172064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (latenessUs > 0) {
172164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6);
172264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
172364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
172464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
172564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking == NO_SEEK) {
172602a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber        // Let's display the first frame after seeking right away.
1727f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber
17282b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
1729bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17302b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        int64_t latenessUs = nowUs - timeUs;
17312b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
173264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (latenessUs > 500000ll
173364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mRTSPController == NULL
173464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mAudioPlayer != NULL
173564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mAudioPlayer->getMediaTimeMapping(
173664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    &realTimeUs, &mediaTimeUs)) {
173764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            LOGI("we're much too late (%.2f secs), video skipping ahead",
173864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                 latenessUs / 1E6);
173964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
174064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mVideoBuffer->release();
174164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mVideoBuffer = NULL;
174264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
174364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mSeeking = SEEK_VIDEO_ONLY;
174464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mSeekTimeUs = mediaTimeUs;
174564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
174664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            postVideoEvent_l();
174764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            return;
174864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
174964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
17502b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if (latenessUs > 40000) {
17512b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            // We're more than 40ms late.
1752dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber            LOGV("we're late by %lld us (%.2f secs), dropping frame",
1753dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber                 latenessUs, latenessUs / 1E6);
1754dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber            mVideoBuffer->release();
1755dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber            mVideoBuffer = NULL;
17562b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
1757a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
1758a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                Mutex::Autolock autoLock(mStatsLock);
1759a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                ++mStats.mNumVideoFramesDropped;
1760a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            }
1761a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1762dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber            postVideoEvent_l();
1763dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber            return;
1764aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale        }
1765bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17662b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if (latenessUs < -10000) {
17672b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            // We're more than 10ms early.
1768bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17692b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            postVideoEvent_l(10000);
17702b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            return;
17712b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        }
1772bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1773bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
177480ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang    if ((mNativeWindow != NULL)
177580ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang            && (mVideoRendererIsPreview || mVideoRenderer == NULL)) {
1776fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRendererIsPreview = false;
1777fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1778a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        initRenderer_l();
1779a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1780a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber
1781a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mVideoRenderer != NULL) {
1782a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        mVideoRenderer->render(mVideoBuffer);
1783a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1785f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    mVideoBuffer->release();
1786bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoBuffer = NULL;
1787bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
178864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) {
1789a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(SEEK_PREVIEW, CLEAR);
17902b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        return;
17912b1222f8938356669672f35e0e53e176c78c40efAndreas Huber    }
17922b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
1793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    postVideoEvent_l();
1794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1796bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) {
1797bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoEventPending) {
1798bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1801bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = true;
1802bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs);
1803bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
18055295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) {
1806bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mStreamDoneEventPending) {
1807bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1808bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1809bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = true;
18105295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber
18115295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    mStreamDoneStatus = status;
1812bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEvent(mStreamDoneEvent);
1813bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1814bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
181566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() {
181666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mBufferingEventPending) {
181766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        return;
181866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
181966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = true;
182066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mQueue.postEventWithDelay(mBufferingEvent, 1000000ll);
182166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
182266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
1823145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() {
1824145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (mVideoLagEventPending) {
1825145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        return;
1826145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
1827145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = true;
1828145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll);
1829145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber}
1830145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
183184b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l(int64_t delayUs) {
18321862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mAudioStatusEventPending) {
18331862a33b246249630b654182afb5914da3480d4cAndreas Huber        return;
18341862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
18351862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = true;
183684b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber    mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs);
18371862a33b246249630b654182afb5914da3480d4cAndreas Huber}
18381862a33b246249630b654182afb5914da3480d4cAndreas Huber
18391862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() {
18401862a33b246249630b654182afb5914da3480d4cAndreas Huber    Mutex::Autolock autoLock(mLock);
1841d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mAudioStatusEventPending) {
1842d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        // Event was dispatched and while we were blocking on the mutex,
1843d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        // has already been cancelled.
1844d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
1845d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
1846d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber
18471862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
18481862a33b246249630b654182afb5914da3480d4cAndreas Huber
18491862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) {
18501862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = false;
18511321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
18521321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        if (!mSeekNotificationSent) {
18531321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            notifyListener_l(MEDIA_SEEK_COMPLETE);
18541321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            mSeekNotificationSent = true;
18551321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        }
1856dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber
185764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        mSeeking = NO_SEEK;
18581862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
18591862a33b246249630b654182afb5914da3480d4cAndreas Huber
18605295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    status_t finalStatus;
18615295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) {
18621862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = false;
1863a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AUDIO_AT_EOS, SET);
1864a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(FIRST_FRAME, SET);
18655295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        postStreamDoneEvent_l(finalStatus);
18661862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
18671862a33b246249630b654182afb5914da3480d4cAndreas Huber}
18681862a33b246249630b654182afb5914da3480d4cAndreas Huber
1869c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() {
1870c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1871bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return prepare_l();
1872bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
1873c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1874bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() {
1875bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARED) {
1876bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return OK;
1877bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1878bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1879bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1880bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1881bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1882bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1883bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = false;
1884c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    status_t err = prepareAsync_l();
1885c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1886c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    if (err != OK) {
1887c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        return err;
1888c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1889c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1890bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
1891c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        mPreparedCondition.wait(mLock);
1892c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1893c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1894bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return mPrepareResult;
1895c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1896c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1897c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() {
1898c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1899bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1900bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1901bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1902bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1903bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1904bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = true;
1905c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return prepareAsync_l();
1906c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1907c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1908c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() {
1909bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1910bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1911c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1912c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
19132e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (!mQueueStarted) {
19142e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.start();
19152e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueueStarted = true;
19162e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
19172e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
1918a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARING, SET);
1919c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = new AwesomeEvent(
1920c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onPrepareAsyncEvent);
1921c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1922c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mQueue.postEvent(mAsyncPrepareEvent);
1923c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1924c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return OK;
1925c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1926c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1927bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() {
1928e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    sp<DataSource> dataSource;
1929e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1930681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    bool isWidevineStreaming = false;
1931681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (!strncasecmp("widevine://", mUri.string(), 11)) {
1932681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        isWidevineStreaming = true;
1933681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
1934681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        String8 newURI = String8("http://");
1935681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        newURI.append(mUri.string() + 11);
1936681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
1937681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mUri = newURI;
1938681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    }
1939681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
19408cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber    if (!strncasecmp("http://", mUri.string(), 7)
1941681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            || !strncasecmp("https://", mUri.string(), 8)
1942681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            || isWidevineStreaming) {
19431156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mConnectingDataSource = HTTPBase::Create(
19441156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                (mFlags & INCOGNITO)
19451156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                    ? HTTPBase::kFlagIncognito
19461156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                    : 0);
1947e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
19489b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        if (mUIDValid) {
19499b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber            mConnectingDataSource->setUID(mUID);
19509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        }
19519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
1952e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.unlock();
195379f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber        status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders);
1954e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.lock();
1955e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1956e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (err != OK) {
1957e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource.clear();
1958e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1959e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            LOGI("mConnectingDataSource->connect() returned %d", err);
1960e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            return err;
1961e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
1962e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1963681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (!isWidevineStreaming) {
1964681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            // The widevine extractor does its own caching.
1965681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
19660a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0
1967681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            mCachedSource = new NuCachedSource2(
1968681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                    new ThrottledSource(
1969681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                        mConnectingDataSource, 50 * 1024 /* bytes/sec */));
19700a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else
1971681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            mCachedSource = new NuCachedSource2(mConnectingDataSource);
19720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif
1973681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
1974681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            dataSource = mCachedSource;
1975681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        } else {
1976681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            dataSource = mConnectingDataSource;
1977681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
1978681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
1979e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mConnectingDataSource.clear();
19800a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1981ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
19826511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber        String8 contentType = dataSource->getMIMEType();
1983ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
19846511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber        if (strncasecmp(contentType.string(), "audio/", 6)) {
19856511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // We're not doing this for streams that appear to be audio-only
19866511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // streams to ensure that even low bandwidth streams start
19876511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // playing back fairly instantly.
1988ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
19896511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // We're going to prefill the cache before trying to instantiate
19906511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // the extractor below, as the latter is an operation that otherwise
19916511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // could block on the datasource for a significant amount of time.
19926511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // During that time we'd be unable to abort the preparation phase
19936511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // without this prefill.
1994e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            if (mCachedSource != NULL) {
1995e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // We're going to prefill the cache before trying to instantiate
1996e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // the extractor below, as the latter is an operation that otherwise
1997e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // could block on the datasource for a significant amount of time.
1998e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // During that time we'd be unable to abort the preparation phase
1999e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // without this prefill.
2000e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2001e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                mLock.unlock();
2002e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2003e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                for (;;) {
2004e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    status_t finalStatus;
2005e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    size_t cachedDataRemaining =
2006e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                        mCachedSource->approxDataRemaining(&finalStatus);
2007e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2008e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes
2009e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                            || (mFlags & PREPARE_CANCELLED)) {
2010e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                        break;
2011e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    }
20126511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
2013e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    usleep(200000);
20146511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber                }
20156511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
2016e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                mLock.lock();
2017ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            }
2018ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
2019e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            if (mFlags & PREPARE_CANCELLED) {
2020e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                LOGI("Prepare cancelled while waiting for initial cache fill.");
2021e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                return UNKNOWN_ERROR;
2022e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            }
2023ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        }
2024cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    } else if (!strncasecmp("rtsp://", mUri.string(), 7)) {
2025cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        if (mLooper == NULL) {
2026cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mLooper = new ALooper;
2027a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber            mLooper->setName("rtsp");
2028cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mLooper->start();
2029cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
2030cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        mRTSPController = new ARTSPController(mLooper);
2031f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        mConnectingRTSPController = mRTSPController;
2032f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber
20339b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        if (mUIDValid) {
20349b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber            mConnectingRTSPController->setUID(mUID);
20359b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        }
20369b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
2037f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        mLock.unlock();
2038cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        status_t err = mRTSPController->connect(mUri.string());
2039f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        mLock.lock();
2040f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber
2041f1958f9442bc937e1f8c8d9175901500b944b021Andreas Huber        mConnectingRTSPController.clear();
2042cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
2043cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        LOGI("ARTSPController::connect returned %d", err);
2044cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
2045cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        if (err != OK) {
2046cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mRTSPController.clear();
2047cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            return err;
2048cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
2049e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
2050cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        sp<MediaExtractor> extractor = mRTSPController.get();
2051e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber        return setDataSource_l(extractor);
2052e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    } else {
2053e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
2054e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
2055bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2056bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (dataSource == NULL) {
2057bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
2058bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2059bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2060681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    sp<MediaExtractor> extractor;
2061bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2062681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (isWidevineStreaming) {
2063681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        String8 mimeType;
2064681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        float confidence;
2065681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        sp<AMessage> dummy;
2066681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        bool success = SniffDRM(dataSource, &mimeType, &confidence, &dummy);
2067681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2068681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (!success
2069681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                || strcasecmp(
2070681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                    mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) {
2071681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            return ERROR_UNSUPPORTED;
2072681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
2073681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2074681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor = new WVMExtractor(dataSource);
2075681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor->setAdaptiveStreamingMode(true);
2076681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        extractor = mWVMExtractor;
2077681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else {
2078681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        extractor = MediaExtractor::Create(dataSource);
2079681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2080681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (extractor == NULL) {
2081681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            return UNKNOWN_ERROR;
2082681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
2083bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2084bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2085b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang    dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient);
2086b5ce361d19e69fe156f7188c9ee0f4734b259874Gloria Wang
2087b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    if (mDecryptHandle != NULL) {
20888f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        CHECK(mDrmManagerClient);
20893318523222e31fb4a7fcc345ddb4ec845d30ef96James Dong        if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) {
20907340743ce30766af6334bbd9acf813eb66dd5a60Gloria Wang            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
2091b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        }
2092dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
2093dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
2094681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    status_t err = setDataSource_l(extractor);
2095681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2096681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (err != OK) {
2097681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor.clear();
2098681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2099681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        return err;
2100681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    }
2101681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2102681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    return OK;
2103bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
2104bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
210588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) {
210688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(err != OK);
210788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
210888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    if (mIsAsyncPrepare) {
210988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
211088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    }
211188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
211288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPrepareResult = err;
2113a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR);
211488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAsyncPrepareEvent = NULL;
211588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPreparedCondition.broadcast();
211688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
211788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
2118e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static
2119e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) {
2120e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie);
2121e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
2122e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    return (me->mFlags & PREPARE_CANCELLED) == 0;
2123e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber}
2124e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
2125c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() {
21268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    Mutex::Autolock autoLock(mLock);
2127bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
21288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mFlags & PREPARE_CANCELLED) {
21298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        LOGI("prepare was cancelled before doing anything");
21308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        abortPrepare(UNKNOWN_ERROR);
21318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return;
21328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
2133e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
21348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mUri.size() > 0) {
21358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = finishSetDataSource_l();
2136bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
21378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
21388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
21398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
2140bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
21418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
2142bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
21438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mVideoTrack != NULL && mVideoSource == NULL) {
21448650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initVideoDecoder();
21451322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
21468650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
21478650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
21488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
21491322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
21508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
21511322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
21528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mAudioTrack != NULL && mAudioSource == NULL) {
21538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initAudioDecoder();
21541322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
21558650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
21568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
21578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
21581322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
2159c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
2160c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2161a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARING_CONNECTED, SET);
21626a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
2163681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (isStreamingHTTP() || mRTSPController != NULL) {
21648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        postBufferingEvent_l();
21658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    } else {
21668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        finishAsyncPrepare_l();
21678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
21688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
2169c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
21708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() {
2171bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mIsAsyncPrepare) {
21725daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber        if (mVideoSource == NULL) {
2173bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0);
2174bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        } else {
21755daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber            notifyVideoSize_l();
2176bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
2177c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2178bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        notifyListener_l(MEDIA_PREPARED);
2179bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2180c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2181bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPrepareResult = OK;
2182a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR);
2183a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARED, SET);
2184c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = NULL;
2185bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPreparedCondition.broadcast();
2186c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
2187c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2188acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const {
2189acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return mExtractorFlags;
2190acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber}
2191acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
219284b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postAudioEOS(int64_t delayUs) {
2193bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber    Mutex::Autolock autoLock(mLock);
219484b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber    postCheckAudioStatusEvent_l(delayUs);
2195ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
2196ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
2197ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() {
2198bd7b7177f88ae6e83bd7bb8bfd9b7018be923931Andreas Huber    Mutex::Autolock autoLock(mLock);
2199c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber    postAudioSeekComplete_l();
2200c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber}
2201c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
2202c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Hubervoid AwesomePlayer::postAudioSeekComplete_l() {
220384b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber    postCheckAudioStatusEvent_l(0 /* delayUs */);
2204ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
2205ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
22064f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::setParameter(int key, const Parcel &request) {
2207965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang    switch (key) {
2208965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        case KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX:
2209965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        {
2210965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            Mutex::Autolock autoLock(mTimedTextLock);
2211965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            return setTimedTextTrackIndex(request.readInt32());
2212965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        }
2213965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        case KEY_PARAMETER_TIMED_TEXT_ADD_OUT_OF_BAND_SOURCE:
2214965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        {
2215965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            Mutex::Autolock autoLock(mTimedTextLock);
2216965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            if (mTextPlayer == NULL) {
2217965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang                mTextPlayer = new TimedTextPlayer(this, mListener, &mQueue);
2218965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            }
2219965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang
2220965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            return mTextPlayer->setParameter(key, request);
2221965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        }
22225b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        case KEY_PARAMETER_CACHE_STAT_COLLECT_FREQ_MS:
22235b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        {
22245b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            return setCacheStatCollectFreq(request);
22255b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        }
2226965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        default:
2227965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        {
2228965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            return ERROR_UNSUPPORTED;
2229965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        }
22307a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
22314f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
22324f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
22335b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t AwesomePlayer::setCacheStatCollectFreq(const Parcel &request) {
22345b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    if (mCachedSource != NULL) {
22355b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        int32_t freqMs = request.readInt32();
22365b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        LOGD("Request to keep cache stats in the past %d ms",
22375b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            freqMs);
22385b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        return mCachedSource->setCacheStatCollectFreq(freqMs);
22395b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    }
22405b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    return ERROR_UNSUPPORTED;
22415b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong}
22425b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong
22434f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::getParameter(int key, Parcel *reply) {
2244cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    switch (key) {
2245cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    case KEY_PARAMETER_AUDIO_CHANNEL_COUNT:
2246cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        {
2247cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            int32_t channelCount;
2248cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            if (mAudioTrack == 0 ||
2249cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten                    !mAudioTrack->getFormat()->findInt32(kKeyChannelCount, &channelCount)) {
2250cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten                channelCount = 0;
2251cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            }
2252cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            reply->writeInt32(channelCount);
2253cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        }
2254cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        return OK;
2255cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    default:
2256cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        {
2257cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            return ERROR_UNSUPPORTED;
2258cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        }
2259cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    }
22604f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
2261ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
2262681755fc0d0797506456f46a2a10555916d6be32Andreas Huberbool AwesomePlayer::isStreamingHTTP() const {
2263681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    return mCachedSource != NULL || mWVMExtractor != NULL;
2264681755fc0d0797506456f46a2a10555916d6be32Andreas Huber}
2265681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2266a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huberstatus_t AwesomePlayer::dump(int fd, const Vector<String16> &args) const {
2267a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    Mutex::Autolock autoLock(mStatsLock);
2268a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2269a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    FILE *out = fdopen(dup(fd), "w");
2270a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2271a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, " AwesomePlayer\n");
2272a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mStats.mFd < 0) {
2273a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "  URI(%s)", mStats.mURI.string());
2274a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    } else {
2275a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "  fd(%d)", mStats.mFd);
2276a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2277a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2278a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, ", flags(0x%08x)", mStats.mFlags);
2279a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2280a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mStats.mBitrate >= 0) {
2281a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, ", bitrate(%lld bps)", mStats.mBitrate);
2282a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2283a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2284a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, "\n");
2285a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2286a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    for (size_t i = 0; i < mStats.mTracks.size(); ++i) {
2287a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        const TrackStat &stat = mStats.mTracks.itemAt(i);
2288a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2289a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "  Track %d\n", i + 1);
2290a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "   MIME(%s)", stat.mMIME.string());
2291a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2292a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if (!stat.mDecoderName.isEmpty()) {
2293a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            fprintf(out, ", decoder(%s)", stat.mDecoderName.string());
2294a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
2295a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2296a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "\n");
2297a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2298a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if ((ssize_t)i == mStats.mVideoTrackIndex) {
2299a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            fprintf(out,
2300a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "   videoDimensions(%d x %d), "
2301a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "numVideoFramesDecoded(%lld), "
2302a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "numVideoFramesDropped(%lld)\n",
2303a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mVideoWidth,
2304a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mVideoHeight,
2305a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mNumVideoFramesDecoded,
2306a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mNumVideoFramesDropped);
2307a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
2308a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2309a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2310a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fclose(out);
2311a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    out = NULL;
2312a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2313a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    return OK;
2314a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber}
2315a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2316a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Hubervoid AwesomePlayer::modifyFlags(unsigned value, FlagMode mode) {
2317a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    switch (mode) {
2318a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case SET:
2319a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags |= value;
2320a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2321a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case CLEAR:
2322a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags &= ~value;
2323a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2324a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case ASSIGN:
2325a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags = value;
2326a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2327a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        default:
2328a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            TRESPASS();
2329a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2330a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2331a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
2332a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
2333a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFlags = mFlags;
2334a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2335a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber}
2336a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}  // namespace android
2338