AwesomePlayer.cpp revision dce4161f7d4d39498f69591e876f5fecdde95833
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
25bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h"
26681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/DRMExtractor.h"
27733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h"
280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h"
290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h"
30bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h"
31681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/WVMExtractor.h"
32bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
336655174826330afe66ef766258181ae8c11f3f6cInsun Kang#include "timedtext/TimedTextDriver.h"
34965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang
354844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h>
367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <binder/IServiceManager.h>
377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang#include <media/IMediaPlayerService.h>
38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/hexdump.h>
39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h>
40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h>
41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h>
42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h>
43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h>
44717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h>
45bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h>
46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h>
47bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h>
48bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h>
49717826ececd8d39596f62418677721d70776add1Andreas Huber
505daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h>
511173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
521173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/SurfaceTextureClient.h>
532eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten#include <surfaceflinger/ISurfaceComposer.h>
543cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
5514acc736e336cbd6026df781d4f411e908831815Andreas Huber#include <media/stagefright/foundation/AMessage.h>
56e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
57eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#include <cutils/properties.h>
58eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten
59e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1
6014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong#define FRAME_DROP_FREQ 0
61e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber
62bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android {
63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll;  // 2secs
6583ed9d41b5aea53a5f3f0ae2fa14e101c079a12aGloria Wangstatic int64_t kHighWaterMarkUs = 5000000ll;  // 5secs
66ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kLowWaterMarkBytes = 40000;
67ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huberstatic const size_t kHighWaterMarkBytes = 200000;
688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
69bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event {
70c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    AwesomeEvent(
71c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            AwesomePlayer *player,
72c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            void (AwesomePlayer::*method)())
73bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        : mPlayer(player),
74c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber          mMethod(method) {
75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
76bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected:
78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual ~AwesomeEvent() {}
79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
81c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        (mPlayer->*mMethod)();
82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate:
85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomePlayer *mPlayer;
86c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    void (AwesomePlayer::*mMethod)();
87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
88bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent(const AwesomeEvent &);
89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent &operator=(const AwesomeEvent &);
90bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber};
91bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
92733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer {
93733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(
941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta)
951173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        : mTarget(new SoftwareRenderer(nativeWindow, meta)) {
96733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
97733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
98733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual void render(MediaBuffer *buffer) {
99fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        render((const uint8_t *)buffer->data() + buffer->range_offset(),
100fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber               buffer->range_length());
101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
103fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    void render(const void *data, size_t size) {
104fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mTarget->render(data, size, NULL);
105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected:
108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual ~AwesomeLocalRenderer() {
109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        delete mTarget;
110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        mTarget = NULL;
111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
113733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate:
1140a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    SoftwareRenderer *mTarget;
115988e3f0b2c74095deae580157c57935a98573052Andreas Huber
116733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(const AwesomeLocalRenderer &);
117733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
118733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber};
119733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
1206a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer {
121ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    AwesomeNativeWindowRenderer(
122ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            const sp<ANativeWindow> &nativeWindow,
123ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            int32_t rotationDegrees)
1246a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        : mNativeWindow(nativeWindow) {
125ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        applyRotation(rotationDegrees);
1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1276a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1286a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual void render(MediaBuffer *buffer) {
129593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        int64_t timeUs;
130593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs));
131593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        native_window_set_buffers_timestamp(mNativeWindow.get(), timeUs * 1000);
1326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        status_t err = mNativeWindow->queueBuffer(
1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                mNativeWindow.get(), buffer->graphicBuffer().get());
1346a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        if (err != 0) {
13529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("queueBuffer failed with error %s (%d)", strerror(-err),
1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                    -err);
1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            return;
1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        }
1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        sp<MetaData> metaData = buffer->meta_data();
1416a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        metaData->setInt32(kKeyRendered, 1);
1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected:
1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual ~AwesomeNativeWindowRenderer() {}
1466a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1476a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate:
1486a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<ANativeWindow> mNativeWindow;
1496a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
150ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    void applyRotation(int32_t rotationDegrees) {
151ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        uint32_t transform;
152ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        switch (rotationDegrees) {
153ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 0: transform = 0; break;
154ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 90: transform = HAL_TRANSFORM_ROT_90; break;
155ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 180: transform = HAL_TRANSFORM_ROT_180; break;
156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 270: transform = HAL_TRANSFORM_ROT_270; break;
157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            default: transform = 0; break;
158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        if (transform) {
161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            CHECK_EQ(0, native_window_set_buffers_transform(
162ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                        mNativeWindow.get(), transform));
163ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
164ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
165ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
1666a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &);
1676a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer &operator=(
1686a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            const AwesomeNativeWindowRenderer &);
1696a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis};
1706a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1717cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage
1727cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) {
1737cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    sp<IBinder> binder =
1747cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        defaultServiceManager()->getService(String16("media.player"));
1757cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
1767cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    CHECK(service.get() != NULL);
1777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    service->addBatteryData(params);
1797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang}
180e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
1817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang////////////////////////////////////////////////////////////////////////////////
182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer()
1832e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    : mQueueStarted(false),
1849b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mUIDValid(false),
1852e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber      mTimeSource(NULL),
186fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber      mVideoRendererIsPreview(false),
187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mAudioPlayer(NULL),
188b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong      mDisplayWidth(0),
189b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong      mDisplayHeight(0),
190bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber      mFlags(0),
191acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber      mExtractorFlags(0),
1927b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber      mVideoBuffer(NULL),
193150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber      mDecryptHandle(NULL),
1947a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang      mLastVideoTimeUs(-1),
1956655174826330afe66ef766258181ae8c11f3f6cInsun Kang      mTextDriver(NULL) {
196e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    CHECK_EQ(mClient.connect(), (status_t)OK);
197bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
198bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    DataSource::RegisterDefaultSniffers();
199bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
200c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
201bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
202c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone);
203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
204c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate);
20566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
206145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate);
207145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoEventPending = false;
208c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
209c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mCheckAudioStatusEvent = new AwesomeEvent(
210c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onCheckAudioStatus);
211c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2121862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() {
2182e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mQueueStarted) {
2192e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.stop();
2202e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mClient.disconnect();
225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
227c34233e673c9791e137456d0c427d58db184b690Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepNotifications) {
228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mVideoEvent->eventID());
229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
230145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mQueue.cancelEvent(mVideoLagEvent->eventID());
231145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = false;
23266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
233c34233e673c9791e137456d0c427d58db184b690Andreas Huber    if (!keepNotifications) {
234c34233e673c9791e137456d0c427d58db184b690Andreas Huber        mQueue.cancelEvent(mStreamDoneEvent->eventID());
235c34233e673c9791e137456d0c427d58db184b690Andreas Huber        mStreamDoneEventPending = false;
236c34233e673c9791e137456d0c427d58db184b690Andreas Huber        mQueue.cancelEvent(mCheckAudioStatusEvent->eventID());
237c34233e673c9791e137456d0c427d58db184b690Andreas Huber        mAudioStatusEventPending = false;
238c34233e673c9791e137456d0c427d58db184b690Andreas Huber
23966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mQueue.cancelEvent(mBufferingEvent->eventID());
24066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mBufferingEventPending = false;
24166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2440726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) {
245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mListener = listener;
247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2499b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid AwesomePlayer::setUID(uid_t uid) {
2503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("AwesomePlayer running on behalf of uid %d", uid);
2519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
2529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
2539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
2549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
2559b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
2565561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource(
2575561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
2597b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(uri, headers);
2607b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2627b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2637b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
266bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri = uri;
26766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
268bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (headers) {
269bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mUriHeaders = *headers;
2707314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2717314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log"));
2727314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        if (index >= 0) {
2737314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            // Browser is in "incognito" mode, suppress logging URLs.
2747314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2757314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            // This isn't something that should be passed to the server.
2767314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            mUriHeaders.removeItemsAt(index);
2777314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
278a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(INCOGNITO, SET);
2797314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        }
2807314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    }
2817314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2827314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    if (!(mFlags & INCOGNITO)) {
283df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("setDataSource_l('%s')", mUri.string());
2847314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    } else {
285df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("setDataSource_l(URL suppressed)");
28666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
28766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
288bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // The actual work will be done during preparation in the call to
289bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // ::finishSetDataSource_l to avoid blocking the calling thread in
290bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // setDataSource for any significant time.
29166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
292a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
293a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
294a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFd = -1;
295a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mURI = mUri;
296a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
297a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
298bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return OK;
299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource(
302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int fd, int64_t offset, int64_t length) {
303bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
304bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3077b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<DataSource> dataSource = new FileSource(fd, offset, length);
308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3097b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    status_t err = dataSource->initCheck();
310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3157b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource = dataSource;
3167b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
317a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
318a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
319a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFd = fd;
320a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mURI = String8();
321a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
322a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
3237b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(dataSource);
3247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
3257b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
326e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) {
32785704836f33a199d7e442a23db82abbd5620d35dAndreas Huber    return INVALID_OPERATION;
328e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
329e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
3307b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
3317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const sp<DataSource> &dataSource) {
3327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (extractor == NULL) {
335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
336bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3389d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    if (extractor->getDrmFlag()) {
3399d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        checkDrmStatus(dataSource);
3409d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    }
3419d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong
3429d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    return setDataSource_l(extractor);
3439d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong}
3449d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong
3459d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongvoid AwesomePlayer::checkDrmStatus(const sp<DataSource>& dataSource) {
346785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong    dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient);
347785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong    if (mDecryptHandle != NULL) {
348785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong        CHECK(mDrmManagerClient);
349785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong        if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) {
350785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
3518f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        }
352dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
354bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
355bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
3567fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // Attempt to approximate overall stream bitrate by summing all
3577fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // tracks' individual bitrates, if not all of them advertise bitrate,
3587fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // we have to fail.
3597fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3607fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t totalBitRate = 0;
3617fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3627fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
3637fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
3647fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3657fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        int32_t bitrate;
3667fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        if (!meta->findInt32(kKeyBitRate, &bitrate)) {
367a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            const char *mime;
368a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            CHECK(meta->findCString(kKeyMIMEType, &mime));
3693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("track of type '%s' does not publish bitrate", mime);
370a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
3717fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            totalBitRate = -1;
3727fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            break;
3737fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        }
3747fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3757fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        totalBitRate += bitrate;
3767fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
3777fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3787fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = totalBitRate;
3797fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("mBitrate = %lld bits/sec", mBitrate);
3817fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
382a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
383a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
384a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mBitrate = mBitrate;
385a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mTracks.clear();
386a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mAudioTrackIndex = -1;
387a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoTrackIndex = -1;
388a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
389a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveAudio = false;
391bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveVideo = false;
392bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
394bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
39532bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        const char *_mime;
39632bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &_mime));
397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
39832bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        String8 mime = String8(_mime);
39932bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber
40032bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        if (!haveVideo && !strncasecmp(mime.string(), "video/", 6)) {
40188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setVideoSource(extractor->getTrack(i));
40288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveVideo = true;
403b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong
404b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            // Set the presentation/display size
405b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            int32_t displayWidth, displayHeight;
406b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth);
407b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            if (success) {
408b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                success = meta->findInt32(kKeyDisplayHeight, &displayHeight);
409b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            }
410b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            if (success) {
411b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                mDisplayWidth = displayWidth;
412b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                mDisplayHeight = displayHeight;
413b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            }
414b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong
415a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
416a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                Mutex::Autolock autoLock(mStatsLock);
417a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mVideoTrackIndex = mStats.mTracks.size();
418a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mTracks.push();
419a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                TrackStat *stat =
420a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex);
42132bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber                stat->mMIME = mime.string();
422a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            }
42332bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        } else if (!haveAudio && !strncasecmp(mime.string(), "audio/", 6)) {
42488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setAudioSource(extractor->getTrack(i));
42588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveAudio = true;
4268ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber
427a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
428a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                Mutex::Autolock autoLock(mStatsLock);
429a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mAudioTrackIndex = mStats.mTracks.size();
430a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mTracks.push();
431a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                TrackStat *stat =
432a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex);
43332bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber                stat->mMIME = mime.string();
434a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            }
435a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
43632bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber            if (!strcasecmp(mime.string(), MEDIA_MIMETYPE_AUDIO_VORBIS)) {
4376954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // Only do this for vorbis audio, none of the other audio
4386954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // formats even support this ringtone specific hack and
4396954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // retrieving the metadata on some extractors may turn out
4406954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // to be very expensive.
4416954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                sp<MetaData> fileMeta = extractor->getMetaData();
4426954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                int32_t loop;
4436954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                if (fileMeta != NULL
4446954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                        && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) {
445a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    modifyFlags(AUTO_LOOPING, SET);
4466954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                }
4478ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber            }
44832bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        } else if (!strcasecmp(mime.string(), MEDIA_MIMETYPE_TEXT_3GPP)) {
4497a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang            addTextSource(extractor->getTrack(i));
450bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
451bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
452bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
453acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    if (!haveAudio && !haveVideo) {
454acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return UNKNOWN_ERROR;
455acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
456acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
457acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = extractor->flags();
458acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
459acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
460bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
461bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
462bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() {
463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
464bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
465bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
466bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
467bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() {
468b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    mDisplayWidth = 0;
469b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    mDisplayHeight = 0;
47065a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber
471dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
472dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
473dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::STOP, 0);
474dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDecryptHandle = NULL;
475dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient = NULL;
476dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
477dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
4787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mFlags & PLAYING) {
4797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
4807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
4817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            params |= IMediaPlayerService::kBatteryDataTrackAudio;
4827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        }
4837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        if (mVideoSource != NULL) {
4847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            params |= IMediaPlayerService::kBatteryDataTrackVideo;
4857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        }
4867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        addBatteryData(params);
4877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
4887cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
489e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mFlags & PREPARING) {
490a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(PREPARE_CANCELLED, SET);
491e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (mConnectingDataSource != NULL) {
492df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("interrupting the connection process");
493e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource->disconnect();
494e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
4956a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
4966a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        if (mFlags & PREPARING_CONNECTED) {
4976a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // We are basically done preparing, we're just buffering
4986a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // enough data to start playback, we can safely interrupt that.
4996a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            finishAsyncPrepare_l();
5006a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        }
501e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
502e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
503bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
504bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mPreparedCondition.wait(mLock);
505bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
506bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
507bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    cancelPlayerEvents();
508bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
509681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    mWVMExtractor.clear();
5100a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mCachedSource.clear();
51188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack.clear();
51288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack.clear();
51388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
5147b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // Shutdown audio first, so that the respone to the reset request
5157b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // appears to happen instantaneously as far as the user is concerned
5167b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // If we did this later, audio would continue playing while we
5177b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // shutdown the video-related resources and the player appear to
5187b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // not be as responsive to a reset request.
5195b75fdc8fbc026453888cbb2d3fe31345394618bGloria Wang    if ((mAudioPlayer == NULL || !(mFlags & AUDIOPLAYER_STARTED))
5205b75fdc8fbc026453888cbb2d3fe31345394618bGloria Wang            && mAudioSource != NULL) {
521e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // If we had an audio player, it would have effectively
522e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // taken possession of the audio source and stopped it when
523e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // _it_ is stopped. Otherwise this is still our responsibility.
524e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mAudioSource->stop();
525e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
5267b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioSource.clear();
5277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5287b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mTimeSource = NULL;
5297b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5307b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete mAudioPlayer;
5317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioPlayer = NULL;
5327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5336655174826330afe66ef766258181ae8c11f3f6cInsun Kang    if (mTextDriver != NULL) {
5346655174826330afe66ef766258181ae8c11f3f6cInsun Kang        delete mTextDriver;
5356655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver = NULL;
5367a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
5377a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
538b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber    mVideoRenderer.clear();
539b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas 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;
551af64a8a6ad89f52685e822dca30742a4132c9ae6Gloria Wang    mSeekNotificationSent = true;
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
57799590d29c9d3081cadfccd036842f5ce9a7debefAndreas Huber    mWatchForAudioSeekComplete = false;
57899590d29c9d3081cadfccd036842f5ce9a7debefAndreas Huber    mWatchForAudioEOS = false;
579bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
580bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
581c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) {
5820726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber    if (mListener != NULL) {
5830726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        sp<MediaPlayerBase> listener = mListener.promote();
5840726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
5850726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        if (listener != NULL) {
586c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            listener->sendEvent(msg, ext1, ext2);
58766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        }
58866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
58966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
59066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
5917fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) {
592c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t size;
5937fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mDurationUs >= 0 && mCachedSource != NULL
5947fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            && mCachedSource->getSize(&size) == OK) {
5957fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = size * 8000000ll / mDurationUs;  // in bits/sec
5967fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
5977fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
5987fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5997fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mBitrate >= 0) {
6007fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = mBitrate;
6017fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
6027fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
6037fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6047fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    *bitrate = 0;
6057fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6067fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    return false;
6077fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber}
6087fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable.
6108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) {
6117fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t bitrate;
6128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
6132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mCachedSource != NULL && getBitrate(&bitrate)) {
6141bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        status_t finalStatus;
6151bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
6168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        *durationUs = cachedDataRemaining * 8000000ll / bitrate;
6171bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        *eos = (finalStatus != OK);
6188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return true;
619681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else if (mWVMExtractor != NULL) {
620681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        status_t finalStatus;
621681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        *durationUs = mWVMExtractor->getCachedDurationUs(&finalStatus);
622681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        *eos = (finalStatus != OK);
623681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        return true;
6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    return false;
6278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
6288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
62934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() {
63034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    if (mCachedSource != NULL) {
63134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber        mCachedSource->resumeFetchingIfNecessary();
63234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    }
63334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber}
63434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
635145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() {
636145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    Mutex::Autolock autoLock(mLock);
637145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (!mVideoLagEventPending) {
638145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        return;
639145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
640145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = false;
641145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
642145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs();
643145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    int64_t videoLateByUs = audioTimeUs - mVideoTimeUs;
644145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
6455dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) {
6463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("video late by %lld ms.", videoLateByUs / 1000ll);
647145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
648145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        notifyListener_l(
649145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                MEDIA_INFO,
650145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                MEDIA_INFO_VIDEO_TRACK_LAGGING,
651145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                videoLateByUs / 1000ll);
652145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
653145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
654145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    postVideoLagEvent_l();
655145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber}
656145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
65766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() {
65866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    Mutex::Autolock autoLock(mLock);
659d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mBufferingEventPending) {
660d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
661d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
66266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
66366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
6648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mCachedSource != NULL) {
6651bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        status_t finalStatus;
6661bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
6671bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        bool eos = (finalStatus != OK);
668c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (eos) {
6701bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney            if (finalStatus == ERROR_END_OF_STREAM) {
6711bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney                notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
6721bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney            }
67383977eb230d829cfe520f55d7977037a904ce548Andreas Huber            if (mFlags & PREPARING) {
6743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("cache has reached EOS, prepare is done.");
67583977eb230d829cfe520f55d7977037a904ce548Andreas Huber                finishAsyncPrepare_l();
67683977eb230d829cfe520f55d7977037a904ce548Andreas Huber            }
6778650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        } else {
6787fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            int64_t bitrate;
6797fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            if (getBitrate(&bitrate)) {
6808650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                size_t cachedSize = mCachedSource->cachedSize();
6818650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate;
682c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6838650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
6848650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if (percentage > 100) {
6858650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    percentage = 100;
6868650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
687c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
6898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else {
6908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // We don't know the bitrate of the stream, use absolute size
6918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // limits to maintain the cache.
6928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
6938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if ((mFlags & PLAYING) && !eos
6948650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        && (cachedDataRemaining < kLowWaterMarkBytes)) {
695df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                    ALOGI("cache is running low (< %d) , pausing.",
6968650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                         kLowWaterMarkBytes);
697a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    modifyFlags(CACHE_UNDERRUN, SET);
6988650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    pause_l();
69934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber                    ensureCacheIsFetching_l();
7005b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong                    sendCacheStats();
7018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
7028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) {
7038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    if (mFlags & CACHE_UNDERRUN) {
704df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                        ALOGI("cache has filled up (> %d), resuming.",
7058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
706a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                        modifyFlags(CACHE_UNDERRUN, CLEAR);
7078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        play_l();
7088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
7098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    } else if (mFlags & PREPARING) {
7103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                        ALOGV("cache has filled up (> %d), prepare is done",
7118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
7128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        finishAsyncPrepare_l();
7138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    }
7148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
7158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            }
7168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        }
717681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else if (mWVMExtractor != NULL) {
718681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        status_t finalStatus;
719681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
720681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        int64_t cachedDurationUs
721681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            = mWVMExtractor->getCachedDurationUs(&finalStatus);
722681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
723681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        bool eos = (finalStatus != OK);
724681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
725681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (eos) {
726681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (finalStatus == ERROR_END_OF_STREAM) {
727681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
728681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
729681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (mFlags & PREPARING) {
7303856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("cache has reached EOS, prepare is done.");
731681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                finishAsyncPrepare_l();
732681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
733681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        } else {
734681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
735681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (percentage > 100) {
736681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                percentage = 100;
737681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
738681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
739681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
740681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
7412415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
7422415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber
7438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    int64_t cachedDurationUs;
7442a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber    bool eos;
7458650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (getCachedDuration_l(&cachedDurationUs, &eos)) {
7463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("cachedDurationUs = %.2f secs, eos=%d",
74734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber             cachedDurationUs / 1E6, eos);
74834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
7498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if ((mFlags & PLAYING) && !eos
7508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                && (cachedDurationUs < kLowWaterMarkUs)) {
751df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("cache is running low (%.2f secs) , pausing.",
7528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                 cachedDurationUs / 1E6);
753a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(CACHE_UNDERRUN, SET);
7548650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            pause_l();
75534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber            ensureCacheIsFetching_l();
7565b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            sendCacheStats();
7578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
7582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        } else if (eos || cachedDurationUs > kHighWaterMarkUs) {
7598650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            if (mFlags & CACHE_UNDERRUN) {
760df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                ALOGI("cache has filled up (%.2f secs), resuming.",
7618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
762a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(CACHE_UNDERRUN, CLEAR);
7638650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                play_l();
7648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
7658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else if (mFlags & PREPARING) {
7663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("cache has filled up (%.2f secs), prepare is done",
7678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
7688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                finishAsyncPrepare_l();
7692a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber            }
7702a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber        }
7710a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
7720a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
7730a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    postBufferingEvent_l();
7740726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber}
7750726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
7765b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongvoid AwesomePlayer::sendCacheStats() {
7775b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    sp<MediaPlayerBase> listener = mListener.promote();
778b33d2ac90cfce0fe6db8c3e979e7ae2bbfc28163James Dong    if (listener != NULL && mCachedSource != NULL) {
7795b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        int32_t kbps = 0;
7805b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        status_t err = mCachedSource->getEstimatedBandwidthKbps(&kbps);
7815b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        if (err == OK) {
7825b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            listener->sendEvent(
7835b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong                MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps);
7845b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        }
7855b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    }
7865b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong}
7875b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong
788bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() {
789bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    // Posted whenever any stream finishes playing.
790bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
791bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
792d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mStreamDoneEventPending) {
793d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
794d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
796bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
797ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber    if (mStreamDoneStatus != ERROR_END_OF_STREAM) {
7983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("MEDIA_ERROR %d", mStreamDoneStatus);
7995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(
8015d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber                MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
8025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
803b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
8045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
805a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AT_EOS, SET);
8065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
8075d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
8085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    const bool allDone =
8105d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS))
8115d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber            && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS));
8125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!allDone) {
8145d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
8155d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
8165d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
817cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber    if ((mFlags & LOOPING)
818cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber            || ((mFlags & AUTO_LOOPING)
819cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber                && (mAudioSink == NULL || mAudioSink->realtime()))) {
820cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber        // Don't AUTO_LOOP if we're being recorded, since that cannot be
821cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber        // turned off and recording would go on indefinitely.
822cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber
823bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        seekTo_l(0);
824bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
825a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        if (mVideoSource != NULL) {
826bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            postVideoEvent_l();
827bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
828bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
8293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("MEDIA_PLAYBACK_COMPLETE");
8305d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
831bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
832b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
8332e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
834a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AT_EOS, SET);
835bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
836bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
837bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
838bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() {
839bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
8400a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
841a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(CACHE_UNDERRUN, CLEAR);
8420a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
8437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return play_l();
8447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
845bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
8467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() {
847a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(SEEK_PREVIEW, CLEAR);
8482b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
849bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & PLAYING) {
850bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
851bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
852bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
853bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (!(mFlags & PREPARED)) {
854bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        status_t err = prepare_l();
855bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
856bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        if (err != OK) {
857bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            return err;
858bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
859bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
860bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
861a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PLAYING, SET);
862a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(FIRST_FRAME, SET);
863bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
864c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang    if (mDecryptHandle != NULL) {
865c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        int64_t position;
866c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        getPosition(&position);
867c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
868c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang                Playback::START, position / 1000);
869c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang    }
870c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang
871bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
872bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mAudioPlayer == NULL) {
873bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mAudioSink != NULL) {
874ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber                mAudioPlayer = new AudioPlayer(mAudioSink, this);
875bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mAudioPlayer->setSource(mAudioSource);
876e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
877f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mTimeSource = mAudioPlayer;
87888c030e0e0152791ff74f90249f55fce01371198Andreas Huber
879b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                // If there was a seek request before we ever started,
880b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                // honor the request now.
881b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                // Make sure to do this before starting the audio player
882b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                // to avoid a race condition.
883b874cd085bba63528c570f74c493bfea835190d9Andreas Huber                seekAudioIfNecessary_l();
884f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            }
885f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
88688c030e0e0152791ff74f90249f55fce01371198Andreas Huber
887f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        CHECK(!(mFlags & AUDIO_RUNNING));
888c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang
889f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (mVideoSource == NULL) {
8905442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            // We don't want to post an error notification at this point,
8915442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            // the error returned from MediaPlayer::start() will suffice.
8925442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber
8935442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            status_t err = startAudioPlayer_l(
8945442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber                    false /* sendErrorNotification */);
895bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
896f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            if (err != OK) {
897f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                delete mAudioPlayer;
898f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mAudioPlayer = NULL;
899bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
900a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags((PLAYING | FIRST_FRAME), CLEAR);
9011862a33b246249630b654182afb5914da3480d4cAndreas Huber
902f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                if (mDecryptHandle != NULL) {
903f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                    mDrmManagerClient->setPlaybackStatus(
904f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                            mDecryptHandle, Playback::STOP, 0);
905f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                }
906f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
907f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                return err;
908bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
911bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
912bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mTimeSource == NULL && mAudioPlayer == NULL) {
9135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSource = &mSystemTimeSource;
914bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
915bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
916bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
917a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        // Kick off video playback
918a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        postVideoEvent_l();
919145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
920145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        if (mAudioSource != NULL && mVideoSource != NULL) {
921145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber            postVideoLagEvent_l();
922145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        }
923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
924bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9252e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mFlags & AT_EOS) {
9262e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // Legacy behaviour, if a stream finishes playing and then
9272e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // is started again, we play from the start...
9282e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        seekTo_l(0);
9292e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
9302e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
9317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted
9327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        | IMediaPlayerService::kBatteryDataTrackDecoder;
9337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
9347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackAudio;
9357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
9367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mVideoSource != NULL) {
9377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackVideo;
9387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
9397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    addBatteryData(params);
9407cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
941bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
942bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
943bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9445442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huberstatus_t AwesomePlayer::startAudioPlayer_l(bool sendErrorNotification) {
945f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    CHECK(!(mFlags & AUDIO_RUNNING));
946f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
947f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioSource == NULL || mAudioPlayer == NULL) {
948f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        return OK;
949f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
950f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
951f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (!(mFlags & AUDIOPLAYER_STARTED)) {
952a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AUDIOPLAYER_STARTED, SET);
953f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
954c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        bool wasSeeking = mAudioPlayer->isSeeking();
955c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
956f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        // We've already started the MediaSource in order to enable
957f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        // the prefetcher to read its data.
958f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        status_t err = mAudioPlayer->start(
959f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                true /* sourceAlreadyStarted */);
960f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
961f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (err != OK) {
9625442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            if (sendErrorNotification) {
9635442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber                notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
9645442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            }
9655442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber
966f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            return err;
967f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
968c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
969c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        if (wasSeeking) {
970c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber            CHECK(!mAudioPlayer->isSeeking());
971c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
972c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber            // We will have finished the seek while starting the audio player.
97302f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber            postAudioSeekComplete();
974c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        }
975f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    } else {
976f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        mAudioPlayer->resume();
977f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
978f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
979a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(AUDIO_RUNNING, SET);
980f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
981f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    mWatchForAudioEOS = true;
982f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
983f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    return OK;
984f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber}
985f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
9865daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() {
9875daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
9885daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
989f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t cropLeft, cropTop, cropRight, cropBottom;
990f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    if (!meta->findRect(
991f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) {
992f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t width, height;
993f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        CHECK(meta->findInt32(kKeyWidth, &width));
994f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        CHECK(meta->findInt32(kKeyHeight, &height));
995f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
996f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropLeft = cropTop = 0;
997f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropRight = width - 1;
998f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropBottom = height - 1;
999f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
10003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("got dimensions only %d x %d", width, height);
1001f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    } else {
10023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("got crop rect %d, %d, %d, %d",
1003f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber             cropLeft, cropTop, cropRight, cropBottom);
1004f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    }
1005f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
10069cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    int32_t displayWidth;
10079cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) {
10083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth);
10099cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong        mDisplayWidth = displayWidth;
10109cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    }
10119cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    int32_t displayHeight;
10129cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) {
10133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight);
10149cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong        mDisplayHeight = displayHeight;
10159cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    }
10169cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong
1017f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t usableWidth = cropRight - cropLeft + 1;
1018f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t usableHeight = cropBottom - cropTop + 1;
1019b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    if (mDisplayWidth != 0) {
1020b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong        usableWidth = mDisplayWidth;
1021b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    }
1022b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    if (mDisplayHeight != 0) {
1023b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong        usableHeight = mDisplayHeight;
1024b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    }
10255daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1026a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
1027a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
1028a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoWidth = usableWidth;
1029a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoHeight = usableHeight;
1030a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
1031a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1032ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
1033ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
1034ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
1035ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
1036ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
1037ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
1038ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (rotationDegrees == 90 || rotationDegrees == 270) {
1039ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
1040f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth);
1041ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    } else {
1042ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
1043f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight);
1044ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
10455daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
10465daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1047bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() {
10481173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (mNativeWindow == NULL) {
10490a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        return;
10500a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    }
1051bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10520a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
1053bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10540a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t format;
10550a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    const char *component;
10560a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t decodedWidth, decodedHeight;
10570a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyColorFormat, &format));
10580a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findCString(kKeyDecoderComponent, &component));
10590a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
10600a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
10614844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
1062ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
1063ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
1064ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
1065ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
1066ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
1067ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
10680a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    mVideoRenderer.clear();
10694844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
10700a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // Must ensure that mVideoRenderer's destructor is actually executed
10710a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // before creating a new one.
10720a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    IPCThreadState::self()->flushCommands();
10730a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber
1074bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    if (USE_SURFACE_ALLOC
1075bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            && !strncmp(component, "OMX.", 4)
10762944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber            && strncmp(component, "OMX.google.", 11)
10772944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber            && strcmp(component, "OMX.Nvidia.mpeg2v.decode")) {
10780a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Hardware decoders avoid the CPU color conversion by decoding
10790a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // directly to ANativeBuffers, so we must use a renderer that
10800a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // just pushes those buffers to the ANativeWindow.
1081ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        mVideoRenderer =
10821173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees);
10830a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    } else {
10840a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Other decoders are instantiated locally and as a consequence
10850a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // allocate their buffers in local address space.  This renderer
10860a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // then performs a color conversion and copy to get the data
10870a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // into the ANativeBuffer.
10881173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta);
1089bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1090bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1091bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1092bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() {
1093bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
10940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1095a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(CACHE_UNDERRUN, CLEAR);
10960a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1097bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause_l();
1098bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1099bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1100b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) {
1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!(mFlags & PLAYING)) {
1102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1105c34233e673c9791e137456d0c427d58db184b690Andreas Huber    cancelPlayerEvents(true /* keepNotifications */);
1106bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1107f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) {
1108b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        if (at_eos) {
1109b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // If we played the audio stream to completion we
1110b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // want to make sure that all samples remaining in the audio
1111b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // track's queue are played out.
1112b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioPlayer->pause(true /* playPendingSamples */);
1113b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        } else {
1114b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioPlayer->pause();
1115b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        }
1116f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
1117a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AUDIO_RUNNING, CLEAR);
1118bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
11207a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if (mFlags & TEXTPLAYER_STARTED) {
11216655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver->pause();
1122a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(TEXT_RUNNING, CLEAR);
11237a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
11247a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1125a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PLAYING, CLEAR);
1126bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1127dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
1128dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                Playback::PAUSE, 0);
1130dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
1131dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
11327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
11337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
11347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackAudio;
11357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
11367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mVideoSource != NULL) {
11377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackVideo;
11387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
11397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
11407cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    addBatteryData(params);
11417cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1142bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1143bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1144bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1145bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const {
11460a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN);
1147bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1148bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
114963970b42f101c87db7cfd26d43b0d300260b1582Andreas Huberstatus_t AwesomePlayer::setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
11501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    Mutex::Autolock autoLock(mLock);
11511173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
115263970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    status_t err;
11531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (surfaceTexture != NULL) {
115463970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber        err = setNativeWindow_l(new SurfaceTextureClient(surfaceTexture));
115580ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang    } else {
115663970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber        err = setNativeWindow_l(NULL);
11571173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
115863970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber
115963970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    return err;
1160150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber}
11611173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
1162150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::shutdownVideoDecoder_l() {
1163150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mVideoBuffer) {
1164150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mVideoBuffer->release();
1165150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mVideoBuffer = NULL;
1166150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1167150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1168150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoSource->stop();
1169150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1170150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // The following hack is necessary to ensure that the OMX
1171150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // component is completely released by the time we may try
1172150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // to instantiate it again.
1173150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    wp<MediaSource> tmp = mVideoSource;
1174150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoSource.clear();
1175150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    while (tmp.promote() != NULL) {
1176150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        usleep(1000);
1177150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1178150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    IPCThreadState::self()->flushCommands();
11793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("video decoder shutdown completed");
1180150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber}
1181150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
118263970b42f101c87db7cfd26d43b0d300260b1582Andreas Huberstatus_t AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
1183150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mNativeWindow = native;
1184150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1185150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mVideoSource == NULL) {
118663970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber        return OK;
1187150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1188150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
11893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("attempting to reconfigure to use new surface");
1190150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1191150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    bool wasPlaying = (mFlags & PLAYING) != 0;
1192150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1193150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    pause_l();
1194150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoRenderer.clear();
1195150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1196150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    shutdownVideoDecoder_l();
1197150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
119863970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    status_t err = initVideoDecoder();
119963970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber
120063970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    if (err != OK) {
120129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("failed to reinstantiate video decoder after surface change.");
120263970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber        return err;
120363970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    }
1204150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1205150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mLastVideoTimeUs >= 0) {
1206150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mSeeking = SEEK;
1207150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mSeekTimeUs = mLastVideoTimeUs;
1208a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR);
1209150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1210150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1211150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (wasPlaying) {
1212150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        play_l();
1213150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
121463970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber
121563970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    return OK;
12165daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
12175daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink(
1219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const sp<MediaPlayerBase::AudioSink> &audioSink) {
1220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mAudioSink = audioSink;
1223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) {
1226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1228a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(LOOPING, CLEAR);
1229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (shouldLoop) {
1231a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(LOOPING, SET);
1232bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) {
12382415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    Mutex::Autolock autoLock(mMiscStateLock);
1239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mDurationUs < 0) {
1241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
1242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *durationUs = mDurationUs;
1245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1249bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) {
12502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    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) {
12756655174826330afe66ef766258181ae8c11f3f6cInsun Kang    if (mTextDriver != NULL) {
12767a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        if (index >= 0) { // to turn on a text track
12776655174826330afe66ef766258181ae8c11f3f6cInsun Kang            status_t err = mTextDriver->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
12936655174826330afe66ef766258181ae8c11f3f6cInsun Kang            return mTextDriver->setTimedTextTrackIndex(index);
12947a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        }
12957a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    } else {
12967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang        return INVALID_OPERATION;
12977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
12987a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang}
12997a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) {
13010a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    if (mFlags & CACHE_UNDERRUN) {
1302a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(CACHE_UNDERRUN, CLEAR);
13030a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        play_l();
13040a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
13050a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
13065dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) {
13075dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // Video playback completed before, there's no pending
13085dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // video event right now. In order for this new seek
13095dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // to be honored, we need to post one.
13105dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber
13115dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        postVideoEvent_l();
13125dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    }
13135dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber
131464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = SEEK;
13151321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    mSeekNotificationSent = false;
1316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = timeUs;
1317a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR);
1318bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    seekAudioIfNecessary_l();
1320bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13217a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    if (mFlags & TEXTPLAYER_STARTED) {
13226655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver->seekToAsync(mSeekTimeUs);
13237a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
13247a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
13251321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    if (!(mFlags & PLAYING)) {
13263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("seeking while paused, sending SEEK_COMPLETE notification"
13271321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber             " immediately.");
13281321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
13291321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
13301321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        mSeekNotificationSent = true;
13312b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
13322b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if ((mFlags & PREPARED) && mVideoSource != NULL) {
1333a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(SEEK_PREVIEW, SET);
13342b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            postVideoEvent_l();
13352b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        }
13361321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    }
13371321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
1338bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1339bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() {
134264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) {
1343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mAudioPlayer->seekTo(mSeekTimeUs);
1344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13451862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = true;
13461862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = true;
1347dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
1348dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        if (mDecryptHandle != NULL) {
1349dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1350dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::PAUSE, 0);
1351dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1352dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::START, mSeekTimeUs / 1000);
1353dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        }
1354bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1355bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1356bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
135788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) {
135888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1359bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
136088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack = source;
136188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
136288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
13637c5b72c1ea1a7a8ec40c1364e5e32043799c811fJames Dongvoid AwesomePlayer::addTextSource(const sp<MediaSource>& source) {
1364965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang    Mutex::Autolock autoLock(mTimedTextLock);
13657a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    CHECK(source != NULL);
13667a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
13676655174826330afe66ef766258181ae8c11f3f6cInsun Kang    if (mTextDriver == NULL) {
13686655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver = new TimedTextDriver(mListener);
13697a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
13707a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
13716655174826330afe66ef766258181ae8c11f3f6cInsun Kang    mTextDriver->addInBandTextSource(source);
13727a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang}
13737a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
137488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() {
137588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    sp<MetaData> meta = mAudioTrack->getFormat();
1376717826ececd8d39596f62418677721d70776add1Andreas Huber
1377717826ececd8d39596f62418677721d70776add1Andreas Huber    const char *mime;
1378717826ececd8d39596f62418677721d70776add1Andreas Huber    CHECK(meta->findCString(kKeyMIMEType, &mime));
1379717826ececd8d39596f62418677721d70776add1Andreas Huber
1380717826ececd8d39596f62418677721d70776add1Andreas Huber    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
138188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        mAudioSource = mAudioTrack;
1382717826ececd8d39596f62418677721d70776add1Andreas Huber    } else {
1383717826ececd8d39596f62418677721d70776add1Andreas Huber        mAudioSource = OMXCodec::Create(
138488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mClient.interface(), mAudioTrack->getFormat(),
1385717826ececd8d39596f62418677721d70776add1Andreas Huber                false, // createEncoder
138688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mAudioTrack);
1387717826ececd8d39596f62418677721d70776add1Andreas Huber    }
1388bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
1390bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
139188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
13922415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1394bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1395bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1396bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1397bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1398a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        status_t err = mAudioSource->start();
1399a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber
1400a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        if (err != OK) {
1401a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            mAudioSource.clear();
1402a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            return err;
1403a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        }
140481f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) {
140581f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // For legacy reasons we're simply going to ignore the absence
140681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // of an audio decoder for QCELP instead of aborting playback
140781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // altogether.
140881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        return OK;
140981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    }
1410e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
1411a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mAudioSource != NULL) {
1412a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
1413a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex);
1414a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1415a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        const char *component;
1416a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if (!mAudioSource->getFormat()
1417a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                ->findCString(kKeyDecoderComponent, &component)) {
1418a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            component = "none";
1419a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
1420a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1421a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        stat->mDecoderName = component;
1422a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
1423a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1424bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mAudioSource != NULL ? OK : UNKNOWN_ERROR;
1425bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1426bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
142788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) {
142888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1429bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
143088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack = source;
143188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
143288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
14332a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) {
14342eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten
14352eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // Either the application or the DRM system can independently say
14362eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // that there must be a hardware-protected path to an external video sink.
14372eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // For now we always require a hardware-protected path to external video sink
14382eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // if content is DRMed, but eventually this could be optional per DRM agent.
14392eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // When the application wants protection, then
14402eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    //   (USE_SURFACE_ALLOC && (mSurface != 0) &&
14412eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    //   (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp))
14422eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // will be true, but that part is already handled by SurfaceFlinger.
1443eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten
1444eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP
1445eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // For debugging, we allow a system property to control the protected usage.
1446eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // In case of uninitialized or unexpected property, we default to "DRM only".
1447eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    bool setProtectionBit = false;
1448eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    char value[PROPERTY_VALUE_MAX];
1449eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    if (property_get("persist.sys.hdcp_checking", value, NULL)) {
1450eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        if (!strcmp(value, "never")) {
1451eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            // nop
1452eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else if (!strcmp(value, "always")) {
1453eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            setProtectionBit = true;
1454eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else if (!strcmp(value, "drm-only")) {
1455eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            if (mDecryptHandle != NULL) {
1456eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten                setProtectionBit = true;
1457eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            }
1458eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        // property value is empty, or unexpected value
1459eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else {
1460eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            if (mDecryptHandle != NULL) {
1461eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten                setProtectionBit = true;
1462eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            }
1463eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        }
1464eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // can' read property value
1465eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    } else {
1466eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        if (mDecryptHandle != NULL) {
1467eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            setProtectionBit = true;
1468eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        }
1469eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    }
1470eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // note that usage bit is already cleared, so no need to clear it in the "else" case
1471eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    if (setProtectionBit) {
1472eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        flags |= OMXCodec::kEnableGrallocUsageProtected;
1473eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    }
1474eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else
14752eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    if (mDecryptHandle != NULL) {
14762eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten        flags |= OMXCodec::kEnableGrallocUsageProtected;
14772eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    }
1478eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif
14793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("initVideoDecoder flags=0x%x", flags);
1480bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoSource = OMXCodec::Create(
148188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            mClient.interface(), mVideoTrack->getFormat(),
1482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            false, // createEncoder
148339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            mVideoTrack,
14841173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
1485bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
1487bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
148888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
14892415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1490bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1492bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1493bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1494bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1495139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        status_t err = mVideoSource->start();
1496139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber
1497139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        if (err != OK) {
1498139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            mVideoSource.clear();
1499139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            return err;
1500139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        }
1501bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1502bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1503a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mVideoSource != NULL) {
150414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        const char *componentName;
1505a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        CHECK(mVideoSource->getFormat()
150614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                ->findCString(kKeyDecoderComponent, &componentName));
1507a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
150814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        {
150914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            Mutex::Autolock autoLock(mStatsLock);
151014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex);
151114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
151214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            stat->mDecoderName = componentName;
151314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        }
151414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
151514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        static const char *kPrefix = "OMX.Nvidia.";
151614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        static const char *kSuffix = ".decode";
151714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        static const size_t kSuffixLength = strlen(kSuffix);
151814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
151914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        size_t componentNameLength = strlen(componentName);
152014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
152114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        if (!strncmp(componentName, kPrefix, strlen(kPrefix))
152214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                && componentNameLength >= kSuffixLength
152314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                && !strcmp(&componentName[
152414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                    componentNameLength - kSuffixLength], kSuffix)) {
152514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            modifyFlags(SLOW_DECODER_HACK, SET);
152614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        }
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) {
15433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("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) {
16063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("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
16125ec58d925520e6913fba3fc54413881af751c610Andreas Huber                        : MediaSource::ReadOptions::SEEK_CLOSEST);
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) {
16223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("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) {
16373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("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) {
1676df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("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) {
169229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("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))) {
16986655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver->resume();
1699a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(TEXT_RUNNING, SET);
17007a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
17017a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1702f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber    TimeSource *ts =
1703f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber        ((mFlags & AUDIO_AT_EOS) || !(mFlags & AUDIOPLAYER_STARTED))
1704f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber            ? &mSystemTimeSource : mTimeSource;
17055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
1706bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & FIRST_FRAME) {
1707a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(FIRST_FRAME, CLEAR);
170814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        mSinceLastDropped = 0;
17095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs;
1710bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1711bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t realTimeUs, mediaTimeUs;
17135d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL
1714bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) {
1715bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;
1716bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1717bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
171864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking == SEEK_VIDEO_ONLY) {
171964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
172064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
172164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        int64_t latenessUs = nowUs - timeUs;
172264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
172364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (latenessUs > 0) {
1724df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6);
172564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
172664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
172764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
172864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking == NO_SEEK) {
172902a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber        // Let's display the first frame after seeking right away.
1730f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber
17312b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
1732bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17332b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        int64_t latenessUs = nowUs - timeUs;
17342b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
173564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (latenessUs > 500000ll
173664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mAudioPlayer != NULL
173764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mAudioPlayer->getMediaTimeMapping(
173864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    &realTimeUs, &mediaTimeUs)) {
1739df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("we're much too late (%.2f secs), video skipping ahead",
174064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                 latenessUs / 1E6);
174164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
174264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mVideoBuffer->release();
174364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mVideoBuffer = NULL;
174464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
174564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mSeeking = SEEK_VIDEO_ONLY;
174664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            mSeekTimeUs = mediaTimeUs;
174764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
174864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            postVideoEvent_l();
174964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber            return;
175064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
175164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
17522b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if (latenessUs > 40000) {
17532b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            // We're more than 40ms late.
17543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("we're late by %lld us (%.2f secs)",
1755dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber                 latenessUs, latenessUs / 1E6);
17562b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
175714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            if (!(mFlags & SLOW_DECODER_HACK)
175814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                    || mSinceLastDropped > FRAME_DROP_FREQ)
1759a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
17603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("we're late by %lld us (%.2f secs) dropping "
176114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                     "one after %d frames",
176214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                     latenessUs, latenessUs / 1E6, mSinceLastDropped);
1763a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
176414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                mSinceLastDropped = 0;
176514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                mVideoBuffer->release();
176614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                mVideoBuffer = NULL;
176714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
176814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                {
176914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                    Mutex::Autolock autoLock(mStatsLock);
177014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                    ++mStats.mNumVideoFramesDropped;
177114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                }
177214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
177314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                postVideoEvent_l();
177414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                return;
177514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            }
1776aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale        }
1777bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17782b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if (latenessUs < -10000) {
17792b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            // We're more than 10ms early.
1780bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17812b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            postVideoEvent_l(10000);
17822b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            return;
17832b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        }
1784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1785bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
178680ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang    if ((mNativeWindow != NULL)
178780ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang            && (mVideoRendererIsPreview || mVideoRenderer == NULL)) {
1788fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRendererIsPreview = false;
1789fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1790a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        initRenderer_l();
1791a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1792a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber
1793a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mVideoRenderer != NULL) {
179414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        mSinceLastDropped++;
1795a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        mVideoRenderer->render(mVideoBuffer);
1796a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1797bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1798f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    mVideoBuffer->release();
1799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoBuffer = NULL;
1800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
180164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) {
1802a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(SEEK_PREVIEW, CLEAR);
18032b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        return;
18042b1222f8938356669672f35e0e53e176c78c40efAndreas Huber    }
18052b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
1806bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    postVideoEvent_l();
1807bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1808bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1809bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) {
1810bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoEventPending) {
1811bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1812bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1813bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1814bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = true;
1815bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs);
1816bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1817bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
18185295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) {
1819bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mStreamDoneEventPending) {
1820bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1821bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1822bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = true;
18235295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber
18245295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    mStreamDoneStatus = status;
1825bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEvent(mStreamDoneEvent);
1826bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1827bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
182866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() {
182966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mBufferingEventPending) {
183066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        return;
183166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
183266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = true;
183366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mQueue.postEventWithDelay(mBufferingEvent, 1000000ll);
183466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
183566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
1836145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() {
1837145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (mVideoLagEventPending) {
1838145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        return;
1839145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
1840145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = true;
1841145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll);
1842145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber}
1843145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
184402f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent(int64_t delayUs) {
184502f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    Mutex::Autolock autoLock(mAudioLock);
18461862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mAudioStatusEventPending) {
18471862a33b246249630b654182afb5914da3480d4cAndreas Huber        return;
18481862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
18491862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = true;
185086d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent    // Do not honor delay when looping in order to limit audio gap
185186d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent    if (mFlags & (LOOPING | AUTO_LOOPING)) {
185286d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent        delayUs = 0;
185386d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent    }
185484b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber    mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs);
18551862a33b246249630b654182afb5914da3480d4cAndreas Huber}
18561862a33b246249630b654182afb5914da3480d4cAndreas Huber
18571862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() {
185802f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    {
185902f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber        Mutex::Autolock autoLock(mAudioLock);
186002f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber        if (!mAudioStatusEventPending) {
186102f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber            // Event was dispatched and while we were blocking on the mutex,
186202f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber            // has already been cancelled.
186302f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber            return;
186402f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber        }
186502f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber
186602f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber        mAudioStatusEventPending = false;
1867d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
1868d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber
186902f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    Mutex::Autolock autoLock(mLock);
18701862a33b246249630b654182afb5914da3480d4cAndreas Huber
18711862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) {
18721862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = false;
18731321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
18741321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        if (!mSeekNotificationSent) {
18751321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            notifyListener_l(MEDIA_SEEK_COMPLETE);
18761321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            mSeekNotificationSent = true;
18771321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        }
1878dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber
187964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        mSeeking = NO_SEEK;
18801862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
18811862a33b246249630b654182afb5914da3480d4cAndreas Huber
18825295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    status_t finalStatus;
18835295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) {
18841862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = false;
1885a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AUDIO_AT_EOS, SET);
1886a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(FIRST_FRAME, SET);
18875295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        postStreamDoneEvent_l(finalStatus);
18881862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
18891862a33b246249630b654182afb5914da3480d4cAndreas Huber}
18901862a33b246249630b654182afb5914da3480d4cAndreas Huber
1891c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() {
1892c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1893bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return prepare_l();
1894bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
1895c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1896bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() {
1897bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARED) {
1898bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return OK;
1899bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1900bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1901bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1902bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1903bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1904bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1905bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = false;
1906c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    status_t err = prepareAsync_l();
1907c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1908c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    if (err != OK) {
1909c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        return err;
1910c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1911c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1912bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
1913c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        mPreparedCondition.wait(mLock);
1914c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1915c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1916bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return mPrepareResult;
1917c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1918c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1919c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() {
1920c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1921bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1922bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1923bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1924bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1925bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1926bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = true;
1927c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return prepareAsync_l();
1928c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1929c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1930c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() {
1931bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1932bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1933c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1934c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
19352e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (!mQueueStarted) {
19362e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.start();
19372e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueueStarted = true;
19382e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
19392e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
1940a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARING, SET);
1941c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = new AwesomeEvent(
1942c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onPrepareAsyncEvent);
1943c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1944c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mQueue.postEvent(mAsyncPrepareEvent);
1945c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1946c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return OK;
1947c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1948c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1949bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() {
1950e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    sp<DataSource> dataSource;
1951e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1952681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    bool isWidevineStreaming = false;
1953681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (!strncasecmp("widevine://", mUri.string(), 11)) {
1954681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        isWidevineStreaming = true;
1955681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
1956681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        String8 newURI = String8("http://");
1957681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        newURI.append(mUri.string() + 11);
1958681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
1959681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mUri = newURI;
1960681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    }
1961681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
1962a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber    AString sniffedMIME;
1963a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
19648cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber    if (!strncasecmp("http://", mUri.string(), 7)
1965681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            || !strncasecmp("https://", mUri.string(), 8)
1966681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            || isWidevineStreaming) {
19671156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mConnectingDataSource = HTTPBase::Create(
19681156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                (mFlags & INCOGNITO)
19691156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                    ? HTTPBase::kFlagIncognito
19701156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                    : 0);
1971e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
19729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        if (mUIDValid) {
19739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber            mConnectingDataSource->setUID(mUID);
19749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        }
19759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
197649c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber        String8 cacheConfig;
197749c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber        bool disconnectAtHighwatermark;
197849c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber        NuCachedSource2::RemoveCacheSpecificHeaders(
197949c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber                &mUriHeaders, &cacheConfig, &disconnectAtHighwatermark);
198049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber
1981e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.unlock();
198279f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber        status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders);
1983e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.lock();
1984e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1985e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (err != OK) {
1986e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource.clear();
1987e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1988df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("mConnectingDataSource->connect() returned %d", err);
1989e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            return err;
1990e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
1991e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1992681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (!isWidevineStreaming) {
1993681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            // The widevine extractor does its own caching.
1994681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
19950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0
1996681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            mCachedSource = new NuCachedSource2(
1997681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                    new ThrottledSource(
1998681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                        mConnectingDataSource, 50 * 1024 /* bytes/sec */));
19990a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else
200049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber            mCachedSource = new NuCachedSource2(
200149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber                    mConnectingDataSource,
200249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber                    cacheConfig.isEmpty() ? NULL : cacheConfig.string(),
200349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber                    disconnectAtHighwatermark);
20040a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif
2005681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2006681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            dataSource = mCachedSource;
2007681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        } else {
2008681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            dataSource = mConnectingDataSource;
2009681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
2010681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2011e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mConnectingDataSource.clear();
20120a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
20136511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber        String8 contentType = dataSource->getMIMEType();
2014ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
20156511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber        if (strncasecmp(contentType.string(), "audio/", 6)) {
20166511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // We're not doing this for streams that appear to be audio-only
20176511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // streams to ensure that even low bandwidth streams start
20186511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // playing back fairly instantly.
2019ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
20206511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // We're going to prefill the cache before trying to instantiate
20216511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // the extractor below, as the latter is an operation that otherwise
20226511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // could block on the datasource for a significant amount of time.
20236511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // During that time we'd be unable to abort the preparation phase
20246511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // without this prefill.
2025e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            if (mCachedSource != NULL) {
2026e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // We're going to prefill the cache before trying to instantiate
2027e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // the extractor below, as the latter is an operation that otherwise
2028e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // could block on the datasource for a significant amount of time.
2029e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // During that time we'd be unable to abort the preparation phase
2030e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // without this prefill.
2031e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2032e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                mLock.unlock();
2033e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2034bab412099ab1bd3e9e942453cbb42c87ea9a59ecAndreas Huber                // Initially make sure we have at least 192 KB for the sniff
2035a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                // to complete without blocking.
2036bab412099ab1bd3e9e942453cbb42c87ea9a59ecAndreas Huber                static const size_t kMinBytesForSniffing = 192 * 1024;
2037a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2038a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                off64_t metaDataSize = -1ll;
2039e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                for (;;) {
2040e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    status_t finalStatus;
2041e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    size_t cachedDataRemaining =
2042e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                        mCachedSource->approxDataRemaining(&finalStatus);
2043e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2044a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                    if (finalStatus != OK
2045a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            || (metaDataSize >= 0
2046a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                                && cachedDataRemaining >= metaDataSize)
2047e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                            || (mFlags & PREPARE_CANCELLED)) {
2048e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                        break;
2049e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    }
20506511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
2051456caf3f5f0af673dc120c17c23635f40d8f5ac2Andreas Huber                    ALOGV("now cached %d bytes of data", cachedDataRemaining);
2052a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2053a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                    if (metaDataSize < 0
2054a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            && cachedDataRemaining >= kMinBytesForSniffing) {
2055a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        String8 tmp;
2056a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        float confidence;
2057a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        sp<AMessage> meta;
2058a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        if (!dataSource->sniff(&tmp, &confidence, &meta)) {
2059a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            mLock.lock();
2060a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            return UNKNOWN_ERROR;
2061a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        }
2062a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2063a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        // We successfully identified the file's extractor to
2064a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        // be, remember this mime type so we don't have to
2065a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        // sniff it again when we call MediaExtractor::Create()
2066a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        // below.
2067a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        sniffedMIME = tmp.string();
2068a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2069a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        if (meta == NULL
2070a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                                || !meta->findInt64(
2071a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                                    "meta-data-size", &metaDataSize)) {
2072a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            metaDataSize = kHighWaterMarkBytes;
2073a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        }
2074a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2075a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        CHECK_GE(metaDataSize, 0ll);
2076456caf3f5f0af673dc120c17c23635f40d8f5ac2Andreas Huber                        ALOGV("metaDataSize = %lld bytes", metaDataSize);
2077a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                    }
2078a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2079e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    usleep(200000);
20806511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber                }
20816511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
2082e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                mLock.lock();
2083ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            }
2084ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
2085e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            if (mFlags & PREPARE_CANCELLED) {
2086df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                ALOGI("Prepare cancelled while waiting for initial cache fill.");
2087e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                return UNKNOWN_ERROR;
2088e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            }
2089ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        }
2090e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    } else {
2091e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
2092e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
2093bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2094bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (dataSource == NULL) {
2095bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
2096bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2097bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2098681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    sp<MediaExtractor> extractor;
2099bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2100681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (isWidevineStreaming) {
2101681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        String8 mimeType;
2102681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        float confidence;
2103681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        sp<AMessage> dummy;
21049d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        bool success = SniffWVM(dataSource, &mimeType, &confidence, &dummy);
2105681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2106681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (!success
2107681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                || strcasecmp(
2108681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                    mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) {
2109681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            return ERROR_UNSUPPORTED;
2110681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
2111681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2112681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor = new WVMExtractor(dataSource);
2113681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor->setAdaptiveStreamingMode(true);
2114dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker        if (mUIDValid)
2115dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker            mWVMExtractor->setUID(mUID);
2116681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        extractor = mWVMExtractor;
2117681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else {
2118a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber        extractor = MediaExtractor::Create(
2119a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());
2120681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2121681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (extractor == NULL) {
2122681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            return UNKNOWN_ERROR;
2123681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
2124bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2125bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
21269d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    if (extractor->getDrmFlag()) {
21279d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        checkDrmStatus(dataSource);
2128dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
2129dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
2130681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    status_t err = setDataSource_l(extractor);
2131681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2132681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (err != OK) {
2133681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor.clear();
2134681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2135681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        return err;
2136681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    }
2137681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2138681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    return OK;
2139bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
2140bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
214188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) {
214288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(err != OK);
214388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
214488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    if (mIsAsyncPrepare) {
214588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
214688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    }
214788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
214888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPrepareResult = err;
2149a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR);
215088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAsyncPrepareEvent = NULL;
215188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPreparedCondition.broadcast();
215288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
215388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
2154e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static
2155e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) {
2156e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie);
2157e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
2158e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    return (me->mFlags & PREPARE_CANCELLED) == 0;
2159e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber}
2160e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
2161c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() {
21628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    Mutex::Autolock autoLock(mLock);
2163bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
21648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mFlags & PREPARE_CANCELLED) {
2165df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("prepare was cancelled before doing anything");
21668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        abortPrepare(UNKNOWN_ERROR);
21678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return;
21688650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
2169e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
21708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mUri.size() > 0) {
21718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = finishSetDataSource_l();
2172bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
21738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
21748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
21758650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
2176bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
21778650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
2178bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
21798650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mVideoTrack != NULL && mVideoSource == NULL) {
21808650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initVideoDecoder();
21811322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
21828650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
21838650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
21848650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
21851322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
21868650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
21871322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
21888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mAudioTrack != NULL && mAudioSource == NULL) {
21898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initAudioDecoder();
21901322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
21918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
21928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
21938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
21941322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
2195c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
2196c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2197a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARING_CONNECTED, SET);
21986a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
21992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (isStreamingHTTP()) {
22008650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        postBufferingEvent_l();
22018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    } else {
22028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        finishAsyncPrepare_l();
22038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
22048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
2205c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
22068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() {
2207bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mIsAsyncPrepare) {
22085daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber        if (mVideoSource == NULL) {
2209bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0);
2210bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        } else {
22115daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber            notifyVideoSize_l();
2212bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
2213c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2214bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        notifyListener_l(MEDIA_PREPARED);
2215bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2216c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2217bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPrepareResult = OK;
2218a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR);
2219a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARED, SET);
2220c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = NULL;
2221bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPreparedCondition.broadcast();
2222c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
2223c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2224acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const {
2225acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return mExtractorFlags;
2226acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber}
2227acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
222884b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postAudioEOS(int64_t delayUs) {
222902f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    postCheckAudioStatusEvent(delayUs);
2230ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
2231ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
2232ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() {
223302f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    postCheckAudioStatusEvent(0);
2234ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
2235ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
22364f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::setParameter(int key, const Parcel &request) {
2237965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang    switch (key) {
2238965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        case KEY_PARAMETER_TIMED_TEXT_TRACK_INDEX:
2239965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        {
2240965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            Mutex::Autolock autoLock(mTimedTextLock);
2241965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            return setTimedTextTrackIndex(request.readInt32());
2242965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        }
2243965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        case KEY_PARAMETER_TIMED_TEXT_ADD_OUT_OF_BAND_SOURCE:
2244965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        {
2245965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            Mutex::Autolock autoLock(mTimedTextLock);
22466655174826330afe66ef766258181ae8c11f3f6cInsun Kang            if (mTextDriver == NULL) {
22476655174826330afe66ef766258181ae8c11f3f6cInsun Kang                mTextDriver = new TimedTextDriver(mListener);
2248965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            }
2249965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang
22506655174826330afe66ef766258181ae8c11f3f6cInsun Kang            return mTextDriver->addOutOfBandTextSource(request);
2251965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        }
22525b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        case KEY_PARAMETER_CACHE_STAT_COLLECT_FREQ_MS:
22535b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        {
22545b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            return setCacheStatCollectFreq(request);
22555b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        }
22567a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi        case KEY_PARAMETER_PLAYBACK_RATE_PERMILLE:
22577a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi        {
22587a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi            if (mAudioPlayer != NULL) {
22597a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi                return mAudioPlayer->setPlaybackRatePermille(request.readInt32());
22607a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi            } else {
22617a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi                return NO_INIT;
22627a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi            }
22637a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi        }
2264965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        default:
2265965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        {
2266965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            return ERROR_UNSUPPORTED;
2267965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        }
22687a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
22694f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
22704f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
22715b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t AwesomePlayer::setCacheStatCollectFreq(const Parcel &request) {
22725b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    if (mCachedSource != NULL) {
22735b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        int32_t freqMs = request.readInt32();
2274b8a805261bf0282e992d3608035e47d05a898710Steve Block        ALOGD("Request to keep cache stats in the past %d ms",
22755b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            freqMs);
22765b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        return mCachedSource->setCacheStatCollectFreq(freqMs);
22775b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    }
22785b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    return ERROR_UNSUPPORTED;
22795b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong}
22805b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong
22814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::getParameter(int key, Parcel *reply) {
2282cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    switch (key) {
2283cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    case KEY_PARAMETER_AUDIO_CHANNEL_COUNT:
2284cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        {
2285cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            int32_t channelCount;
2286cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            if (mAudioTrack == 0 ||
2287cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten                    !mAudioTrack->getFormat()->findInt32(kKeyChannelCount, &channelCount)) {
2288cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten                channelCount = 0;
2289cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            }
2290cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            reply->writeInt32(channelCount);
2291cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        }
2292cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        return OK;
2293cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    default:
2294cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        {
2295cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            return ERROR_UNSUPPORTED;
2296cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        }
2297cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    }
22984f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
2299ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
2300681755fc0d0797506456f46a2a10555916d6be32Andreas Huberbool AwesomePlayer::isStreamingHTTP() const {
2301681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    return mCachedSource != NULL || mWVMExtractor != NULL;
2302681755fc0d0797506456f46a2a10555916d6be32Andreas Huber}
2303681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2304a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huberstatus_t AwesomePlayer::dump(int fd, const Vector<String16> &args) const {
2305a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    Mutex::Autolock autoLock(mStatsLock);
2306a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2307a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    FILE *out = fdopen(dup(fd), "w");
2308a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2309a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, " AwesomePlayer\n");
2310a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mStats.mFd < 0) {
2311a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "  URI(%s)", mStats.mURI.string());
2312a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    } else {
2313a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "  fd(%d)", mStats.mFd);
2314a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2315a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2316a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, ", flags(0x%08x)", mStats.mFlags);
2317a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2318a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mStats.mBitrate >= 0) {
2319a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, ", bitrate(%lld bps)", mStats.mBitrate);
2320a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2321a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2322a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, "\n");
2323a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2324a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    for (size_t i = 0; i < mStats.mTracks.size(); ++i) {
2325a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        const TrackStat &stat = mStats.mTracks.itemAt(i);
2326a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2327a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "  Track %d\n", i + 1);
2328a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "   MIME(%s)", stat.mMIME.string());
2329a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2330a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if (!stat.mDecoderName.isEmpty()) {
2331a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            fprintf(out, ", decoder(%s)", stat.mDecoderName.string());
2332a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
2333a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2334a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "\n");
2335a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2336a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if ((ssize_t)i == mStats.mVideoTrackIndex) {
2337a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            fprintf(out,
2338a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "   videoDimensions(%d x %d), "
2339a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "numVideoFramesDecoded(%lld), "
2340a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "numVideoFramesDropped(%lld)\n",
2341a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mVideoWidth,
2342a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mVideoHeight,
2343a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mNumVideoFramesDecoded,
2344a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mNumVideoFramesDropped);
2345a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
2346a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2347a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2348a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fclose(out);
2349a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    out = NULL;
2350a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2351a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    return OK;
2352a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber}
2353a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2354a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Hubervoid AwesomePlayer::modifyFlags(unsigned value, FlagMode mode) {
2355a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    switch (mode) {
2356a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case SET:
2357a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags |= value;
2358a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2359a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case CLEAR:
2360a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags &= ~value;
2361a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2362a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case ASSIGN:
2363a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags = value;
2364a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2365a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        default:
2366a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            TRESPASS();
2367a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2368a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2369a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
2370a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
2371a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFlags = mFlags;
2372a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2373a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber}
2374a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2375bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}  // namespace android
2376