AwesomePlayer.cpp revision 94ea60f975c3eb7ce6d2a4430538a42a5fc3babd
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"
212163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis#define ATRACE_TAG ATRACE_TAG_VIDEO
22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h>
232163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis#include <utils/Trace.h>
24bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
25988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h>
26988e3f0b2c74095deae580157c57935a98573052Andreas Huber
27bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h"
28681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/DRMExtractor.h"
29733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h"
300a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h"
310a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h"
32bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h"
33681755fc0d0797506456f46a2a10555916d6be32Andreas Huber#include "include/WVMExtractor.h"
34bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
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>
403254b25e8b0f674ccc2226609e01dd86a600802eInsun Kang#include <media/stagefright/timedtext/TimedTextDriver.h>
41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h>
42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h>
43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h>
44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h>
45717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h>
46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h>
47bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h>
48bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h>
49bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h>
5094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald#include <media/stagefright/Utils.h>
51717826ececd8d39596f62418677721d70776add1Andreas Huber
528ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h>
531a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.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
6994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald// maximum time in paused state when offloading audio decompression. When elapsed, the AudioPlayer
7094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald// is destroyed to allow the audio DSP to power down.
7194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgeraldstatic int64_t kOffloadPauseMaxUs = 60000000ll;
7294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
7394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event {
75c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    AwesomeEvent(
76c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            AwesomePlayer *player,
77c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            void (AwesomePlayer::*method)())
78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        : mPlayer(player),
79c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber          mMethod(method) {
80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected:
83bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual ~AwesomeEvent() {}
84bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
85bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
86c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        (mPlayer->*mMethod)();
87bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
88bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
89bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate:
90bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomePlayer *mPlayer;
91c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    void (AwesomePlayer::*mMethod)();
92bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
93bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent(const AwesomeEvent &);
94bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent &operator=(const AwesomeEvent &);
95bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber};
96bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
97733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer {
98733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(
991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            const sp<ANativeWindow> &nativeWindow, const sp<MetaData> &meta)
1001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        : mTarget(new SoftwareRenderer(nativeWindow, meta)) {
101733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
102733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
103733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual void render(MediaBuffer *buffer) {
104fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        render((const uint8_t *)buffer->data() + buffer->range_offset(),
105fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber               buffer->range_length());
106fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
107fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
108fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    void render(const void *data, size_t size) {
109fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mTarget->render(data, size, NULL);
110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected:
113733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual ~AwesomeLocalRenderer() {
114733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        delete mTarget;
115733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        mTarget = NULL;
116733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
117733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
118733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate:
1190a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    SoftwareRenderer *mTarget;
120988e3f0b2c74095deae580157c57935a98573052Andreas Huber
121733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(const AwesomeLocalRenderer &);
122733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
123733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber};
124733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer {
126ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    AwesomeNativeWindowRenderer(
127ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            const sp<ANativeWindow> &nativeWindow,
128ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            int32_t rotationDegrees)
1296a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        : mNativeWindow(nativeWindow) {
130ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        applyRotation(rotationDegrees);
1316a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1326a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1336a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual void render(MediaBuffer *buffer) {
1342163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis        ATRACE_CALL();
135593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        int64_t timeUs;
136593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs));
137593e2773f616a926af45e74359e21a898c89875fGlenn Kasten        native_window_set_buffers_timestamp(mNativeWindow.get(), timeUs * 1000);
1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        status_t err = mNativeWindow->queueBuffer(
1391e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis                mNativeWindow.get(), buffer->graphicBuffer().get(), -1);
1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        if (err != 0) {
14129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("queueBuffer failed with error %s (%d)", strerror(-err),
1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                    -err);
1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            return;
1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        }
1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1466a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        sp<MetaData> metaData = buffer->meta_data();
1476a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        metaData->setInt32(kKeyRendered, 1);
1486a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1496a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1506a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected:
1516a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual ~AwesomeNativeWindowRenderer() {}
1526a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1536a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate:
1546a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<ANativeWindow> mNativeWindow;
1556a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
156ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    void applyRotation(int32_t rotationDegrees) {
157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        uint32_t transform;
158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        switch (rotationDegrees) {
159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 0: transform = 0; break;
160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 90: transform = HAL_TRANSFORM_ROT_90; break;
161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 180: transform = HAL_TRANSFORM_ROT_180; break;
162ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 270: transform = HAL_TRANSFORM_ROT_270; break;
163ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            default: transform = 0; break;
164ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
165ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
166ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        if (transform) {
167ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            CHECK_EQ(0, native_window_set_buffers_transform(
168ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                        mNativeWindow.get(), transform));
169ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
170ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
171ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
1726a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &);
1736a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer &operator=(
1746a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            const AwesomeNativeWindowRenderer &);
1756a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis};
1766a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1777cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang// To collect the decoder usage
1787cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wangvoid addBatteryData(uint32_t params) {
1797cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    sp<IBinder> binder =
1807cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        defaultServiceManager()->getService(String16("media.player"));
1817cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
1827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    CHECK(service.get() != NULL);
1837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    service->addBatteryData(params);
1857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang}
186e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
1877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang////////////////////////////////////////////////////////////////////////////////
188bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer()
1892e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    : mQueueStarted(false),
1909b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mUIDValid(false),
1912e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber      mTimeSource(NULL),
192c374dae535b83d9b499dd9fe8f9dabdb8b0ac9fdJames Dong      mVideoRenderingStarted(false),
193fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber      mVideoRendererIsPreview(false),
194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mAudioPlayer(NULL),
195b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong      mDisplayWidth(0),
196b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong      mDisplayHeight(0),
1974f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong      mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW),
198bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber      mFlags(0),
199acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber      mExtractorFlags(0),
2007b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber      mVideoBuffer(NULL),
201150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber      mDecryptHandle(NULL),
2027a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang      mLastVideoTimeUs(-1),
20394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald      mTextDriver(NULL),
20494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald      mOffloadAudio(false),
20594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald      mAudioTearDown(false) {
206e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    CHECK_EQ(mClient.connect(), (status_t)OK);
207bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    DataSource::RegisterDefaultSniffers();
209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
210c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
212c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone);
213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
214c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate);
21566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
216145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoLagUpdate);
217145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoEventPending = false;
218c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
219c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mCheckAudioStatusEvent = new AwesomeEvent(
220c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onCheckAudioStatus);
221c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2221862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
22494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mAudioTearDownEvent = new AwesomeEvent(this,
22594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                              &AwesomePlayer::onAudioTearDownEvent);
22694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mAudioTearDownEventPending = false;
22794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
229bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() {
2322e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mQueueStarted) {
2332e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.stop();
2342e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
238bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mClient.disconnect();
239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
241c34233e673c9791e137456d0c427d58db184b690Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepNotifications) {
242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mVideoEvent->eventID());
243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
244145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mQueue.cancelEvent(mVideoLagEvent->eventID());
245145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = false;
24666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
24794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (mOffloadAudio) {
24894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mQueue.cancelEvent(mAudioTearDownEvent->eventID());
24994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mAudioTearDownEventPending = false;
25094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
25194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
252c34233e673c9791e137456d0c427d58db184b690Andreas Huber    if (!keepNotifications) {
253c34233e673c9791e137456d0c427d58db184b690Andreas Huber        mQueue.cancelEvent(mStreamDoneEvent->eventID());
254c34233e673c9791e137456d0c427d58db184b690Andreas Huber        mStreamDoneEventPending = false;
255c34233e673c9791e137456d0c427d58db184b690Andreas Huber        mQueue.cancelEvent(mCheckAudioStatusEvent->eventID());
256c34233e673c9791e137456d0c427d58db184b690Andreas Huber        mAudioStatusEventPending = false;
257c34233e673c9791e137456d0c427d58db184b690Andreas Huber
25866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mQueue.cancelEvent(mBufferingEvent->eventID());
25966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mBufferingEventPending = false;
26066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2630726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) {
264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mListener = listener;
266bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
267bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2689b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid AwesomePlayer::setUID(uid_t uid) {
2693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("AwesomePlayer running on behalf of uid %d", uid);
2709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
2719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
2729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
2739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
2749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
2755561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource(
2765561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
277bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
2787b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(uri, headers);
2797b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
285bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri = uri;
28666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
287bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (headers) {
288bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mUriHeaders = *headers;
2897314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2907314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        ssize_t index = mUriHeaders.indexOfKey(String8("x-hide-urls-from-log"));
2917314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        if (index >= 0) {
2927314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            // Browser is in "incognito" mode, suppress logging URLs.
2937314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
2947314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            // This isn't something that should be passed to the server.
2957314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber            mUriHeaders.removeItemsAt(index);
2967314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
297a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(INCOGNITO, SET);
2987314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber        }
2997314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber    }
3007314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber
30153ae1640ffbfc690962f7f94694b02680c6f66cbJames Dong    ALOGI("setDataSource_l(URL suppressed)");
30266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
303bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // The actual work will be done during preparation in the call to
304bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // ::finishSetDataSource_l to avoid blocking the calling thread in
305bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // setDataSource for any significant time.
30666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
307a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
308a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
309a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFd = -1;
310a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mURI = mUri;
311a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
312a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
313bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return OK;
314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource(
317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int fd, int64_t offset, int64_t length) {
318bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
320bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
321bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3227b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<DataSource> dataSource = new FileSource(fd, offset, length);
323bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    status_t err = dataSource->initCheck();
325bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
326bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
327bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
328bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
329bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3307b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource = dataSource;
3317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
332a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
333a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
334a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFd = fd;
335a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mURI = String8();
336a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
337a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
3387b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(dataSource);
3397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
3407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
341e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t AwesomePlayer::setDataSource(const sp<IStreamSource> &source) {
34285704836f33a199d7e442a23db82abbd5620d35dAndreas Huber    return INVALID_OPERATION;
343e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
344e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
3457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
3467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const sp<DataSource> &dataSource) {
3477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
349bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (extractor == NULL) {
350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3539d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    if (extractor->getDrmFlag()) {
3549d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        checkDrmStatus(dataSource);
3559d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    }
3569d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong
3579d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    return setDataSource_l(extractor);
3589d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong}
3599d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong
3609d2f386dd2885eaffa11fd494ae258bb09fe6397James Dongvoid AwesomePlayer::checkDrmStatus(const sp<DataSource>& dataSource) {
361785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong    dataSource->getDrmInfo(mDecryptHandle, &mDrmManagerClient);
362785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong    if (mDecryptHandle != NULL) {
363785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong        CHECK(mDrmManagerClient);
364785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong        if (RightsStatus::RIGHTS_VALID != mDecryptHandle->status) {
365785ee06d106cd7958e0c151ebc6b7174d9ba861eJames Dong            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_DRM_NO_LICENSE);
3668f64134f749e4f7861a08a3063450fc714c4651dGloria Wang        }
367dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
368bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
369bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
370bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
3717fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // Attempt to approximate overall stream bitrate by summing all
3727fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // tracks' individual bitrates, if not all of them advertise bitrate,
3737fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // we have to fail.
3747fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3757fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t totalBitRate = 0;
3767fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
377eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    mExtractor = extractor;
3787fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
3797fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
3807fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3817fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        int32_t bitrate;
3827fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        if (!meta->findInt32(kKeyBitRate, &bitrate)) {
383a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            const char *mime;
384a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            CHECK(meta->findCString(kKeyMIMEType, &mime));
3853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("track of type '%s' does not publish bitrate", mime);
386a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
3877fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            totalBitRate = -1;
3887fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            break;
3897fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        }
3907fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3917fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        totalBitRate += bitrate;
3927fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
3937fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3947fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = totalBitRate;
3957fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("mBitrate = %lld bits/sec", mBitrate);
3977fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
398a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
399a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
400a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mBitrate = mBitrate;
401a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mTracks.clear();
402a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mAudioTrackIndex = -1;
403a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoTrackIndex = -1;
404a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
405a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
406bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveAudio = false;
407bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveVideo = false;
408bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
409bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
410bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
41132bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        const char *_mime;
41232bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &_mime));
413bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
41432bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        String8 mime = String8(_mime);
41532bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber
41632bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        if (!haveVideo && !strncasecmp(mime.string(), "video/", 6)) {
41788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setVideoSource(extractor->getTrack(i));
41888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveVideo = true;
419b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong
420b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            // Set the presentation/display size
421b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            int32_t displayWidth, displayHeight;
422b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            bool success = meta->findInt32(kKeyDisplayWidth, &displayWidth);
423b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            if (success) {
424b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                success = meta->findInt32(kKeyDisplayHeight, &displayHeight);
425b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            }
426b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            if (success) {
427b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                mDisplayWidth = displayWidth;
428b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong                mDisplayHeight = displayHeight;
429b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong            }
430b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong
431a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
432a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                Mutex::Autolock autoLock(mStatsLock);
433a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mVideoTrackIndex = mStats.mTracks.size();
434a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mTracks.push();
435a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                TrackStat *stat =
436a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex);
43732bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber                stat->mMIME = mime.string();
438a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            }
43932bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        } else if (!haveAudio && !strncasecmp(mime.string(), "audio/", 6)) {
44088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setAudioSource(extractor->getTrack(i));
44188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveAudio = true;
442ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong            mActiveAudioTrackIndex = i;
4438ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber
444a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
445a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                Mutex::Autolock autoLock(mStatsLock);
446a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mAudioTrackIndex = mStats.mTracks.size();
447a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                mStats.mTracks.push();
448a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                TrackStat *stat =
449a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex);
45032bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber                stat->mMIME = mime.string();
451a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            }
452a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
45332bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber            if (!strcasecmp(mime.string(), MEDIA_MIMETYPE_AUDIO_VORBIS)) {
4546954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // Only do this for vorbis audio, none of the other audio
4556954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // formats even support this ringtone specific hack and
4566954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // retrieving the metadata on some extractors may turn out
4576954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // to be very expensive.
4586954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                sp<MetaData> fileMeta = extractor->getMetaData();
4596954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                int32_t loop;
4606954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                if (fileMeta != NULL
4616954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                        && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) {
462a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    modifyFlags(AUTO_LOOPING, SET);
4636954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                }
4648ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber            }
46532bdfd5acb76a02e82e0059c8bd892bc1f73a7e3Andreas Huber        } else if (!strcasecmp(mime.string(), MEDIA_MIMETYPE_TEXT_3GPP)) {
4666a3969cc3bcbfc84dbcc27aa726eb96bc03a830bEdwin Wong            addTextSource_l(i, extractor->getTrack(i));
467bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
468bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
469bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
470acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    if (!haveAudio && !haveVideo) {
4718a74c9b8e2627560ae5a92d4261f0de4464490adEdwin Wong        if (mWVMExtractor != NULL) {
4728a74c9b8e2627560ae5a92d4261f0de4464490adEdwin Wong            return mWVMExtractor->getError();
4738a74c9b8e2627560ae5a92d4261f0de4464490adEdwin Wong        } else {
4748a74c9b8e2627560ae5a92d4261f0de4464490adEdwin Wong            return UNKNOWN_ERROR;
4758a74c9b8e2627560ae5a92d4261f0de4464490adEdwin Wong        }
476acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
477acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
478acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = extractor->flags();
479acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
480acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
481bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
483bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() {
484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
485bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
487bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
488bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() {
489c374dae535b83d9b499dd9fe8f9dabdb8b0ac9fdJames Dong    mVideoRenderingStarted = false;
490ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    mActiveAudioTrackIndex = -1;
491b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    mDisplayWidth = 0;
492b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    mDisplayHeight = 0;
49365a170e3ac593a29abd0c76e9aa531fabad7f56dAndreas Huber
494dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
495dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
496dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::STOP, 0);
497dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDecryptHandle = NULL;
498dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient = NULL;
499dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
500dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
5017cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mFlags & PLAYING) {
5027cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
5037cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
5047cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            params |= IMediaPlayerService::kBatteryDataTrackAudio;
5057cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        }
5067cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        if (mVideoSource != NULL) {
5077cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang            params |= IMediaPlayerService::kBatteryDataTrackVideo;
5087cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        }
5097cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        addBatteryData(params);
5107cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
5117cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
512e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mFlags & PREPARING) {
513a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(PREPARE_CANCELLED, SET);
514e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (mConnectingDataSource != NULL) {
515df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("interrupting the connection process");
516e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource->disconnect();
517e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
5186a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
5196a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        if (mFlags & PREPARING_CONNECTED) {
5206a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // We are basically done preparing, we're just buffering
5216a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // enough data to start playback, we can safely interrupt that.
5226a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            finishAsyncPrepare_l();
5236a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        }
524e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
525e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
526bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
527bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mPreparedCondition.wait(mLock);
528bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
529bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
530bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    cancelPlayerEvents();
531bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
532681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    mWVMExtractor.clear();
5330a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mCachedSource.clear();
53488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack.clear();
53588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack.clear();
536eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    mExtractor.clear();
53788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
53894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // Shutdown audio first, so that the response to the reset request
5397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // appears to happen instantaneously as far as the user is concerned
5407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // If we did this later, audio would continue playing while we
5417b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // shutdown the video-related resources and the player appear to
5427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // not be as responsive to a reset request.
5435b75fdc8fbc026453888cbb2d3fe31345394618bGloria Wang    if ((mAudioPlayer == NULL || !(mFlags & AUDIOPLAYER_STARTED))
5445b75fdc8fbc026453888cbb2d3fe31345394618bGloria Wang            && mAudioSource != NULL) {
545e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // If we had an audio player, it would have effectively
546e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // taken possession of the audio source and stopped it when
547e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // _it_ is stopped. Otherwise this is still our responsibility.
548e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mAudioSource->stop();
549e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
5507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioSource.clear();
55194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mOmxSource.clear();
5527b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5537b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mTimeSource = NULL;
5547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5557b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete mAudioPlayer;
5567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioPlayer = NULL;
5577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5586655174826330afe66ef766258181ae8c11f3f6cInsun Kang    if (mTextDriver != NULL) {
5596655174826330afe66ef766258181ae8c11f3f6cInsun Kang        delete mTextDriver;
5606655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver = NULL;
5617a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
5627a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
563b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber    mVideoRenderer.clear();
564b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber
565bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
566150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        shutdownVideoDecoder_l();
567bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
568bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
569bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mDurationUs = -1;
570a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(0, ASSIGN);
571acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = 0;
572bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mTimeSourceDeltaUs = 0;
573bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoTimeUs = 0;
574bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
57564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = NO_SEEK;
576af64a8a6ad89f52685e822dca30742a4132c9ae6Gloria Wang    mSeekNotificationSent = true;
577bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = 0;
57866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
579bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri.setTo("");
580bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUriHeaders.clear();
5817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource.clear();
5837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
5847fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = -1;
585150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mLastVideoTimeUs = -1;
586a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
587a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
588a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
589a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFd = -1;
590a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mURI = String8();
591a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mBitrate = -1;
592a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mAudioTrackIndex = -1;
593a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoTrackIndex = -1;
594a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mNumVideoFramesDecoded = 0;
595a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mNumVideoFramesDropped = 0;
596a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoWidth = -1;
597a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoHeight = -1;
598a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFlags = 0;
599a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mTracks.clear();
600a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
601a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
60299590d29c9d3081cadfccd036842f5ce9a7debefAndreas Huber    mWatchForAudioSeekComplete = false;
60399590d29c9d3081cadfccd036842f5ce9a7debefAndreas Huber    mWatchForAudioEOS = false;
604bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
605bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
606c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) {
60794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if ((mListener != NULL) && !mAudioTearDown) {
6080726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        sp<MediaPlayerBase> listener = mListener.promote();
6090726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
6100726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        if (listener != NULL) {
611c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            listener->sendEvent(msg, ext1, ext2);
61266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        }
61366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
61466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
61566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
6167fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) {
617c7fc37a3dab9bd1f96713649f351b5990e6316ffJames Dong    off64_t size;
618776a0023f5146423e88474c35691eb0e20fc8102Ajay Dudani    if (mDurationUs > 0 && mCachedSource != NULL
6197fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            && mCachedSource->getSize(&size) == OK) {
6207fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = size * 8000000ll / mDurationUs;  // in bits/sec
6217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
6227fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
6237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mBitrate >= 0) {
6257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = mBitrate;
6267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
6277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
6287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    *bitrate = 0;
6307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    return false;
6327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber}
6337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
6348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable.
6358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) {
6367fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t bitrate;
6378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
638b9b8d14d89019ba7b9d183f0fbad2af924a0cd95hovanchen    if (mCachedSource != NULL && getBitrate(&bitrate) && (bitrate > 0)) {
6391bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        status_t finalStatus;
6401bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
6418650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        *durationUs = cachedDataRemaining * 8000000ll / bitrate;
6421bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        *eos = (finalStatus != OK);
6438650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return true;
644681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else if (mWVMExtractor != NULL) {
645681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        status_t finalStatus;
646681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        *durationUs = mWVMExtractor->getCachedDurationUs(&finalStatus);
647681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        *eos = (finalStatus != OK);
648681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        return true;
6498650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
6508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
6518650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    return false;
6528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
6538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
65434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() {
65534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    if (mCachedSource != NULL) {
65634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber        mCachedSource->resumeFetchingIfNecessary();
65734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    }
65834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber}
65934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
660145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::onVideoLagUpdate() {
661145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    Mutex::Autolock autoLock(mLock);
662145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (!mVideoLagEventPending) {
663145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        return;
664145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
665145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = false;
666145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
667145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    int64_t audioTimeUs = mAudioPlayer->getMediaTimeUs();
668145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    int64_t videoLateByUs = audioTimeUs - mVideoTimeUs;
669145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
6705dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    if (!(mFlags & VIDEO_AT_EOS) && videoLateByUs > 300000ll) {
6713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("video late by %lld ms.", videoLateByUs / 1000ll);
672145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
673145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        notifyListener_l(
674145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                MEDIA_INFO,
675145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                MEDIA_INFO_VIDEO_TRACK_LAGGING,
676145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber                videoLateByUs / 1000ll);
677145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
678145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
679145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    postVideoLagEvent_l();
680145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber}
681145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
68266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() {
68366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    Mutex::Autolock autoLock(mLock);
684d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mBufferingEventPending) {
685d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
686d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
68766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
68866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
6898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mCachedSource != NULL) {
6901bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        status_t finalStatus;
6911bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus);
6921bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney        bool eos = (finalStatus != OK);
693c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
6948650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (eos) {
6951bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney            if (finalStatus == ERROR_END_OF_STREAM) {
6961bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney                notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
6971bd233ce7e1aa7730bc18d46ffd57791391738cdBryan Mawhinney            }
69883977eb230d829cfe520f55d7977037a904ce548Andreas Huber            if (mFlags & PREPARING) {
6993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("cache has reached EOS, prepare is done.");
70083977eb230d829cfe520f55d7977037a904ce548Andreas Huber                finishAsyncPrepare_l();
70183977eb230d829cfe520f55d7977037a904ce548Andreas Huber            }
7028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        } else {
7037fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            int64_t bitrate;
7047fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            if (getBitrate(&bitrate)) {
7058650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                size_t cachedSize = mCachedSource->cachedSize();
7068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate;
707c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
7088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
7098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if (percentage > 100) {
7108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    percentage = 100;
7118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
712c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
7138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
7148650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else {
7158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // We don't know the bitrate of the stream, use absolute size
7168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // limits to maintain the cache.
7178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
7188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if ((mFlags & PLAYING) && !eos
7198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        && (cachedDataRemaining < kLowWaterMarkBytes)) {
720df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                    ALOGI("cache is running low (< %d) , pausing.",
7218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                         kLowWaterMarkBytes);
722a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    modifyFlags(CACHE_UNDERRUN, SET);
7238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    pause_l();
72434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber                    ensureCacheIsFetching_l();
7255b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong                    sendCacheStats();
7268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
7278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) {
7288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    if (mFlags & CACHE_UNDERRUN) {
729df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                        ALOGI("cache has filled up (> %d), resuming.",
7308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
731a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                        modifyFlags(CACHE_UNDERRUN, CLEAR);
7328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        play_l();
7338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    } else if (mFlags & PREPARING) {
7343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                        ALOGV("cache has filled up (> %d), prepare is done",
7358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
7368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        finishAsyncPrepare_l();
7378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    }
7388650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
7398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            }
7408650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        }
741681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else if (mWVMExtractor != NULL) {
742681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        status_t finalStatus;
743681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
744681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        int64_t cachedDurationUs
745681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            = mWVMExtractor->getCachedDurationUs(&finalStatus);
746681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
747681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        bool eos = (finalStatus != OK);
748681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
749681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (eos) {
750681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (finalStatus == ERROR_END_OF_STREAM) {
751681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
752681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
753681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (mFlags & PREPARING) {
7543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("cache has reached EOS, prepare is done.");
755681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                finishAsyncPrepare_l();
756681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
757681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        } else {
758681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
759681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            if (percentage > 100) {
760681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                percentage = 100;
761681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            }
762681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
763681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
764681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
7652415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
7662415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber
7678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    int64_t cachedDurationUs;
7682a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber    bool eos;
7698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (getCachedDuration_l(&cachedDurationUs, &eos)) {
7703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("cachedDurationUs = %.2f secs, eos=%d",
77134ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber             cachedDurationUs / 1E6, eos);
77234ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
7738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if ((mFlags & PLAYING) && !eos
7748650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                && (cachedDurationUs < kLowWaterMarkUs)) {
775a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(CACHE_UNDERRUN, SET);
776a3fafcb4ee6d6344f2b5b602d095a4ffebc8dbb7Jeff Tinker            ALOGI("cache is running low (%.2f secs) , pausing.",
777a3fafcb4ee6d6344f2b5b602d095a4ffebc8dbb7Jeff Tinker                  cachedDurationUs / 1E6);
778a3fafcb4ee6d6344f2b5b602d095a4ffebc8dbb7Jeff Tinker            pause_l();
779a3fafcb4ee6d6344f2b5b602d095a4ffebc8dbb7Jeff Tinker            ensureCacheIsFetching_l();
780f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker            sendCacheStats();
7818650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
7822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        } else if (eos || cachedDurationUs > kHighWaterMarkUs) {
7838650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            if (mFlags & CACHE_UNDERRUN) {
784a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(CACHE_UNDERRUN, CLEAR);
785a3fafcb4ee6d6344f2b5b602d095a4ffebc8dbb7Jeff Tinker                ALOGI("cache has filled up (%.2f secs), resuming.",
786a3fafcb4ee6d6344f2b5b602d095a4ffebc8dbb7Jeff Tinker                      cachedDurationUs / 1E6);
787a3fafcb4ee6d6344f2b5b602d095a4ffebc8dbb7Jeff Tinker                play_l();
7888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else if (mFlags & PREPARING) {
7893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("cache has filled up (%.2f secs), prepare is done",
7908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
7918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                finishAsyncPrepare_l();
7922a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber            }
7932a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber        }
7940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
7950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
7960a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    postBufferingEvent_l();
7970726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber}
7980726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
7995b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongvoid AwesomePlayer::sendCacheStats() {
8005b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    sp<MediaPlayerBase> listener = mListener.promote();
801f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker    if (listener != NULL) {
8025b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        int32_t kbps = 0;
803f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker        status_t err = UNKNOWN_ERROR;
804f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker        if (mCachedSource != NULL) {
805f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker            err = mCachedSource->getEstimatedBandwidthKbps(&kbps);
806f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker        } else if (mWVMExtractor != NULL) {
807f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker            err = mWVMExtractor->getEstimatedBandwidthKbps(&kbps);
808f10f36d34812bae602ff018fb503ad07eaf550b1Jeffrey Tinker        }
8095b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        if (err == OK) {
8105b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            listener->sendEvent(
8115b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong                MEDIA_INFO, MEDIA_INFO_NETWORK_BANDWIDTH, kbps);
8125b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        }
8135b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    }
8145b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong}
8155b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong
816bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() {
817bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    // Posted whenever any stream finishes playing.
8182163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
819bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
820bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
821d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mStreamDoneEventPending) {
822d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
823d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
824bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
825bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
826ed8d14f6a934072cd012992c4ef16990a54baa9aAndreas Huber    if (mStreamDoneStatus != ERROR_END_OF_STREAM) {
8273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("MEDIA_ERROR %d", mStreamDoneStatus);
8285d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8295d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(
8305d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber                MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
8315d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
832b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
8335d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
834a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AT_EOS, SET);
8355d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
8365d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
8375d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8385d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    const bool allDone =
8395d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS))
8405d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber            && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS));
8415d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
8425d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!allDone) {
8435d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
8445d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
8455d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
846cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber    if ((mFlags & LOOPING)
847cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber            || ((mFlags & AUTO_LOOPING)
848cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber                && (mAudioSink == NULL || mAudioSink->realtime()))) {
849cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber        // Don't AUTO_LOOP if we're being recorded, since that cannot be
850cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber        // turned off and recording would go on indefinitely.
851cdef698dae0c6dd89755f6494cc3d4b163f410efAndreas Huber
852bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        seekTo_l(0);
853bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
854a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        if (mVideoSource != NULL) {
855bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            postVideoEvent_l();
856bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
857bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
8583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("MEDIA_PLAYBACK_COMPLETE");
8595d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
860bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
861b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
8622e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
86394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // If audio hasn't completed MEDIA_SEEK_COMPLETE yet,
86494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // notify MEDIA_SEEK_COMPLETE to observer immediately for state persistence.
86594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mWatchForAudioSeekComplete) {
86694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            notifyListener_l(MEDIA_SEEK_COMPLETE);
86794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mWatchForAudioSeekComplete = false;
86894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
86994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
870a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AT_EOS, SET);
871bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
872bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
873bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
874bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() {
8752163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
8762163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
877bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
8780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
879a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(CACHE_UNDERRUN, CLEAR);
8800a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
8817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return play_l();
8827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
883bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
8847b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() {
885a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(SEEK_PREVIEW, CLEAR);
8862b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
887bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & PLAYING) {
888bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
889bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
890bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
891bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (!(mFlags & PREPARED)) {
892bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        status_t err = prepare_l();
893bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
894bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        if (err != OK) {
895bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            return err;
896bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
897bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
898bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
899a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PLAYING, SET);
900a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(FIRST_FRAME, SET);
901bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
902c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang    if (mDecryptHandle != NULL) {
903c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        int64_t position;
904c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        getPosition(&position);
905c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
906c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang                Playback::START, position / 1000);
907c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang    }
908c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang
909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mAudioPlayer == NULL) {
91194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            createAudioPlayer_l();
912f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
91388c030e0e0152791ff74f90249f55fce01371198Andreas Huber
914f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        CHECK(!(mFlags & AUDIO_RUNNING));
915c130b5bf563d049bd391ccd96985ac278ef8ff8dGloria Wang
916f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (mVideoSource == NULL) {
91794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
9185442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            // We don't want to post an error notification at this point,
9195442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            // the error returned from MediaPlayer::start() will suffice.
9205442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber
9215442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            status_t err = startAudioPlayer_l(
9225442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber                    false /* sendErrorNotification */);
923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
92494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            if ((err != OK) && mOffloadAudio) {
92594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                ALOGI("play_l() cannot create offload output, fallback to sw decode");
92694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                delete mAudioPlayer;
92794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                mAudioPlayer = NULL;
92894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                // if the player was started it will take care of stopping the source when destroyed
92994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                if (!(mFlags & AUDIOPLAYER_STARTED)) {
93094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                    mAudioSource->stop();
93194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                }
93294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                modifyFlags((AUDIO_RUNNING | AUDIOPLAYER_STARTED), CLEAR);
93394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                mOffloadAudio = false;
93494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                mAudioSource = mOmxSource;
93594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                if (mAudioSource != NULL) {
93694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                    err = mAudioSource->start();
93794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
93894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                    if (err != OK) {
93994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        mAudioSource.clear();
94094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                    } else {
94194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        createAudioPlayer_l();
94294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                        err = startAudioPlayer_l(false);
94394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                    }
94494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald                }
94594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            }
94694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
947f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            if (err != OK) {
948f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                delete mAudioPlayer;
949f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                mAudioPlayer = NULL;
950bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
951a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags((PLAYING | FIRST_FRAME), CLEAR);
9521862a33b246249630b654182afb5914da3480d4cAndreas Huber
953f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                if (mDecryptHandle != NULL) {
954f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                    mDrmManagerClient->setPlaybackStatus(
955f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                            mDecryptHandle, Playback::STOP, 0);
956f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                }
957f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
958f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                return err;
959bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
961bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
962bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
963bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mTimeSource == NULL && mAudioPlayer == NULL) {
9645d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSource = &mSystemTimeSource;
965bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
966bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
967bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
968a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        // Kick off video playback
969a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        postVideoEvent_l();
970145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
971145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        if (mAudioSource != NULL && mVideoSource != NULL) {
972145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber            postVideoLagEvent_l();
973145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        }
974bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
975bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9762e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mFlags & AT_EOS) {
9772e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // Legacy behaviour, if a stream finishes playing and then
9782e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // is started again, we play from the start...
9792e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        seekTo_l(0);
9802e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
9812e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
9827cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    uint32_t params = IMediaPlayerService::kBatteryDataCodecStarted
9837cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        | IMediaPlayerService::kBatteryDataTrackDecoder;
9847cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
9857cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackAudio;
9867cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
9877cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mVideoSource != NULL) {
9887cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackVideo;
9897cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
9907cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    addBatteryData(params);
9917cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
992bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
993bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
994bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
99594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgeraldvoid AwesomePlayer::createAudioPlayer_l()
99694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald{
99794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    uint32_t flags = 0;
99894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    int64_t cachedDurationUs;
99994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    bool eos;
100094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
100194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (mOffloadAudio) {
100294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        flags |= AudioPlayer::USE_OFFLOAD;
100394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    } else if (mVideoSource == NULL
100494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            && (mDurationUs > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US ||
100594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            (getCachedDuration_l(&cachedDurationUs, &eos) &&
100694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            cachedDurationUs > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US))) {
100794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        flags |= AudioPlayer::ALLOW_DEEP_BUFFERING;
100894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
100994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (isStreamingHTTP()) {
101094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        flags |= AudioPlayer::IS_STREAMING;
101194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
101294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (mVideoSource != NULL) {
101394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        flags |= AudioPlayer::HAS_VIDEO;
101494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
101594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
101694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mAudioPlayer = new AudioPlayer(mAudioSink, flags, this);
101794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mAudioPlayer->setSource(mAudioSource);
101894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
101994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mTimeSource = mAudioPlayer;
102094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
102194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // If there was a seek request before we ever started,
102294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // honor the request now.
102394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // Make sure to do this before starting the audio player
102494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // to avoid a race condition.
102594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    seekAudioIfNecessary_l();
102694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald}
102794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
10285442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huberstatus_t AwesomePlayer::startAudioPlayer_l(bool sendErrorNotification) {
1029f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    CHECK(!(mFlags & AUDIO_RUNNING));
103094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    status_t err = OK;
1031f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
1032f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioSource == NULL || mAudioPlayer == NULL) {
1033f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        return OK;
1034f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
1035f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
103694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (mOffloadAudio) {
103794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mQueue.cancelEvent(mAudioTearDownEvent->eventID());
103894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mAudioTearDownEventPending = false;
103994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
104094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
1041f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (!(mFlags & AUDIOPLAYER_STARTED)) {
1042c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        bool wasSeeking = mAudioPlayer->isSeeking();
1043c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
1044f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        // We've already started the MediaSource in order to enable
1045f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        // the prefetcher to read its data.
104694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        err = mAudioPlayer->start(
1047f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber                true /* sourceAlreadyStarted */);
1048f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
1049f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (err != OK) {
10505442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            if (sendErrorNotification) {
10515442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber                notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
10525442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber            }
10535442cb59e8483e18b3a02400d431d167ea7074b3Andreas Huber
1054f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            return err;
1055f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
1056c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
1057a6490c65f93e1cbe969fba499978e8d64214108aAndreas Huber        modifyFlags(AUDIOPLAYER_STARTED, SET);
1058a6490c65f93e1cbe969fba499978e8d64214108aAndreas Huber
1059c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        if (wasSeeking) {
1060c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber            CHECK(!mAudioPlayer->isSeeking());
1061c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber
1062c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber            // We will have finished the seek while starting the audio player.
106302f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber            postAudioSeekComplete();
1064c0dfc5b02d4179769bbdd25c10d430576ec09568Andreas Huber        }
1065f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    } else {
106694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        err = mAudioPlayer->resume();
1067f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
1068f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
106994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (err == OK) {
107094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        modifyFlags(AUDIO_RUNNING, SET);
1071f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
107294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mWatchForAudioEOS = true;
107394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
1074f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
107594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    return err;
1076f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber}
1077f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
10785daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() {
10792163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
10805daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
10815daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1082f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t cropLeft, cropTop, cropRight, cropBottom;
1083f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    if (!meta->findRect(
1084f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                kKeyCropRect, &cropLeft, &cropTop, &cropRight, &cropBottom)) {
1085f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t width, height;
1086f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        CHECK(meta->findInt32(kKeyWidth, &width));
1087f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        CHECK(meta->findInt32(kKeyHeight, &height));
1088f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
1089f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropLeft = cropTop = 0;
1090f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropRight = width - 1;
1091f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        cropBottom = height - 1;
1092f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
10933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("got dimensions only %d x %d", width, height);
1094f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    } else {
10953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("got crop rect %d, %d, %d, %d",
1096f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber             cropLeft, cropTop, cropRight, cropBottom);
1097f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    }
1098f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
10999cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    int32_t displayWidth;
11009cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    if (meta->findInt32(kKeyDisplayWidth, &displayWidth)) {
11013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Display width changed (%d=>%d)", mDisplayWidth, displayWidth);
11029cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong        mDisplayWidth = displayWidth;
11039cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    }
11049cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    int32_t displayHeight;
11059cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    if (meta->findInt32(kKeyDisplayHeight, &displayHeight)) {
11063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("Display height changed (%d=>%d)", mDisplayHeight, displayHeight);
11079cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong        mDisplayHeight = displayHeight;
11089cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong    }
11099cbb1a6f99003a9cd8765e11b9d7380e67839f82James Dong
1110f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t usableWidth = cropRight - cropLeft + 1;
1111f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    int32_t usableHeight = cropBottom - cropTop + 1;
1112b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    if (mDisplayWidth != 0) {
1113b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong        usableWidth = mDisplayWidth;
1114b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    }
1115b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    if (mDisplayHeight != 0) {
1116b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong        usableHeight = mDisplayHeight;
1117b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    }
11185daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1119a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
1120a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
1121a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoWidth = usableWidth;
1122a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mVideoHeight = usableHeight;
1123a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
1124a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1125ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
1126ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
1127ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
1128ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
1129ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
1130ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
1131ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (rotationDegrees == 90 || rotationDegrees == 270) {
1132ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
1133f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                MEDIA_SET_VIDEO_SIZE, usableHeight, usableWidth);
1134ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    } else {
1135ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
1136f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber                MEDIA_SET_VIDEO_SIZE, usableWidth, usableHeight);
1137ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
11385daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
11395daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1140bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() {
11412163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
11422163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
11431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    if (mNativeWindow == NULL) {
11440a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        return;
11450a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    }
1146bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
11470a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
1148bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
11490a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t format;
11500a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    const char *component;
11510a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t decodedWidth, decodedHeight;
11520a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyColorFormat, &format));
11530a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findCString(kKeyDecoderComponent, &component));
11540a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
11550a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
11564844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
1157ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
1158ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
1159ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
1160ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
1161ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
1162ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
11630a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    mVideoRenderer.clear();
11644844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
11650a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // Must ensure that mVideoRenderer's destructor is actually executed
11660a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // before creating a new one.
11670a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    IPCThreadState::self()->flushCommands();
11680a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber
11694f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong    // Even if set scaling mode fails, we will continue anyway
11704f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong    setVideoScalingMode_l(mVideoScalingMode);
1171bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber    if (USE_SURFACE_ALLOC
1172bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber            && !strncmp(component, "OMX.", 4)
11732944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber            && strncmp(component, "OMX.google.", 11)
11742944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber            && strcmp(component, "OMX.Nvidia.mpeg2v.decode")) {
11750a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Hardware decoders avoid the CPU color conversion by decoding
11760a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // directly to ANativeBuffers, so we must use a renderer that
11770a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // just pushes those buffers to the ANativeWindow.
1178ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        mVideoRenderer =
11791173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            new AwesomeNativeWindowRenderer(mNativeWindow, rotationDegrees);
11800a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    } else {
11810a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Other decoders are instantiated locally and as a consequence
11820a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // allocate their buffers in local address space.  This renderer
11830a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // then performs a color conversion and copy to get the data
11840a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // into the ANativeBuffer.
11851173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        mVideoRenderer = new AwesomeLocalRenderer(mNativeWindow, meta);
1186bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1188bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() {
11902163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
11912163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
1192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
11930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1194a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(CACHE_UNDERRUN, CLEAR);
11950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause_l();
1197bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1198bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1199b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) {
1200bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!(mFlags & PLAYING)) {
1201bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
1202bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1203bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1204c34233e673c9791e137456d0c427d58db184b690Andreas Huber    cancelPlayerEvents(true /* keepNotifications */);
1205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1206f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) {
120794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // If we played the audio stream to completion we
120894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // want to make sure that all samples remaining in the audio
120994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // track's queue are played out.
121094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mAudioPlayer->pause(at_eos /* playPendingSamples */);
121194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // send us a reminder to tear down the AudioPlayer if paused for too long.
121294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mOffloadAudio) {
121394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            postAudioTearDownEvent(kOffloadPauseMaxUs);
1214b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        }
1215a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AUDIO_RUNNING, CLEAR);
1216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1218f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    if (mFlags & TEXTPLAYER_INITIALIZED) {
12196655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver->pause();
1220a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(TEXT_RUNNING, CLEAR);
12217a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
12227a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1223a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PLAYING, CLEAR);
1224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1225dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
1226dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1227dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                Playback::PAUSE, 0);
1228dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
1229dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
12307cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    uint32_t params = IMediaPlayerService::kBatteryDataTrackDecoder;
12317cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if ((mAudioSource != NULL) && (mAudioSource != mAudioTrack)) {
12327cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackAudio;
12337cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
12347cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    if (mVideoSource != NULL) {
12357cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang        params |= IMediaPlayerService::kBatteryDataTrackVideo;
12367cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    }
12377cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
12387cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang    addBatteryData(params);
12397cf180c9bff69e5cc4a2f4e53b432db45ebbebabGloria Wang
1240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const {
12440a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN);
1245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12478ba01021b573889802e67e029225a96f0dfa471aAndy McFaddenstatus_t AwesomePlayer::setSurfaceTexture(const sp<IGraphicBufferProducer> &bufferProducer) {
12481173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    Mutex::Autolock autoLock(mLock);
12491173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
125063970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    status_t err;
12518ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer != NULL) {
12521a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        err = setNativeWindow_l(new Surface(bufferProducer));
125380ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang    } else {
125463970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber        err = setNativeWindow_l(NULL);
12551173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    }
125663970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber
125763970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    return err;
1258150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber}
12591173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
1260150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Hubervoid AwesomePlayer::shutdownVideoDecoder_l() {
1261150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mVideoBuffer) {
1262150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mVideoBuffer->release();
1263150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mVideoBuffer = NULL;
1264150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1265150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1266150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoSource->stop();
1267150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1268150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // The following hack is necessary to ensure that the OMX
1269150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // component is completely released by the time we may try
1270150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    // to instantiate it again.
1271150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    wp<MediaSource> tmp = mVideoSource;
1272150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoSource.clear();
1273150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    while (tmp.promote() != NULL) {
1274150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        usleep(1000);
1275150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1276150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    IPCThreadState::self()->flushCommands();
12773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("video decoder shutdown completed");
1278150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber}
1279150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
128063970b42f101c87db7cfd26d43b0d300260b1582Andreas Huberstatus_t AwesomePlayer::setNativeWindow_l(const sp<ANativeWindow> &native) {
1281150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mNativeWindow = native;
1282150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1283150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mVideoSource == NULL) {
128463970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber        return OK;
1285150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1286150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
12873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("attempting to reconfigure to use new surface");
1288150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1289150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    bool wasPlaying = (mFlags & PLAYING) != 0;
1290150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1291150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    pause_l();
1292150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mVideoRenderer.clear();
1293150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1294150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    shutdownVideoDecoder_l();
1295150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
129663970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    status_t err = initVideoDecoder();
129763970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber
129863970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    if (err != OK) {
129929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block        ALOGE("failed to reinstantiate video decoder after surface change.");
130063970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber        return err;
130163970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    }
1302150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1303150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (mLastVideoTimeUs >= 0) {
1304150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mSeeking = SEEK;
1305150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        mSeekTimeUs = mLastVideoTimeUs;
1306a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR);
1307150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
1308150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
1309150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    if (wasPlaying) {
1310150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber        play_l();
1311150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    }
131263970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber
131363970b42f101c87db7cfd26d43b0d300260b1582Andreas Huber    return OK;
13145daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
13155daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink(
1317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const sp<MediaPlayerBase::AudioSink> &audioSink) {
1318bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1320bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mAudioSink = audioSink;
1321bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1322bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1323bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) {
1324bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1325bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1326a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(LOOPING, CLEAR);
1327bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1328bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (shouldLoop) {
1329a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(LOOPING, SET);
1330bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1331bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1332bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) {
13362415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    Mutex::Autolock autoLock(mMiscStateLock);
1337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1338bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mDurationUs < 0) {
1339bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
1340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *durationUs = mDurationUs;
1343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) {
13482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mSeeking != NO_SEEK) {
1349dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber        *positionUs = mSeekTimeUs;
13505dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    } else if (mVideoSource != NULL
13515dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber            && (mAudioPlayer == NULL || !(mFlags & VIDEO_AT_EOS))) {
13522415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        Mutex::Autolock autoLock(mMiscStateLock);
1353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mVideoTimeUs;
1354bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else if (mAudioPlayer != NULL) {
1355bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mAudioPlayer->getMediaTimeUs();
1356bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
1357bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = 0;
1358bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1359bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1360bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1361bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1362bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) {
13632163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
13642163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
136570f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber    if (mExtractorFlags & MediaExtractor::CAN_SEEK) {
1366acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        Mutex::Autolock autoLock(mLock);
1367acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return seekTo_l(timeUs);
1368acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
1369acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
1370acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
1371bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1372bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1373bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) {
13740a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    if (mFlags & CACHE_UNDERRUN) {
1375a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(CACHE_UNDERRUN, CLEAR);
13760a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        play_l();
13770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
13780a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
13795dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    if ((mFlags & PLAYING) && mVideoSource != NULL && (mFlags & VIDEO_AT_EOS)) {
13805dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // Video playback completed before, there's no pending
13815dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // video event right now. In order for this new seek
13825dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        // to be honored, we need to post one.
13835dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber
13845dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        postVideoEvent_l();
13855dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber    }
13865dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber
138764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = SEEK;
13881321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    mSeekNotificationSent = false;
1389bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = timeUs;
1390a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS), CLEAR);
1391bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1392bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    seekAudioIfNecessary_l();
1393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1394f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    if (mFlags & TEXTPLAYER_INITIALIZED) {
13956655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver->seekToAsync(mSeekTimeUs);
13967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
13977a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
13981321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    if (!(mFlags & PLAYING)) {
13993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("seeking while paused, sending SEEK_COMPLETE notification"
14001321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber             " immediately.");
14011321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
14021321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
14031321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        mSeekNotificationSent = true;
14042b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
14052b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if ((mFlags & PREPARED) && mVideoSource != NULL) {
1406a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            modifyFlags(SEEK_PREVIEW, SET);
14072b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            postVideoEvent_l();
14082b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        }
14091321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    }
14101321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
1411bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1412bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1413bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1414bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() {
141564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) {
1416bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mAudioPlayer->seekTo(mSeekTimeUs);
1417bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
14181862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = true;
14191862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = true;
1420dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
1421dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        if (mDecryptHandle != NULL) {
1422dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1423dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::PAUSE, 0);
1424dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1425dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::START, mSeekTimeUs / 1000);
1426dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        }
1427bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1428bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1429bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
143088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) {
143188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1432bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
143388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack = source;
143488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
143588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
14366a3969cc3bcbfc84dbcc27aa726eb96bc03a830bEdwin Wongvoid AwesomePlayer::addTextSource_l(size_t trackIndex, const sp<MediaSource>& source) {
14377a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    CHECK(source != NULL);
14387a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
14396655174826330afe66ef766258181ae8c11f3f6cInsun Kang    if (mTextDriver == NULL) {
14406655174826330afe66ef766258181ae8c11f3f6cInsun Kang        mTextDriver = new TimedTextDriver(mListener);
14417a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
14427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1443eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    mTextDriver->addInBandTextSource(trackIndex, source);
14447a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang}
14457a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
144688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() {
14472163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
14482163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
144988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    sp<MetaData> meta = mAudioTrack->getFormat();
1450717826ececd8d39596f62418677721d70776add1Andreas Huber
1451717826ececd8d39596f62418677721d70776add1Andreas Huber    const char *mime;
1452717826ececd8d39596f62418677721d70776add1Andreas Huber    CHECK(meta->findCString(kKeyMIMEType, &mime));
145394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // Check whether there is a hardware codec for this stream
145494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // This doesn't guarantee that the hardware has a free stream
145594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // but it avoids us attempting to open (and re-open) an offload
145694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // stream to hardware that doesn't have the necessary codec
145794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mOffloadAudio = canOffloadStream(meta, (mVideoSource != NULL), isStreamingHTTP());
1458717826ececd8d39596f62418677721d70776add1Andreas Huber
1459717826ececd8d39596f62418677721d70776add1Andreas Huber    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
146094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        ALOGV("createAudioPlayer: bypass OMX (raw)");
146188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        mAudioSource = mAudioTrack;
1462717826ececd8d39596f62418677721d70776add1Andreas Huber    } else {
146394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // If offloading we still create a OMX decoder as a fall-back
146494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // but we don't start it
146594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mOmxSource = OMXCodec::Create(
146688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mClient.interface(), mAudioTrack->getFormat(),
1467717826ececd8d39596f62418677721d70776add1Andreas Huber                false, // createEncoder
146888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mAudioTrack);
146994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
147094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mOffloadAudio) {
147194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            ALOGV("createAudioPlayer: bypass OMX (offload)");
147294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mAudioSource = mAudioTrack;
147394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        } else {
147494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mAudioSource = mOmxSource;
147594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
1476717826ececd8d39596f62418677721d70776add1Andreas Huber    }
1477bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1478bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
1479bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
148088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
14812415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1483bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1485bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1486bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1487a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        status_t err = mAudioSource->start();
1488a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber
1489a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        if (err != OK) {
1490a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            mAudioSource.clear();
149194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            mOmxSource.clear();
1492a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            return err;
1493a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        }
149481f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) {
149581f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // For legacy reasons we're simply going to ignore the absence
149681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // of an audio decoder for QCELP instead of aborting playback
149781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // altogether.
149881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        return OK;
149981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    }
1500e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
1501a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mAudioSource != NULL) {
1502a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
1503a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mAudioTrackIndex);
1504a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        const char *component;
1505a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if (!mAudioSource->getFormat()
1506a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                ->findCString(kKeyDecoderComponent, &component)) {
1507a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            component = "none";
1508a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
1509a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1510a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        stat->mDecoderName = component;
1511a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
1512a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1513bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mAudioSource != NULL ? OK : UNKNOWN_ERROR;
1514bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1515bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
151688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) {
151788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1518bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
151988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack = source;
152088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
152188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
15222a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) {
15232163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
15242eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten
15252eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // Either the application or the DRM system can independently say
15262eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // that there must be a hardware-protected path to an external video sink.
15272eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // For now we always require a hardware-protected path to external video sink
15282eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // if content is DRMed, but eventually this could be optional per DRM agent.
15292eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // When the application wants protection, then
15302eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    //   (USE_SURFACE_ALLOC && (mSurface != 0) &&
15312eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    //   (mSurface->getFlags() & ISurfaceComposer::eProtectedByApp))
15322eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    // will be true, but that part is already handled by SurfaceFlinger.
1533eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten
1534eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#ifdef DEBUG_HDCP
1535eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // For debugging, we allow a system property to control the protected usage.
1536eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // In case of uninitialized or unexpected property, we default to "DRM only".
1537eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    bool setProtectionBit = false;
1538eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    char value[PROPERTY_VALUE_MAX];
1539eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    if (property_get("persist.sys.hdcp_checking", value, NULL)) {
1540eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        if (!strcmp(value, "never")) {
1541eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            // nop
1542eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else if (!strcmp(value, "always")) {
1543eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            setProtectionBit = true;
1544eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else if (!strcmp(value, "drm-only")) {
1545eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            if (mDecryptHandle != NULL) {
1546eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten                setProtectionBit = true;
1547eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            }
1548eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        // property value is empty, or unexpected value
1549eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        } else {
1550eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            if (mDecryptHandle != NULL) {
1551eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten                setProtectionBit = true;
1552eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            }
1553eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        }
1554eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // can' read property value
1555eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    } else {
1556eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        if (mDecryptHandle != NULL) {
1557eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten            setProtectionBit = true;
1558eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        }
1559eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    }
1560eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    // note that usage bit is already cleared, so no need to clear it in the "else" case
1561eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    if (setProtectionBit) {
1562eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten        flags |= OMXCodec::kEnableGrallocUsageProtected;
1563eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten    }
1564eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#else
15652eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    if (mDecryptHandle != NULL) {
15662eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten        flags |= OMXCodec::kEnableGrallocUsageProtected;
15672eb62955eb84b97695e8a7e56e14310cbb86412bGlenn Kasten    }
1568eabd34665adc284525fe7337ad5c56a8b92964efGlenn Kasten#endif
15693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("initVideoDecoder flags=0x%x", flags);
1570bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoSource = OMXCodec::Create(
157188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            mClient.interface(), mVideoTrack->getFormat(),
1572bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            false, // createEncoder
157339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            mVideoTrack,
15741173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            NULL, flags, USE_SURFACE_ALLOC ? mNativeWindow : NULL);
1575bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1576bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
1577bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
157888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
15792415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1580bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1581bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1582bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1583bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1584bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1585139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        status_t err = mVideoSource->start();
1586139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber
1587139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        if (err != OK) {
1588ccd08439c7914d86264c7ad81bfd03cf39aaa9f7James Dong            ALOGE("failed to start video source");
1589139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            mVideoSource.clear();
1590139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            return err;
1591139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        }
1592bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1593bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1594a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mVideoSource != NULL) {
159514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        const char *componentName;
1596a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        CHECK(mVideoSource->getFormat()
159714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                ->findCString(kKeyDecoderComponent, &componentName));
1598a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
159914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        {
160014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            Mutex::Autolock autoLock(mStatsLock);
160114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            TrackStat *stat = &mStats.mTracks.editItemAt(mStats.mVideoTrackIndex);
160214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
160314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            stat->mDecoderName = componentName;
160414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        }
160514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
160614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        static const char *kPrefix = "OMX.Nvidia.";
160714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        static const char *kSuffix = ".decode";
160814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        static const size_t kSuffixLength = strlen(kSuffix);
160914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
161014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        size_t componentNameLength = strlen(componentName);
161114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
161214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        if (!strncmp(componentName, kPrefix, strlen(kPrefix))
161314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                && componentNameLength >= kSuffixLength
161414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                && !strcmp(&componentName[
161514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                    componentNameLength - kSuffixLength], kSuffix)) {
161614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            modifyFlags(SLOW_DECODER_HACK, SET);
161714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        }
1618a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
1619a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1620bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mVideoSource != NULL ? OK : UNKNOWN_ERROR;
1621bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1622bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
16234769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) {
16242163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
16252163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
162664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == SEEK_VIDEO_ONLY) {
162764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        mSeeking = NO_SEEK;
162864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        return;
162964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
163064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
163164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == NO_SEEK || (mFlags & SEEK_PREVIEW)) {
16324769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        return;
16334769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    }
16344769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
16354769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    if (mAudioPlayer != NULL) {
16363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6);
16374769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
16384769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // If we don't have a video time, seek audio to the originally
16394769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // requested seek time instead.
16404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
16414769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs);
16424769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mWatchForAudioSeekComplete = true;
16435dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber        mWatchForAudioEOS = true;
16444769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    } else if (!mSeekNotificationSent) {
16454769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // If we're playing video only, report seek complete now,
16464769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // otherwise audio player will notify us later.
16474769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
1648512895089f2035bc86d3f502255199809aca721bAndreas Huber        mSeekNotificationSent = true;
16494769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    }
16504769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
1651a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(FIRST_FRAME, SET);
165264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    mSeeking = NO_SEEK;
1653a89082944308805b0def7de87c67e370e74b8789Gloria Wang
1654a89082944308805b0def7de87c67e370e74b8789Gloria Wang    if (mDecryptHandle != NULL) {
1655a89082944308805b0def7de87c67e370e74b8789Gloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1656a89082944308805b0def7de87c67e370e74b8789Gloria Wang                Playback::PAUSE, 0);
1657a89082944308805b0def7de87c67e370e74b8789Gloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1658a89082944308805b0def7de87c67e370e74b8789Gloria Wang                Playback::START, videoTimeUs / 1000);
1659a89082944308805b0def7de87c67e370e74b8789Gloria Wang    }
16604769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber}
16614769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
1662c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() {
16632163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
1664bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
16657b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (!mVideoEventPending) {
16667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // The event has been cancelled in reset_l() but had already
16677b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // been scheduled for execution at that time.
16687b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return;
16697b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
1670bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
1671bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
167264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking != NO_SEEK) {
1673bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mVideoBuffer) {
1674bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer->release();
1675bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer = NULL;
1676bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
16770a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1678681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (mSeeking == SEEK && isStreamingHTTP() && mAudioSource != NULL
16792b1222f8938356669672f35e0e53e176c78c40efAndreas Huber                && !(mFlags & SEEK_PREVIEW)) {
16800a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // We're going to seek the video source first, followed by
16810a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // the audio source.
16820a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // In order to avoid jumps in the DataSource offset caused by
16830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // the audio codec prefetching data from the old locations
16840a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // while the video codec is already reading data from the new
16850a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // locations, we'll "pause" the audio source, causing it to
16860a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // stop reading input data until a subsequent seek.
16870a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1688f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) {
16890a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber                mAudioPlayer->pause();
1690f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
1691a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(AUDIO_RUNNING, CLEAR);
16920a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            }
16930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            mAudioSource->pause();
16940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        }
1695bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1696bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1697bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!mVideoBuffer) {
1698bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        MediaSource::ReadOptions options;
169964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (mSeeking != NO_SEEK) {
17003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6);
1701bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1702abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber            options.setSeekTo(
170364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    mSeekTimeUs,
170464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    mSeeking == SEEK_VIDEO_ONLY
170564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                        ? MediaSource::ReadOptions::SEEK_NEXT_SYNC
170649e7daaf6c2fd7f3e3d06d350de73de1ffeff5ddAndreas Huber                        : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC);
1707bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1708bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        for (;;) {
1709bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            status_t err = mVideoSource->read(&mVideoBuffer, &options);
1710c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber            options.clearSeekTo();
1711bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (err != OK) {
1713e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                CHECK(mVideoBuffer == NULL);
1714bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1715bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                if (err == INFO_FORMAT_CHANGED) {
17163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("VideoSource signalled format change.");
1717bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17185daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber                    notifyVideoSize_l();
17195daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1720a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    if (mVideoRenderer != NULL) {
1721fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        mVideoRendererIsPreview = false;
1722a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                        initRenderer_l();
1723a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    }
1724bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    continue;
1725bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                }
1726bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17274769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // So video playback is complete, but we may still have
17284769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // a seek request pending that needs to be applied
17294769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // to the audio track.
173064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                if (mSeeking != NO_SEEK) {
17313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("video stream ended while seeking!");
17324769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                }
17334769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                finishSeekIfNecessary(-1);
17344769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
17355dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber                if (mAudioPlayer != NULL
17365dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber                        && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) {
17375dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber                    startAudioPlayer_l();
17385dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber                }
17395dac87b088556b8ed7f2a4f5546d31be0bb68680Andreas Huber
1740a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                modifyFlags(VIDEO_AT_EOS, SET);
17415295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber                postStreamDoneEvent_l(err);
1742bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                return;
1743bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1744bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17454844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            if (mVideoBuffer->range_length() == 0) {
174608411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // Some decoders, notably the PV AVC software decoder
174708411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // return spurious empty buffers that we just want to ignore.
174808411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber
17494844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer->release();
17504844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer = NULL;
17514844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                continue;
17524844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            }
17534844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
1754bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            break;
1755bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1756a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
1757a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        {
1758a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            Mutex::Autolock autoLock(mStatsLock);
1759a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            ++mStats.mNumVideoFramesDecoded;
1760a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
1761bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1762bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1763bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t timeUs;
1764bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
1765bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1766150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber    mLastVideoTimeUs = timeUs;
1767150694cda0842d38a9358fe8d1fcb4fb4a76599eAndreas Huber
176864bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (mSeeking == SEEK_VIDEO_ONLY) {
176964bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (mSeekTimeUs > timeUs) {
1770df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us",
177164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                 mSeekTimeUs, timeUs);
177264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
177364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
177464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
17752415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    {
17762415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        Mutex::Autolock autoLock(mMiscStateLock);
17772415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        mVideoTimeUs = timeUs;
17782415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
1779bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
178064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    SeekType wasSeeking = mSeeking;
17814769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    finishSeekIfNecessary(timeUs);
1782bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1783f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    if (mAudioPlayer != NULL && !(mFlags & (AUDIO_RUNNING | SEEK_PREVIEW))) {
1784f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        status_t err = startAudioPlayer_l();
1785f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        if (err != OK) {
178629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block            ALOGE("Starting the audio player failed w/ err %d", err);
1787f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber            return;
1788f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber        }
1789f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber    }
1790f03034408506051f2f836e59305fcd5f662bf19aAndreas Huber
179114744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber    if ((mFlags & TEXTPLAYER_INITIALIZED)
179214744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber            && !(mFlags & (TEXT_RUNNING | SEEK_PREVIEW))) {
1793f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        mTextDriver->start();
1794a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(TEXT_RUNNING, SET);
17957a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
17967a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1797f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber    TimeSource *ts =
1798f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber        ((mFlags & AUDIO_AT_EOS) || !(mFlags & AUDIOPLAYER_STARTED))
1799f7eade99250520f2c9c8366a20a9256c4b34abc1Andreas Huber            ? &mSystemTimeSource : mTimeSource;
18005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
1801bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & FIRST_FRAME) {
1802a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(FIRST_FRAME, CLEAR);
180314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        mSinceLastDropped = 0;
18045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs;
1805bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1806bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1807bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t realTimeUs, mediaTimeUs;
18085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL
1809bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) {
1810bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;
1811bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1812bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
181364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking == SEEK_VIDEO_ONLY) {
181464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
181564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
181664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        int64_t latenessUs = nowUs - timeUs;
181764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
18182163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis        ATRACE_INT("Video Lateness (ms)", latenessUs / 1E3);
18192163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
182064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (latenessUs > 0) {
1821df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6);
182264bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
182364bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    }
182464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
182564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking == NO_SEEK) {
182602a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber        // Let's display the first frame after seeking right away.
1827f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber
18282b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
1829bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
18302b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        int64_t latenessUs = nowUs - timeUs;
18312b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
18322163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis        ATRACE_INT("Video Lateness (ms)", latenessUs / 1E3);
18332163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
183464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        if (latenessUs > 500000ll
183564bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mAudioPlayer != NULL
183664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                && mAudioPlayer->getMediaTimeMapping(
183764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber                    &realTimeUs, &mediaTimeUs)) {
183814744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber            if (mWVMExtractor == NULL) {
183914744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                ALOGI("we're much too late (%.2f secs), video skipping ahead",
184014744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                     latenessUs / 1E6);
184164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
184214744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                mVideoBuffer->release();
184314744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                mVideoBuffer = NULL;
184464bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
184514744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                mSeeking = SEEK_VIDEO_ONLY;
184614744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                mSeekTimeUs = mediaTimeUs;
184764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
184814744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                postVideoEvent_l();
184914744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                return;
185014744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber            } else {
185114744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                // The widevine extractor doesn't deal well with seeking
185214744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                // audio and video independently. We'll just have to wait
185314744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                // until the decoder catches up, which won't be long at all.
185414744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber                ALOGI("we're very late (%.2f secs)", latenessUs / 1E6);
185514744c076e2e361f049e8c3c43cef502ba3fcbd5Andreas Huber            }
185664bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        }
185764bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber
18582b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if (latenessUs > 40000) {
18592b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            // We're more than 40ms late.
18603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("we're late by %lld us (%.2f secs)",
1861dab59b5a4956b7e9b1ffc64a0676e7990579934eAndreas Huber                 latenessUs, latenessUs / 1E6);
18622b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
186314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            if (!(mFlags & SLOW_DECODER_HACK)
186414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                    || mSinceLastDropped > FRAME_DROP_FREQ)
1865a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            {
18663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("we're late by %lld us (%.2f secs) dropping "
186714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                     "one after %d frames",
186814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                     latenessUs, latenessUs / 1E6, mSinceLastDropped);
1869a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
187014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                mSinceLastDropped = 0;
187114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                mVideoBuffer->release();
187214f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                mVideoBuffer = NULL;
187314f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
187414f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                {
187514f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                    Mutex::Autolock autoLock(mStatsLock);
187614f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                    ++mStats.mNumVideoFramesDropped;
187714f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                }
187814f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong
187914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                postVideoEvent_l();
188014f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong                return;
188114f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong            }
1882aee6c07b3572bf2510cd9e7d29c454fcfedde31dpmehendale        }
1883bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
18842b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        if (latenessUs < -10000) {
18852b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            // We're more than 10ms early.
18862b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            postVideoEvent_l(10000);
18872b1222f8938356669672f35e0e53e176c78c40efAndreas Huber            return;
18882b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        }
1889bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1890bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
189180ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang    if ((mNativeWindow != NULL)
189280ec929862bcfe8582984f3a28e7a4ca5f4f27bbGloria Wang            && (mVideoRendererIsPreview || mVideoRenderer == NULL)) {
1893fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRendererIsPreview = false;
1894fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1895a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        initRenderer_l();
1896a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1897a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber
1898a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mVideoRenderer != NULL) {
189914f95746466fb6abdbbf33ee26d92ebf3fbef98fJames Dong        mSinceLastDropped++;
1900a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        mVideoRenderer->render(mVideoBuffer);
1901c374dae535b83d9b499dd9fe8f9dabdb8b0ac9fdJames Dong        if (!mVideoRenderingStarted) {
1902c374dae535b83d9b499dd9fe8f9dabdb8b0ac9fdJames Dong            mVideoRenderingStarted = true;
1903c374dae535b83d9b499dd9fe8f9dabdb8b0ac9fdJames Dong            notifyListener_l(MEDIA_INFO, MEDIA_INFO_RENDERING_START);
1904c374dae535b83d9b499dd9fe8f9dabdb8b0ac9fdJames Dong        }
1905c374dae535b83d9b499dd9fe8f9dabdb8b0ac9fdJames Dong
1906a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1907bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1908f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    mVideoBuffer->release();
1909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoBuffer = NULL;
1910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
191164bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber    if (wasSeeking != NO_SEEK && (mFlags & SEEK_PREVIEW)) {
1912a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(SEEK_PREVIEW, CLEAR);
19132b1222f8938356669672f35e0e53e176c78c40efAndreas Huber        return;
19142b1222f8938356669672f35e0e53e176c78c40efAndreas Huber    }
19152b1222f8938356669672f35e0e53e176c78c40efAndreas Huber
1916bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    postVideoEvent_l();
1917bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1918bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1919bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) {
19202163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
19212163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis
1922bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoEventPending) {
1923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1924bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1925bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1926bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = true;
1927bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs);
1928bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1929bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
19305295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) {
1931bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mStreamDoneEventPending) {
1932bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1933bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1934bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = true;
19355295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber
19365295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    mStreamDoneStatus = status;
1937bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEvent(mStreamDoneEvent);
1938bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1939bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
194066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() {
194166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mBufferingEventPending) {
194266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        return;
194366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
194466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = true;
194566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mQueue.postEventWithDelay(mBufferingEvent, 1000000ll);
194666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
194766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
1948145e68fc778275963189b02a1adcbe27cce4d769Andreas Hubervoid AwesomePlayer::postVideoLagEvent_l() {
1949145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    if (mVideoLagEventPending) {
1950145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber        return;
1951145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    }
1952145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mVideoLagEventPending = true;
1953145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber    mQueue.postEventWithDelay(mVideoLagEvent, 1000000ll);
1954145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber}
1955145e68fc778275963189b02a1adcbe27cce4d769Andreas Huber
195602f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent(int64_t delayUs) {
195702f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    Mutex::Autolock autoLock(mAudioLock);
19581862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mAudioStatusEventPending) {
19591862a33b246249630b654182afb5914da3480d4cAndreas Huber        return;
19601862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
19611862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = true;
196286d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent    // Do not honor delay when looping in order to limit audio gap
196386d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent    if (mFlags & (LOOPING | AUTO_LOOPING)) {
196486d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent        delayUs = 0;
196586d24aa35adf82512d341d9aaebd62b36b0a0847Eric Laurent    }
196684b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Huber    mQueue.postEventWithDelay(mCheckAudioStatusEvent, delayUs);
19671862a33b246249630b654182afb5914da3480d4cAndreas Huber}
19681862a33b246249630b654182afb5914da3480d4cAndreas Huber
196994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgeraldvoid AwesomePlayer::postAudioTearDownEvent(int64_t delayUs) {
197094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    Mutex::Autolock autoLock(mAudioLock);
197194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (mAudioTearDownEventPending) {
197294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        return;
197394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
197494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mAudioTearDownEventPending = true;
197594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mQueue.postEventWithDelay(mAudioTearDownEvent, delayUs);
197694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald}
197794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
19781862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() {
197902f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    {
198002f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber        Mutex::Autolock autoLock(mAudioLock);
198102f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber        if (!mAudioStatusEventPending) {
198202f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber            // Event was dispatched and while we were blocking on the mutex,
198302f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber            // has already been cancelled.
198402f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber            return;
198502f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber        }
198602f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber
198702f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber        mAudioStatusEventPending = false;
1988d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
1989d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber
199002f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    Mutex::Autolock autoLock(mLock);
19911862a33b246249630b654182afb5914da3480d4cAndreas Huber
19921862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) {
19931862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = false;
19941321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
19951321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        if (!mSeekNotificationSent) {
19961321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            notifyListener_l(MEDIA_SEEK_COMPLETE);
19971321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            mSeekNotificationSent = true;
19981321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        }
1999dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber
200064bb6983690bf994d904591145a3cdd6373bdbe6Andreas Huber        mSeeking = NO_SEEK;
20011862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
20021862a33b246249630b654182afb5914da3480d4cAndreas Huber
20035295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    status_t finalStatus;
20045295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) {
20051862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = false;
2006a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(AUDIO_AT_EOS, SET);
2007a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        modifyFlags(FIRST_FRAME, SET);
20085295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        postStreamDoneEvent_l(finalStatus);
20091862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
20101862a33b246249630b654182afb5914da3480d4cAndreas Huber}
20111862a33b246249630b654182afb5914da3480d4cAndreas Huber
2012c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() {
20132163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
2014c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
2015bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return prepare_l();
2016bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
2017c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2018bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() {
2019bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARED) {
2020bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return OK;
2021bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2022bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2023bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
2024bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
2025bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2026bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2027bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = false;
2028c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    status_t err = prepareAsync_l();
2029c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2030c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    if (err != OK) {
2031c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        return err;
2032c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
2033c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2034bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
2035c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        mPreparedCondition.wait(mLock);
2036c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
2037c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2038bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return mPrepareResult;
2039c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
2040c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2041c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() {
20422163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
2043c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
2044bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2045bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
2046bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
2047bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2048bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2049bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = true;
2050c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return prepareAsync_l();
2051c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
2052c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2053c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() {
2054bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
2055bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
2056c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
2057c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
20582e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (!mQueueStarted) {
20592e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.start();
20602e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueueStarted = true;
20612e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
20622e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
2063a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARING, SET);
2064c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = new AwesomeEvent(
2065c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onPrepareAsyncEvent);
2066c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2067c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mQueue.postEvent(mAsyncPrepareEvent);
2068c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2069c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return OK;
2070c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
2071c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2072bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() {
20732163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
2074e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    sp<DataSource> dataSource;
2075e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
2076681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    bool isWidevineStreaming = false;
2077681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (!strncasecmp("widevine://", mUri.string(), 11)) {
2078681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        isWidevineStreaming = true;
2079681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2080681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        String8 newURI = String8("http://");
2081681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        newURI.append(mUri.string() + 11);
2082681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2083681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mUri = newURI;
2084681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    }
2085681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2086a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber    AString sniffedMIME;
2087a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
20888cb0c4168bf4b678e4a6edfcf409247016be20d5Andreas Huber    if (!strncasecmp("http://", mUri.string(), 7)
2089681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            || !strncasecmp("https://", mUri.string(), 8)
2090681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            || isWidevineStreaming) {
20911156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber        mConnectingDataSource = HTTPBase::Create(
20921156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                (mFlags & INCOGNITO)
20931156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                    ? HTTPBase::kFlagIncognito
20941156dc913a5ba7b2bc86489468d4914430f03d14Andreas Huber                    : 0);
2095e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
20969b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        if (mUIDValid) {
20979b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber            mConnectingDataSource->setUID(mUID);
20989b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber        }
20999b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
210049c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber        String8 cacheConfig;
210149c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber        bool disconnectAtHighwatermark;
210249c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber        NuCachedSource2::RemoveCacheSpecificHeaders(
210349c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber                &mUriHeaders, &cacheConfig, &disconnectAtHighwatermark);
210449c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber
2105e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.unlock();
210679f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber        status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders);
2107e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.lock();
2108e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
2109e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (err != OK) {
2110e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource.clear();
2111e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
2112df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block            ALOGI("mConnectingDataSource->connect() returned %d", err);
2113e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            return err;
2114e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
2115e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
2116681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (!isWidevineStreaming) {
2117681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            // The widevine extractor does its own caching.
2118681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
21190a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0
2120681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            mCachedSource = new NuCachedSource2(
2121681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                    new ThrottledSource(
2122681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                        mConnectingDataSource, 50 * 1024 /* bytes/sec */));
21230a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else
212449c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber            mCachedSource = new NuCachedSource2(
212549c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber                    mConnectingDataSource,
212649c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber                    cacheConfig.isEmpty() ? NULL : cacheConfig.string(),
212749c59815369616b0fd5451ccabd377e8fe1dc3faAndreas Huber                    disconnectAtHighwatermark);
21280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif
2129681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2130681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            dataSource = mCachedSource;
2131681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        } else {
2132681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            dataSource = mConnectingDataSource;
2133681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
2134681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2135e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mConnectingDataSource.clear();
21360a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
21376511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber        String8 contentType = dataSource->getMIMEType();
2138ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
21396511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber        if (strncasecmp(contentType.string(), "audio/", 6)) {
21406511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // We're not doing this for streams that appear to be audio-only
21416511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // streams to ensure that even low bandwidth streams start
21426511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // playing back fairly instantly.
2143ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
21446511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // We're going to prefill the cache before trying to instantiate
21456511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // the extractor below, as the latter is an operation that otherwise
21466511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // could block on the datasource for a significant amount of time.
21476511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // During that time we'd be unable to abort the preparation phase
21486511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber            // without this prefill.
2149e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            if (mCachedSource != NULL) {
2150e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // We're going to prefill the cache before trying to instantiate
2151e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // the extractor below, as the latter is an operation that otherwise
2152e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // could block on the datasource for a significant amount of time.
2153e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // During that time we'd be unable to abort the preparation phase
2154e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                // without this prefill.
2155e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2156e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                mLock.unlock();
2157e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2158bab412099ab1bd3e9e942453cbb42c87ea9a59ecAndreas Huber                // Initially make sure we have at least 192 KB for the sniff
2159a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                // to complete without blocking.
2160bab412099ab1bd3e9e942453cbb42c87ea9a59ecAndreas Huber                static const size_t kMinBytesForSniffing = 192 * 1024;
2161a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2162a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                off64_t metaDataSize = -1ll;
2163e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                for (;;) {
2164e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    status_t finalStatus;
2165e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    size_t cachedDataRemaining =
2166e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                        mCachedSource->approxDataRemaining(&finalStatus);
2167e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong
2168a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                    if (finalStatus != OK
2169a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            || (metaDataSize >= 0
2170a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                                && cachedDataRemaining >= metaDataSize)
2171e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                            || (mFlags & PREPARE_CANCELLED)) {
2172e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                        break;
2173e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    }
21746511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
2175456caf3f5f0af673dc120c17c23635f40d8f5ac2Andreas Huber                    ALOGV("now cached %d bytes of data", cachedDataRemaining);
2176a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2177a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                    if (metaDataSize < 0
2178a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            && cachedDataRemaining >= kMinBytesForSniffing) {
2179a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        String8 tmp;
2180a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        float confidence;
2181a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        sp<AMessage> meta;
2182a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        if (!dataSource->sniff(&tmp, &confidence, &meta)) {
2183a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            mLock.lock();
2184a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            return UNKNOWN_ERROR;
2185a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        }
2186a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2187a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        // We successfully identified the file's extractor to
2188a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        // be, remember this mime type so we don't have to
2189a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        // sniff it again when we call MediaExtractor::Create()
2190a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        // below.
2191a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        sniffedMIME = tmp.string();
2192a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2193a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        if (meta == NULL
2194a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                                || !meta->findInt64(
2195a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                                    "meta-data-size", &metaDataSize)) {
2196a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                            metaDataSize = kHighWaterMarkBytes;
2197a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        }
2198a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2199a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                        CHECK_GE(metaDataSize, 0ll);
2200456caf3f5f0af673dc120c17c23635f40d8f5ac2Andreas Huber                        ALOGV("metaDataSize = %lld bytes", metaDataSize);
2201a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                    }
2202a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber
2203e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                    usleep(200000);
22046511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber                }
22056511c9755c3a3360ba869772600c7aae048a7ffcAndreas Huber
2206e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                mLock.lock();
2207ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber            }
2208ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber
2209e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            if (mFlags & PREPARE_CANCELLED) {
2210df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block                ALOGI("Prepare cancelled while waiting for initial cache fill.");
2211e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong                return UNKNOWN_ERROR;
2212e39350924f4e743ec04cc9640526e06990c8cbdaJames Dong            }
2213ac05c317cd818701535c5d72ce90da98c4bae75bAndreas Huber        }
2214e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    } else {
2215e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
2216e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
2217bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2218bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (dataSource == NULL) {
2219bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
2220bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2221bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2222681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    sp<MediaExtractor> extractor;
2223bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
2224681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (isWidevineStreaming) {
2225681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        String8 mimeType;
2226681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        float confidence;
2227681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        sp<AMessage> dummy;
2228ce3d3ef78d6512cc272d469e236fba4fca1189b0James Dong        bool success;
2229ce3d3ef78d6512cc272d469e236fba4fca1189b0James Dong
2230ce3d3ef78d6512cc272d469e236fba4fca1189b0James Dong        // SniffWVM is potentially blocking since it may require network access.
2231ce3d3ef78d6512cc272d469e236fba4fca1189b0James Dong        // Do not call it with mLock held.
2232ce3d3ef78d6512cc272d469e236fba4fca1189b0James Dong        mLock.unlock();
2233ce3d3ef78d6512cc272d469e236fba4fca1189b0James Dong        success = SniffWVM(dataSource, &mimeType, &confidence, &dummy);
2234ce3d3ef78d6512cc272d469e236fba4fca1189b0James Dong        mLock.lock();
2235681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2236681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (!success
2237681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                || strcasecmp(
2238681755fc0d0797506456f46a2a10555916d6be32Andreas Huber                    mimeType.string(), MEDIA_MIMETYPE_CONTAINER_WVM)) {
2239681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            return ERROR_UNSUPPORTED;
2240681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
2241681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2242681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor = new WVMExtractor(dataSource);
2243681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor->setAdaptiveStreamingMode(true);
2244dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker        if (mUIDValid)
2245dce4161f7d4d39498f69591e876f5fecdde95833Jeff Tinker            mWVMExtractor->setUID(mUID);
2246681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        extractor = mWVMExtractor;
2247681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    } else {
2248a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber        extractor = MediaExtractor::Create(
2249a0f2bf56e30f580535229fa6a58e7d48b762727cAndreas Huber                dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str());
2250681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2251681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        if (extractor == NULL) {
2252681755fc0d0797506456f46a2a10555916d6be32Andreas Huber            return UNKNOWN_ERROR;
2253681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        }
2254bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2255bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
22569d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong    if (extractor->getDrmFlag()) {
22579d2f386dd2885eaffa11fd494ae258bb09fe6397James Dong        checkDrmStatus(dataSource);
2258dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
2259dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
2260681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    status_t err = setDataSource_l(extractor);
2261681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2262681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    if (err != OK) {
2263681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        mWVMExtractor.clear();
2264681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2265681755fc0d0797506456f46a2a10555916d6be32Andreas Huber        return err;
2266681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    }
2267681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2268681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    return OK;
2269bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
2270bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
227188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) {
227288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(err != OK);
227388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
227488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    if (mIsAsyncPrepare) {
227588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
227688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    }
227788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
227888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPrepareResult = err;
2279a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR);
228088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAsyncPrepareEvent = NULL;
228188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPreparedCondition.broadcast();
228288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
228388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
2284e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static
2285e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) {
2286e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie);
2287e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
2288e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    return (me->mFlags & PREPARE_CANCELLED) == 0;
2289e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber}
2290e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
2291c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() {
22928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    Mutex::Autolock autoLock(mLock);
229394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    beginPrepareAsync_l();
229494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald}
2295bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
229694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgeraldvoid AwesomePlayer::beginPrepareAsync_l() {
22978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mFlags & PREPARE_CANCELLED) {
2298df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block        ALOGI("prepare was cancelled before doing anything");
22998650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        abortPrepare(UNKNOWN_ERROR);
23008650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return;
23018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
2302e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
23038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mUri.size() > 0) {
23048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = finishSetDataSource_l();
2305bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
23068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
23078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
23088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
2309bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
23108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
2311bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
23128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mVideoTrack != NULL && mVideoSource == NULL) {
23138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initVideoDecoder();
23141322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
23158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
23168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
23178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
23181322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
23198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
23201322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
23218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mAudioTrack != NULL && mAudioSource == NULL) {
23228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initAudioDecoder();
23231322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
23248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
23258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
23268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
23271322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
2328c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
2329c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2330a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARING_CONNECTED, SET);
23316a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
23322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (isStreamingHTTP()) {
23338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        postBufferingEvent_l();
23348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    } else {
23358650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        finishAsyncPrepare_l();
23368650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
23378650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
2338c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
23398650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() {
2340bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mIsAsyncPrepare) {
23415daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber        if (mVideoSource == NULL) {
2342bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0);
2343bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        } else {
23445daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber            notifyVideoSize_l();
2345bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
2346c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2347bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        notifyListener_l(MEDIA_PREPARED);
2348bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
2349c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2350bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPrepareResult = OK;
2351a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags((PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED), CLEAR);
2352a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    modifyFlags(PREPARED, SET);
2353c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = NULL;
2354bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPreparedCondition.broadcast();
2355c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
2356c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2357acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const {
2358acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return mExtractorFlags;
2359acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber}
2360acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
236184b343f29063fbfa2ee61b2e3d37ba059ca507d4Andreas Hubervoid AwesomePlayer::postAudioEOS(int64_t delayUs) {
236202f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    postCheckAudioStatusEvent(delayUs);
2363ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
2364ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
2365ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() {
236602f6e988107bc13ebe4828b734ea0fc3d9d11ae0Andreas Huber    postCheckAudioStatusEvent(0);
2367ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
2368ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
236994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgeraldvoid AwesomePlayer::postAudioTearDown() {
237094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    postAudioTearDownEvent(0);
237194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald}
237294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
23734f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::setParameter(int key, const Parcel &request) {
2374965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang    switch (key) {
23755b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        case KEY_PARAMETER_CACHE_STAT_COLLECT_FREQ_MS:
23765b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        {
23775b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            return setCacheStatCollectFreq(request);
23785b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        }
23797a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi        case KEY_PARAMETER_PLAYBACK_RATE_PERMILLE:
23807a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi        {
23817a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi            if (mAudioPlayer != NULL) {
23827a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi                return mAudioPlayer->setPlaybackRatePermille(request.readInt32());
23837a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi            } else {
23847a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi                return NO_INIT;
23857a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi            }
23867a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi        }
2387965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        default:
2388965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        {
2389965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang            return ERROR_UNSUPPORTED;
2390965d08ba16ee82bc85f69546360c18e7da907406Gloria Wang        }
23917a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    }
23924f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
23934f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
23945b1b8a93a07326f1cbc627f09e02988375189e0aJames Dongstatus_t AwesomePlayer::setCacheStatCollectFreq(const Parcel &request) {
23955b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    if (mCachedSource != NULL) {
23965b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        int32_t freqMs = request.readInt32();
2397b8a805261bf0282e992d3608035e47d05a898710Steve Block        ALOGD("Request to keep cache stats in the past %d ms",
23985b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong            freqMs);
23995b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong        return mCachedSource->setCacheStatCollectFreq(freqMs);
24005b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    }
24015b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong    return ERROR_UNSUPPORTED;
24025b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong}
24035b1b8a93a07326f1cbc627f09e02988375189e0aJames Dong
24044f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t AwesomePlayer::getParameter(int key, Parcel *reply) {
2405cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    switch (key) {
2406cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    case KEY_PARAMETER_AUDIO_CHANNEL_COUNT:
2407cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        {
2408cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            int32_t channelCount;
2409cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            if (mAudioTrack == 0 ||
2410cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten                    !mAudioTrack->getFormat()->findInt32(kKeyChannelCount, &channelCount)) {
2411cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten                channelCount = 0;
2412cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            }
2413cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            reply->writeInt32(channelCount);
2414cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        }
2415cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        return OK;
2416cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    default:
2417cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        {
2418cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten            return ERROR_UNSUPPORTED;
2419cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten        }
2420cd25fed09742235fac10953b9d4b77268c695063Glenn Kasten    }
24214f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
2422ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
2423eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongstatus_t AwesomePlayer::getTrackInfo(Parcel *reply) const {
2424514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    Mutex::Autolock autoLock(mLock);
2425514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    size_t trackCount = mExtractor->countTracks();
2426514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    if (mTextDriver != NULL) {
2427514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong        trackCount += mTextDriver->countExternalTracks();
2428eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    }
2429eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2430514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    reply->writeInt32(trackCount);
2431eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    for (size_t i = 0; i < mExtractor->countTracks(); ++i) {
2432eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        sp<MetaData> meta = mExtractor->getTrackMetaData(i);
2433eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2434eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        const char *_mime;
2435eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        CHECK(meta->findCString(kKeyMIMEType, &_mime));
2436eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2437eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        String8 mime = String8(_mime);
2438eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2439eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        reply->writeInt32(2); // 2 fields
2440eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2441eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        if (!strncasecmp(mime.string(), "video/", 6)) {
2442eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            reply->writeInt32(MEDIA_TRACK_TYPE_VIDEO);
2443eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        } else if (!strncasecmp(mime.string(), "audio/", 6)) {
2444eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            reply->writeInt32(MEDIA_TRACK_TYPE_AUDIO);
2445eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        } else if (!strcasecmp(mime.string(), MEDIA_MIMETYPE_TEXT_3GPP)) {
2446eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            reply->writeInt32(MEDIA_TRACK_TYPE_TIMEDTEXT);
2447eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        } else {
2448eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            reply->writeInt32(MEDIA_TRACK_TYPE_UNKNOWN);
2449eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        }
2450eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2451eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        const char *lang;
2452514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong        if (!meta->findCString(kKeyMediaLanguage, &lang)) {
2453514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong            lang = "und";
2454eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        }
2455514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong        reply->writeString16(String16(lang));
2456eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    }
2457eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2458514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    if (mTextDriver != NULL) {
2459514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong        mTextDriver->getExternalTrackInfo(reply);
2460514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    }
2461eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    return OK;
2462eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong}
2463eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2464ab7a2e544643edcb2e09ed5f204580afd763edc1James Dongstatus_t AwesomePlayer::selectAudioTrack_l(
2465ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        const sp<MediaSource>& source, size_t trackIndex) {
2466ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2467ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    ALOGI("selectAudioTrack_l: trackIndex=%d, mFlags=0x%x", trackIndex, mFlags);
2468ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2469ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    {
2470ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        Mutex::Autolock autoLock(mStatsLock);
2471ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        if ((ssize_t)trackIndex == mActiveAudioTrackIndex) {
2472ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong            ALOGI("Track %d is active. Does nothing.", trackIndex);
2473ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong            return OK;
2474ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        }
2475ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        //mStats.mFlags = mFlags;
2476ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    }
2477ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2478ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    if (mSeeking != NO_SEEK) {
2479ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        ALOGE("Selecting a track while seeking is not supported");
2480ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        return ERROR_UNSUPPORTED;
2481ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    }
2482ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2483ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    if ((mFlags & PREPARED) == 0) {
2484ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        ALOGE("Data source has not finished preparation");
2485ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        return ERROR_UNSUPPORTED;
2486ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    }
2487ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2488ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    CHECK(source != NULL);
2489ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    bool wasPlaying = (mFlags & PLAYING) != 0;
2490ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2491ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    pause_l();
2492ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2493ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    int64_t curTimeUs;
2494ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    CHECK_EQ(getPosition(&curTimeUs), (status_t)OK);
2495ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2496ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    if ((mAudioPlayer == NULL || !(mFlags & AUDIOPLAYER_STARTED))
2497ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong            && mAudioSource != NULL) {
2498ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        // If we had an audio player, it would have effectively
2499ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        // taken possession of the audio source and stopped it when
2500ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        // _it_ is stopped. Otherwise this is still our responsibility.
2501ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        mAudioSource->stop();
2502ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    }
2503ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    mAudioSource.clear();
250494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mOmxSource.clear();
2505ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2506ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    mTimeSource = NULL;
2507ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2508ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    delete mAudioPlayer;
2509ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    mAudioPlayer = NULL;
2510ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2511ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    modifyFlags(AUDIOPLAYER_STARTED, CLEAR);
2512ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2513ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    setAudioSource(source);
2514ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2515ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    modifyFlags(AUDIO_AT_EOS, CLEAR);
2516ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    modifyFlags(AT_EOS, CLEAR);
2517ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2518ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    status_t err;
2519ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    if ((err = initAudioDecoder()) != OK) {
2520ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        ALOGE("Failed to init audio decoder: 0x%x", err);
2521ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        return err;
2522ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    }
2523ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2524ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    mSeekNotificationSent = true;
2525ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    seekTo_l(curTimeUs);
2526ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2527ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    if (wasPlaying) {
2528ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        play_l();
2529ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    }
2530ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2531ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    mActiveAudioTrackIndex = trackIndex;
2532ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2533ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    return OK;
2534ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong}
2535ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
2536eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongstatus_t AwesomePlayer::selectTrack(size_t trackIndex, bool select) {
25372163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
2538514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    ALOGV("selectTrack: trackIndex = %d and select=%d", trackIndex, select);
2539514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    Mutex::Autolock autoLock(mLock);
2540514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    size_t trackCount = mExtractor->countTracks();
2541514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    if (mTextDriver != NULL) {
2542514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong        trackCount += mTextDriver->countExternalTracks();
2543eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    }
2544514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    if (trackIndex >= trackCount) {
2545514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong        ALOGE("Track index (%d) is out of range [0, %d)", trackIndex, trackCount);
2546514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong        return ERROR_OUT_OF_RANGE;
2547eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    }
2548eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2549ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    bool isAudioTrack = false;
2550eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    if (trackIndex < mExtractor->countTracks()) {
2551eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        sp<MetaData> meta = mExtractor->getTrackMetaData(trackIndex);
2552ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        const char *mime;
2553ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        CHECK(meta->findCString(kKeyMIMEType, &mime));
2554ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        isAudioTrack = !strncasecmp(mime, "audio/", 6);
2555ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong
25568a15dfba686b50f2b8163af247e236d52150321fInsun Kang        if (!isAudioTrack && strcasecmp(mime, MEDIA_MIMETYPE_TEXT_3GPP) != 0) {
2557ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong            ALOGE("Track %d is not either audio or timed text", trackIndex);
2558ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong            return ERROR_UNSUPPORTED;
2559ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        }
2560ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    }
2561eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2562ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong    if (isAudioTrack) {
2563ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        if (!select) {
2564ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong            ALOGE("Deselect an audio track (%d) is not supported", trackIndex);
2565eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            return ERROR_UNSUPPORTED;
2566eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        }
2567ab7a2e544643edcb2e09ed5f204580afd763edc1James Dong        return selectAudioTrack_l(mExtractor->getTrack(trackIndex), trackIndex);
2568eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    }
2569eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2570514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    // Timed text track handling
2571514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    if (mTextDriver == NULL) {
2572514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong        return INVALID_OPERATION;
2573514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong    }
2574514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong
2575eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    status_t err = OK;
2576eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    if (select) {
2577eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        err = mTextDriver->selectTrack(trackIndex);
2578eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        if (err == OK) {
2579eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            modifyFlags(TEXTPLAYER_INITIALIZED, SET);
2580eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            if (mFlags & PLAYING && !(mFlags & TEXT_RUNNING)) {
2581eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong                mTextDriver->start();
2582eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong                modifyFlags(TEXT_RUNNING, SET);
2583eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            }
2584eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        }
2585eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    } else {
2586eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        err = mTextDriver->unselectTrack(trackIndex);
2587eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        if (err == OK) {
2588eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            modifyFlags(TEXTPLAYER_INITIALIZED, CLEAR);
2589eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            modifyFlags(TEXT_RUNNING, CLEAR);
2590eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong        }
2591eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    }
2592eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    return err;
2593eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong}
2594eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
2595eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dongsize_t AwesomePlayer::countTracks() const {
2596eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong    return mExtractor->countTracks() + mTextDriver->countExternalTracks();
2597eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong}
2598eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong
25994f6eed0d1c7972a983c075bdcf03089569e13fe1James Dongstatus_t AwesomePlayer::setVideoScalingMode(int32_t mode) {
26004f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong    Mutex::Autolock lock(mLock);
26014f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong    return setVideoScalingMode_l(mode);
26024f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong}
26034f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong
26044f6eed0d1c7972a983c075bdcf03089569e13fe1James Dongstatus_t AwesomePlayer::setVideoScalingMode_l(int32_t mode) {
26054f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong    mVideoScalingMode = mode;
26064f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong    if (mNativeWindow != NULL) {
26074f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong        status_t err = native_window_set_scaling_mode(
26084f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong                mNativeWindow.get(), mVideoScalingMode);
26094f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong        if (err != OK) {
26104f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong            ALOGW("Failed to set scaling mode: %d", err);
26114f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong        }
2612a77c496d4520f25b7b337d32ebd9681d8ea0f7bbMarco Nelissen        return err;
26134f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong    }
26144f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong    return OK;
26154f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong}
26164f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong
2617f9d660a5e0196240add5daf0199f128d471e592cInsun Kangstatus_t AwesomePlayer::invoke(const Parcel &request, Parcel *reply) {
26182163320110d2f971becbad82e15b2ab360a1ddb6Jamie Gennis    ATRACE_CALL();
2619f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    if (NULL == reply) {
2620f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        return android::BAD_VALUE;
2621f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    }
2622f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    int32_t methodId;
2623f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    status_t ret = request.readInt32(&methodId);
2624f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    if (ret != android::OK) {
2625f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        return ret;
2626f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    }
2627f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    switch(methodId) {
26284f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong        case INVOKE_ID_SET_VIDEO_SCALING_MODE:
26294f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong        {
26304f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong            int mode = request.readInt32();
26314f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong            return setVideoScalingMode(mode);
26324f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong        }
26334f6eed0d1c7972a983c075bdcf03089569e13fe1James Dong
2634f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        case INVOKE_ID_GET_TRACK_INFO:
2635f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        {
2636eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            return getTrackInfo(reply);
2637f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        }
2638f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        case INVOKE_ID_ADD_EXTERNAL_SOURCE:
2639f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        {
2640514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong            Mutex::Autolock autoLock(mLock);
2641f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            if (mTextDriver == NULL) {
2642f9d660a5e0196240add5daf0199f128d471e592cInsun Kang                mTextDriver = new TimedTextDriver(mListener);
2643f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            }
2644f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            // String values written in Parcel are UTF-16 values.
26457c5afe93c9ca2f9f3958663bc3fa9649ec2f5331Insun Kang            String8 uri(request.readString16());
26467c5afe93c9ca2f9f3958663bc3fa9649ec2f5331Insun Kang            String8 mimeType(request.readString16());
2647eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            size_t nTracks = countTracks();
2648eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            return mTextDriver->addOutOfBandTextSource(nTracks, uri, mimeType);
2649f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        }
2650f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        case INVOKE_ID_ADD_EXTERNAL_SOURCE_FD:
2651f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        {
2652514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong            Mutex::Autolock autoLock(mLock);
2653f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            if (mTextDriver == NULL) {
2654f9d660a5e0196240add5daf0199f128d471e592cInsun Kang                mTextDriver = new TimedTextDriver(mListener);
2655f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            }
2656f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            int fd         = request.readFileDescriptor();
2657f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            off64_t offset = request.readInt64();
2658613c8ae1b7a2b4f43b33a72dc2fff0bc8b7d4c6fJames Dong            off64_t length  = request.readInt64();
26597c5afe93c9ca2f9f3958663bc3fa9649ec2f5331Insun Kang            String8 mimeType(request.readString16());
2660eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            size_t nTracks = countTracks();
2661f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            return mTextDriver->addOutOfBandTextSource(
2662eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong                    nTracks, fd, offset, length, mimeType);
2663f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        }
2664f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        case INVOKE_ID_SELECT_TRACK:
2665f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        {
2666eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            int trackIndex = request.readInt32();
2667514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong            return selectTrack(trackIndex, true /* select */);
2668f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        }
2669f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        case INVOKE_ID_UNSELECT_TRACK:
2670f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        {
2671eec46abb88dcc50621fd2d3f17a6b8d24fd07a19James Dong            int trackIndex = request.readInt32();
2672514bcaf1e842e8e90fbeabf35e7e654622b75b02James Dong            return selectTrack(trackIndex, false /* select */);
2673f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        }
2674f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        default:
2675f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        {
2676f9d660a5e0196240add5daf0199f128d471e592cInsun Kang            return ERROR_UNSUPPORTED;
2677f9d660a5e0196240add5daf0199f128d471e592cInsun Kang        }
2678f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    }
2679f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    // It will not reach here.
2680f9d660a5e0196240add5daf0199f128d471e592cInsun Kang    return OK;
2681f9d660a5e0196240add5daf0199f128d471e592cInsun Kang}
2682f9d660a5e0196240add5daf0199f128d471e592cInsun Kang
2683681755fc0d0797506456f46a2a10555916d6be32Andreas Huberbool AwesomePlayer::isStreamingHTTP() const {
2684681755fc0d0797506456f46a2a10555916d6be32Andreas Huber    return mCachedSource != NULL || mWVMExtractor != NULL;
2685681755fc0d0797506456f46a2a10555916d6be32Andreas Huber}
2686681755fc0d0797506456f46a2a10555916d6be32Andreas Huber
2687a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huberstatus_t AwesomePlayer::dump(int fd, const Vector<String16> &args) const {
2688a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    Mutex::Autolock autoLock(mStatsLock);
2689a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2690a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    FILE *out = fdopen(dup(fd), "w");
2691a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2692a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, " AwesomePlayer\n");
2693a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mStats.mFd < 0) {
269453ae1640ffbfc690962f7f94694b02680c6f66cbJames Dong        fprintf(out, "  URI(suppressed)");
2695a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    } else {
2696a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "  fd(%d)", mStats.mFd);
2697a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2698a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2699a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, ", flags(0x%08x)", mStats.mFlags);
2700a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2701a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    if (mStats.mBitrate >= 0) {
2702a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, ", bitrate(%lld bps)", mStats.mBitrate);
2703a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2704a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2705a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fprintf(out, "\n");
2706a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2707a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    for (size_t i = 0; i < mStats.mTracks.size(); ++i) {
2708a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        const TrackStat &stat = mStats.mTracks.itemAt(i);
2709a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2710a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "  Track %d\n", i + 1);
2711a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "   MIME(%s)", stat.mMIME.string());
2712a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2713a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if (!stat.mDecoderName.isEmpty()) {
2714a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            fprintf(out, ", decoder(%s)", stat.mDecoderName.string());
2715a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
2716a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2717a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        fprintf(out, "\n");
2718a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2719a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        if ((ssize_t)i == mStats.mVideoTrackIndex) {
2720a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            fprintf(out,
2721a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "   videoDimensions(%d x %d), "
2722a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "numVideoFramesDecoded(%lld), "
2723a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    "numVideoFramesDropped(%lld)\n",
2724a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mVideoWidth,
2725a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mVideoHeight,
2726a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mNumVideoFramesDecoded,
2727a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber                    mStats.mNumVideoFramesDropped);
2728a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        }
2729a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2730a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2731a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    fclose(out);
2732a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    out = NULL;
2733a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2734a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    return OK;
2735a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber}
2736a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2737a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Hubervoid AwesomePlayer::modifyFlags(unsigned value, FlagMode mode) {
2738a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    switch (mode) {
2739a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case SET:
2740a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags |= value;
2741a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2742a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case CLEAR:
27436f434482331b55876cb09c638149c21ca40c7690Marco Nelissen            if ((value & CACHE_UNDERRUN) && (mFlags & CACHE_UNDERRUN)) {
27446f434482331b55876cb09c638149c21ca40c7690Marco Nelissen                notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
27456f434482331b55876cb09c638149c21ca40c7690Marco Nelissen            }
2746a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags &= ~value;
2747a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2748a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        case ASSIGN:
2749a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            mFlags = value;
2750a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            break;
2751a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        default:
2752a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber            TRESPASS();
2753a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2754a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
2755a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    {
2756a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        Mutex::Autolock autoLock(mStatsLock);
2757a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber        mStats.mFlags = mFlags;
2758a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber    }
2759a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber}
2760a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber
276194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgeraldvoid AwesomePlayer::onAudioTearDownEvent() {
276294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
276394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    Mutex::Autolock autoLock(mLock);
276494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (!mAudioTearDownEventPending) {
276594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        return;
276694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
276794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mAudioTearDownEventPending = false;
276894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
276994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    ALOGV("onAudioTearDownEvent");
277094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
277194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // stream info is cleared by reset_l() so copy what we need
277294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    const bool wasPlaying = (mFlags & PLAYING);
277394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    KeyedVector<String8, String8> uriHeaders(mUriHeaders);
277494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    sp<DataSource> fileSource(mFileSource);
277594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
277694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mStatsLock.lock();
277794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    String8 uri(mStats.mURI);
277894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mStatsLock.unlock();
277994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
278094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // get current position so we can start recreated stream from here
278194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    int64_t position = 0;
278294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    getPosition(&position);
278394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
278494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // Reset and recreate
278594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    reset_l();
278694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mFlags |= PREPARING;
278794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
278894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    status_t err;
278994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
279094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (fileSource != NULL) {
279194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mFileSource = fileSource;
279294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        err = setDataSource_l(fileSource);
279394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    } else {
279494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        err = setDataSource_l(uri, &uriHeaders);
279594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
279694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
279794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if ( err != OK ) {
279894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // This will force beingPrepareAsync_l() to notify
279994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        // a MEDIA_ERROR to the client and abort the prepare
280094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        mFlags |= PREPARE_CANCELLED;
280194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
280294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
280394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mAudioTearDown = true;
280494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mIsAsyncPrepare = true;
280594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
280694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    // Call parepare for the host decoding
280794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    beginPrepareAsync_l();
280894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
280994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    if (mPrepareResult == OK) {
281094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (mExtractorFlags & MediaExtractor::CAN_SEEK) {
281194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            seekTo_l(position);
281294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
281394ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
281494ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        if (wasPlaying) {
281594ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            modifyFlags(CACHE_UNDERRUN, CLEAR);
281694ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald            play_l();
281794ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald        }
281894ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    }
281994ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
282094ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald    mAudioTearDown = false;
282194ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald}
282294ea60f975c3eb7ce6d2a4430538a42a5fc3babdRichard Fitzgerald
2823bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}  // namespace android
2824