AwesomePlayer.cpp revision ba529e486dde15fe75ea1b48570f9d60a4cf3c48
1bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber/*
2bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
4bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * you may not use this file except in compliance with the License.
6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * You may obtain a copy of the License at
7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
8bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *
10bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * Unless required by applicable law or agreed to in writing, software
11bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * See the License for the specific language governing permissions and
14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber * limitations under the License.
15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber */
16bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
17bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber//#define LOG_NDEBUG 0
18bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#define LOG_TAG "AwesomePlayer"
19bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <utils/Log.h>
20bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
21988e3f0b2c74095deae580157c57935a98573052Andreas Huber#include <dlfcn.h>
22988e3f0b2c74095deae580157c57935a98573052Andreas Huber
23cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/ARTSPController.h"
24bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h"
25cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include "include/LiveSource.h"
26733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h"
270a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/NuCachedSource2.h"
280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#include "include/ThrottledSource.h"
29bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber#include "include/MPEG2TSExtractor.h"
30bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "ARTPSession.h"
3239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "APacketSource.h"
3339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "ASessionDescription.h"
3439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#include "UDPPusher.h"
3539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
364844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h>
37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h>
38bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h>
39bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h>
40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h>
41717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h>
42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h>
43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaDebug.h>
44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h>
45bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h>
46bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h>
47717826ececd8d39596f62418677721d70776add1Andreas Huber
485daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber#include <surfaceflinger/Surface.h>
493cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
50cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber#include <media/stagefright/foundation/ALooper.h>
51e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
52e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber#define USE_SURFACE_ALLOC 1
53e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber
54bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android {
55bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
568650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kLowWaterMarkUs = 2000000ll;  // 2secs
578650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberstatic int64_t kHighWaterMarkUs = 10000000ll;  // 10secs
588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
59bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event {
60c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    AwesomeEvent(
61c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            AwesomePlayer *player,
62c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            void (AwesomePlayer::*method)())
63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        : mPlayer(player),
64c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber          mMethod(method) {
65bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
66bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
67bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected:
68bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual ~AwesomeEvent() {}
69bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
70bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
71c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        (mPlayer->*mMethod)();
72bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
73bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
74bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate:
75bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomePlayer *mPlayer;
76c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    void (AwesomePlayer::*mMethod)();
77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
78bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent(const AwesomeEvent &);
79bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent &operator=(const AwesomeEvent &);
80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber};
81bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
82733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer {
83733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(
84733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
855daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber            const sp<Surface> &surface,
86733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            size_t displayWidth, size_t displayHeight,
87ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            size_t decodedWidth, size_t decodedHeight,
88ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            int32_t rotationDegrees)
890a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        : mTarget(NULL) {
900a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber            init(colorFormat, surface,
910a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber                 displayWidth, displayHeight,
92ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                 decodedWidth, decodedHeight,
93ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                 rotationDegrees);
94733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
95733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
96733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual void render(MediaBuffer *buffer) {
97fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        render((const uint8_t *)buffer->data() + buffer->range_offset(),
98fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber               buffer->range_length());
99fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
100fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    void render(const void *data, size_t size) {
102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mTarget->render(data, size, NULL);
103733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
104733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
105733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected:
106733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual ~AwesomeLocalRenderer() {
107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        delete mTarget;
108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        mTarget = NULL;
109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate:
1120a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    SoftwareRenderer *mTarget;
113988e3f0b2c74095deae580157c57935a98573052Andreas Huber
114988e3f0b2c74095deae580157c57935a98573052Andreas Huber    void init(
115988e3f0b2c74095deae580157c57935a98573052Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1165daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber            const sp<Surface> &surface,
117988e3f0b2c74095deae580157c57935a98573052Andreas Huber            size_t displayWidth, size_t displayHeight,
118ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            size_t decodedWidth, size_t decodedHeight,
119ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            int32_t rotationDegrees);
120733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
121733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(const AwesomeLocalRenderer &);
122733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
123733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber};
124733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
125988e3f0b2c74095deae580157c57935a98573052Andreas Hubervoid AwesomeLocalRenderer::init(
126988e3f0b2c74095deae580157c57935a98573052Andreas Huber        OMX_COLOR_FORMATTYPE colorFormat,
1275daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber        const sp<Surface> &surface,
128988e3f0b2c74095deae580157c57935a98573052Andreas Huber        size_t displayWidth, size_t displayHeight,
129ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        size_t decodedWidth, size_t decodedHeight,
130ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        int32_t rotationDegrees) {
1310a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    mTarget = new SoftwareRenderer(
1320a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber            colorFormat, surface, displayWidth, displayHeight,
133ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            decodedWidth, decodedHeight, rotationDegrees);
134988e3f0b2c74095deae580157c57935a98573052Andreas Huber}
135988e3f0b2c74095deae580157c57935a98573052Andreas Huber
1366a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisstruct AwesomeNativeWindowRenderer : public AwesomeRenderer {
137ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    AwesomeNativeWindowRenderer(
138ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            const sp<ANativeWindow> &nativeWindow,
139ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            int32_t rotationDegrees)
1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        : mNativeWindow(nativeWindow) {
141ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        applyRotation(rotationDegrees);
1426a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1436a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1446a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual void render(MediaBuffer *buffer) {
1456a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        status_t err = mNativeWindow->queueBuffer(
1466a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                mNativeWindow.get(), buffer->graphicBuffer().get());
1476a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        if (err != 0) {
1486a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            LOGE("queueBuffer failed with error %s (%d)", strerror(-err),
1496a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis                    -err);
1506a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            return;
1516a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        }
1526a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1536a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        sp<MetaData> metaData = buffer->meta_data();
1546a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis        metaData->setInt32(kKeyRendered, 1);
1556a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    }
1566a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1576a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprotected:
1586a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    virtual ~AwesomeNativeWindowRenderer() {}
1596a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1606a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennisprivate:
1616a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    sp<ANativeWindow> mNativeWindow;
1626a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
163ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    void applyRotation(int32_t rotationDegrees) {
164ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        uint32_t transform;
165ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        switch (rotationDegrees) {
166ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 0: transform = 0; break;
167ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 90: transform = HAL_TRANSFORM_ROT_90; break;
168ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 180: transform = HAL_TRANSFORM_ROT_180; break;
169ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            case 270: transform = HAL_TRANSFORM_ROT_270; break;
170ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            default: transform = 0; break;
171ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
172ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
173ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        if (transform) {
174ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            CHECK_EQ(0, native_window_set_buffers_transform(
175ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                        mNativeWindow.get(), transform));
176ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        }
177ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
178ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
1796a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer(const AwesomeNativeWindowRenderer &);
1806a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    AwesomeNativeWindowRenderer &operator=(
1816a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis            const AwesomeNativeWindowRenderer &);
1826a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis};
1836a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer()
1852e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    : mQueueStarted(false),
1862e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber      mTimeSource(NULL),
187fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber      mVideoRendererIsPreview(false),
188bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mAudioPlayer(NULL),
189bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber      mFlags(0),
190acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber      mExtractorFlags(0),
191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mLastVideoBuffer(NULL),
1927b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber      mVideoBuffer(NULL),
193dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang      mSuspensionState(NULL),
194dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang      mDecryptHandle(NULL) {
195bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    CHECK_EQ(mClient.connect(), OK);
196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
197bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    DataSource::RegisterDefaultSniffers();
198bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
199c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
200bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
201c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone);
202bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
203c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate);
20466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
205c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
206c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mCheckAudioStatusEvent = new AwesomeEvent(
207c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onCheckAudioStatus);
208c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2091862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() {
2152e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mQueueStarted) {
2162e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.stop();
2172e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mClient.disconnect();
222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
22466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) {
225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mVideoEvent->eventID());
226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
227bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mStreamDoneEvent->eventID());
228bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
2291862a33b246249630b654182afb5914da3480d4cAndreas Huber    mQueue.cancelEvent(mCheckAudioStatusEvent->eventID());
2301862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
23166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
23266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (!keepBufferingGoing) {
23366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mQueue.cancelEvent(mBufferingEvent->eventID());
23466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mBufferingEventPending = false;
23566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
237bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2380726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) {
239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
240bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mListener = listener;
241bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2435561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource(
2445561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
2467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(uri, headers);
2477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2497b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
251bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
252bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
253bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri = uri;
25466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
255e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber    if (!strncmp("http://", uri, 7)) {
256e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        // Hack to support http live.
257e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber
258e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        size_t len = strlen(uri);
259e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        if (!strcasecmp(&uri[len - 5], ".m3u8")) {
260e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber            mUri = "httplive://";
261e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber            mUri.append(&uri[7]);
262e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber        }
263e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber    }
264e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber
265bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (headers) {
266bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mUriHeaders = *headers;
26766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
26866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
269bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // The actual work will be done during preparation in the call to
270bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // ::finishSetDataSource_l to avoid blocking the calling thread in
271bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // setDataSource for any significant time.
27266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
273bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return OK;
274bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
275bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
276bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource(
277bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int fd, int64_t offset, int64_t length) {
278bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
281bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<DataSource> dataSource = new FileSource(fd, offset, length);
283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2847b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    status_t err = dataSource->initCheck();
285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2907b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource = dataSource;
2917b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
2927b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(dataSource);
2937b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
2947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
2957b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2967b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const sp<DataSource> &dataSource) {
2977b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
298bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (extractor == NULL) {
300bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
301bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
303dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    dataSource->getDrmInfo(&mDecryptHandle, &mDrmManagerClient);
30455426ce7eded04c9993149edd86f861cfccb4d19Gloria Wang    if (mDecryptHandle != NULL
30555426ce7eded04c9993149edd86f861cfccb4d19Gloria Wang            && RightsStatus::RIGHTS_VALID != mDecryptHandle->status) {
30655426ce7eded04c9993149edd86f861cfccb4d19Gloria Wang        notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE);
307dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
308dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return setDataSource_l(extractor);
310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
3137fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // Attempt to approximate overall stream bitrate by summing all
3147fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // tracks' individual bitrates, if not all of them advertise bitrate,
3157fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    // we have to fail.
3167fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3177fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t totalBitRate = 0;
3187fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3197fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
3207fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
3217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3227fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        int32_t bitrate;
3237fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        if (!meta->findInt32(kKeyBitRate, &bitrate)) {
3247fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            totalBitRate = -1;
3257fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            break;
3267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        }
3277fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3287fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        totalBitRate += bitrate;
3297fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
3307fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3317fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = totalBitRate;
3327fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
3337fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    LOGV("mBitrate = %lld bits/sec", mBitrate);
3347fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveAudio = false;
336bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveVideo = false;
337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
338bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
339bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const char *mime;
341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
34488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setVideoSource(extractor->getTrack(i));
34588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveVideo = true;
346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
34788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setAudioSource(extractor->getTrack(i));
34888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveAudio = true;
3498ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber
3506954535ba64374e4e941cd83019a7af53edfb098Andreas Huber            if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_VORBIS)) {
3516954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // Only do this for vorbis audio, none of the other audio
3526954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // formats even support this ringtone specific hack and
3536954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // retrieving the metadata on some extractors may turn out
3546954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                // to be very expensive.
3556954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                sp<MetaData> fileMeta = extractor->getMetaData();
3566954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                int32_t loop;
3576954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                if (fileMeta != NULL
3586954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                        && fileMeta->findInt32(kKeyAutoLoop, &loop) && loop != 0) {
3596954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                    mFlags |= AUTO_LOOPING;
3606954535ba64374e4e941cd83019a7af53edfb098Andreas Huber                }
3618ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber            }
362bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
364bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (haveAudio && haveVideo) {
365bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            break;
366bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
367bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
368bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
369acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    if (!haveAudio && !haveVideo) {
370acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return UNKNOWN_ERROR;
371acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
372acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
373acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = extractor->flags();
374acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
375acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
376bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
377bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
378bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() {
379bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
380bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
381bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
382bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
383bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() {
384dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
385dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
386dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::STOP, 0);
387b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            mDrmManagerClient->closeDecryptSession(mDecryptHandle);
388dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDecryptHandle = NULL;
389dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient = NULL;
390dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
391dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
392e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mFlags & PREPARING) {
393e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mFlags |= PREPARE_CANCELLED;
394e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (mConnectingDataSource != NULL) {
395e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            LOGI("interrupting the connection process");
396e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource->disconnect();
397e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
3986a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
3996a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        if (mFlags & PREPARING_CONNECTED) {
4006a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // We are basically done preparing, we're just buffering
4016a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            // enough data to start playback, we can safely interrupt that.
4026a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber            finishAsyncPrepare_l();
4036a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber        }
404e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
405e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
406bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
407bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mPreparedCondition.wait(mLock);
408bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
409bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
410bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    cancelPlayerEvents();
411bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
4120a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mCachedSource.clear();
41388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack.clear();
41488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack.clear();
41588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
4167b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // Shutdown audio first, so that the respone to the reset request
4177b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // appears to happen instantaneously as far as the user is concerned
4187b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // If we did this later, audio would continue playing while we
4197b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // shutdown the video-related resources and the player appear to
4207b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // not be as responsive to a reset request.
421e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mAudioPlayer == NULL && mAudioSource != NULL) {
422e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // If we had an audio player, it would have effectively
423e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // taken possession of the audio source and stopped it when
424e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        // _it_ is stopped. Otherwise this is still our responsibility.
425e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mAudioSource->stop();
426e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
4277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioSource.clear();
4287b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
4297b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mTimeSource = NULL;
4307b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
4317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete mAudioPlayer;
4327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioPlayer = NULL;
4337b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
434b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber    mVideoRenderer.clear();
435b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber
436bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mLastVideoBuffer) {
437bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mLastVideoBuffer->release();
438bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mLastVideoBuffer = NULL;
439bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
440bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
441bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoBuffer) {
442bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer->release();
443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer = NULL;
444bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
445bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
446cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    if (mRTSPController != NULL) {
447cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        mRTSPController->disconnect();
448cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        mRTSPController.clear();
449cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    }
450cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber
45139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    mRTPPusher.clear();
45239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    mRTCPPusher.clear();
45339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    mRTPSession.clear();
454cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
455bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
456bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoSource->stop();
45769f5f4c021ee55055df39718244c036faf2d3382Andreas Huber
45869f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // The following hack is necessary to ensure that the OMX
45969f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // component is completely released by the time we may try
46069f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // to instantiate it again.
46169f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        wp<MediaSource> tmp = mVideoSource;
462bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoSource.clear();
46369f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        while (tmp.promote() != NULL) {
46469f5f4c021ee55055df39718244c036faf2d3382Andreas Huber            usleep(1000);
46569f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        }
46669f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        IPCThreadState::self()->flushCommands();
467bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
468bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
469bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mDurationUs = -1;
470bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags = 0;
471acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    mExtractorFlags = 0;
472bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoWidth = mVideoHeight = -1;
473bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mTimeSourceDeltaUs = 0;
474bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoTimeUs = 0;
475bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
476bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeeking = false;
4771321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    mSeekNotificationSent = false;
478bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = 0;
47966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
480bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri.setTo("");
481bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUriHeaders.clear();
4827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
4837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource.clear();
4847b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
4857b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete mSuspensionState;
4867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mSuspensionState = NULL;
4877fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
4887fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    mBitrate = -1;
489bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
490bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
491c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) {
4920726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber    if (mListener != NULL) {
4930726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        sp<MediaPlayerBase> listener = mListener.promote();
4940726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
4950726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        if (listener != NULL) {
496c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            listener->sendEvent(msg, ext1, ext2);
49766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        }
49866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
49966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
50066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
5017fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huberbool AwesomePlayer::getBitrate(int64_t *bitrate) {
5027fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    off_t size;
5037fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mDurationUs >= 0 && mCachedSource != NULL
5047fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            && mCachedSource->getSize(&size) == OK) {
5057fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = size * 8000000ll / mDurationUs;  // in bits/sec
5067fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
5077fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
5087fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5097fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    if (mBitrate >= 0) {
5107fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        *bitrate = mBitrate;
5117fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber        return true;
5127fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    }
5137fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5147fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    *bitrate = 0;
5157fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5167fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    return false;
5177fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber}
5187fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber
5198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber// Returns true iff cached duration is available/applicable.
5208650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huberbool AwesomePlayer::getCachedDuration_l(int64_t *durationUs, bool *eos) {
5217fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    int64_t bitrate;
5228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
5238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mRTSPController != NULL) {
5248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        *durationUs = mRTSPController->getQueueDurationUs(eos);
5258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return true;
5267fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber    } else if (mCachedSource != NULL && getBitrate(&bitrate)) {
5278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(eos);
5288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        *durationUs = cachedDataRemaining * 8000000ll / bitrate;
5298650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return true;
5308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
5318650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
5328650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    return false;
5338650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
5348650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
53534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Hubervoid AwesomePlayer::ensureCacheIsFetching_l() {
53634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    if (mCachedSource != NULL) {
53734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber        mCachedSource->resumeFetchingIfNecessary();
53834ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber    }
53934ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber}
54034ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
54166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() {
54266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    Mutex::Autolock autoLock(mLock);
543d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mBufferingEventPending) {
544d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
545d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
54666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
54766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
5488650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mCachedSource != NULL) {
549c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber        bool eos;
5508650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&eos);
551c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
5528650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (eos) {
5538650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            notifyListener_l(MEDIA_BUFFERING_UPDATE, 100);
55483977eb230d829cfe520f55d7977037a904ce548Andreas Huber            if (mFlags & PREPARING) {
55583977eb230d829cfe520f55d7977037a904ce548Andreas Huber                LOGV("cache has reached EOS, prepare is done.");
55683977eb230d829cfe520f55d7977037a904ce548Andreas Huber                finishAsyncPrepare_l();
55783977eb230d829cfe520f55d7977037a904ce548Andreas Huber            }
5588650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        } else {
5597fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            int64_t bitrate;
5607fbdb0903dfbf70b314a74e64e28fb880cdb9247Andreas Huber            if (getBitrate(&bitrate)) {
5618650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                size_t cachedSize = mCachedSource->cachedSize();
5628650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int64_t cachedDurationUs = cachedSize * 8000000ll / bitrate;
563c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
5648650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                int percentage = 100.0 * (double)cachedDurationUs / mDurationUs;
5658650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if (percentage > 100) {
5668650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    percentage = 100;
5678650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
568c9e894872c298b25fe9d74e68aa1e7287a541ac3Andreas Huber
5698650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage);
5708650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else {
5718650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // We don't know the bitrate of the stream, use absolute size
5728650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                // limits to maintain the cache.
5738650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
574bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber                const size_t kLowWaterMarkBytes = 40000;
575bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber                const size_t kHighWaterMarkBytes = 200000;
5768650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber
5778650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                if ((mFlags & PLAYING) && !eos
5788650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        && (cachedDataRemaining < kLowWaterMarkBytes)) {
5798650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    LOGI("cache is running low (< %d) , pausing.",
5808650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                         kLowWaterMarkBytes);
5818650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    mFlags |= CACHE_UNDERRUN;
5828650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    pause_l();
58334ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber                    ensureCacheIsFetching_l();
5848650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
5858650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                } else if (eos || cachedDataRemaining > kHighWaterMarkBytes) {
5868650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    if (mFlags & CACHE_UNDERRUN) {
5878650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        LOGI("cache has filled up (> %d), resuming.",
5888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
5898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        mFlags &= ~CACHE_UNDERRUN;
5908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        play_l();
5918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
5928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    } else if (mFlags & PREPARING) {
5938650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        LOGV("cache has filled up (> %d), prepare is done",
5948650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                             kHighWaterMarkBytes);
5958650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                        finishAsyncPrepare_l();
5968650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                    }
5978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                }
5988650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            }
5998650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        }
6002415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
6012415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber
6028650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    int64_t cachedDurationUs;
6032a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber    bool eos;
6048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (getCachedDuration_l(&cachedDurationUs, &eos)) {
60534ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber        LOGV("cachedDurationUs = %.2f secs, eos=%d",
60634ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber             cachedDurationUs / 1E6, eos);
60734ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber
6088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if ((mFlags & PLAYING) && !eos
6098650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                && (cachedDurationUs < kLowWaterMarkUs)) {
6108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            LOGI("cache is running low (%.2f secs) , pausing.",
6118650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                 cachedDurationUs / 1E6);
6128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            mFlags |= CACHE_UNDERRUN;
6138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            pause_l();
61434ef0f32c8fc0186236a27e07405328cc1f7c56dAndreas Huber            ensureCacheIsFetching_l();
6158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_START);
6168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        } else if (eos || cachedDurationUs > kHighWaterMarkUs) {
6178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            if (mFlags & CACHE_UNDERRUN) {
6188650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                LOGI("cache has filled up (%.2f secs), resuming.",
6198650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
6208650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                mFlags &= ~CACHE_UNDERRUN;
6218650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                play_l();
6228650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                notifyListener_l(MEDIA_INFO, MEDIA_INFO_BUFFERING_END);
6238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            } else if (mFlags & PREPARING) {
6248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                LOGV("cache has filled up (%.2f secs), prepare is done",
6258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                     cachedDurationUs / 1E6);
6268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber                finishAsyncPrepare_l();
6272a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber            }
6282a4b49bd3863024884a694b454e2e452752e6ea0Andreas Huber        }
6290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
6300a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
6310a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    postBufferingEvent_l();
6320726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber}
6330726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
6342a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Hubervoid AwesomePlayer::partial_reset_l() {
6352a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    // Only reset the video renderer and shut down the video decoder.
6362a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    // Then instantiate a new video decoder and resume video playback.
6372a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6382a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    mVideoRenderer.clear();
6392a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6402a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    if (mLastVideoBuffer) {
6412a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mLastVideoBuffer->release();
6422a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mLastVideoBuffer = NULL;
6432a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
6442a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6452a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    if (mVideoBuffer) {
6462a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mVideoBuffer->release();
6472a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mVideoBuffer = NULL;
6482a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
6492a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6502a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    {
6512a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mVideoSource->stop();
6522a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6532a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        // The following hack is necessary to ensure that the OMX
6542a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        // component is completely released by the time we may try
6552a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        // to instantiate it again.
6562a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        wp<MediaSource> tmp = mVideoSource;
6572a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        mVideoSource.clear();
6582a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        while (tmp.promote() != NULL) {
6592a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber            usleep(1000);
6602a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        }
6612a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        IPCThreadState::self()->flushCommands();
6622a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    }
6632a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6642a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    CHECK_EQ(OK, initVideoDecoder(OMXCodec::kIgnoreCodecSpecificData));
6652a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber}
6662a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
667bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() {
668bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    // Posted whenever any stream finishes playing.
669bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
670bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
671d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mStreamDoneEventPending) {
672d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
673d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
674bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
675bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
6762a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    if (mStreamDoneStatus == INFO_DISCONTINUITY) {
6772a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        // This special status is returned because an http live stream's
6782a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        // video stream switched to a different bandwidth at this point
6792a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        // and future data may have been encoded using different parameters.
6802a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        // This requires us to shutdown the video decoder and reinstantiate
6812a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        // a fresh one.
6822a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6832a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        LOGV("INFO_DISCONTINUITY");
6842a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6852a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        CHECK(mVideoSource != NULL);
6862a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber
6872a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        partial_reset_l();
6882a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        postVideoEvent_l();
6892a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber        return;
6902a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huber    } else if (mStreamDoneStatus != ERROR_END_OF_STREAM) {
6915d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        LOGV("MEDIA_ERROR %d", mStreamDoneStatus);
6925d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
6935d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(
6945d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber                MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
6955d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
696b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
6975d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
6985d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mFlags |= AT_EOS;
6995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
7005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
7015d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
7025d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    const bool allDone =
7035d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        (mVideoSource == NULL || (mFlags & VIDEO_AT_EOS))
7045d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber            && (mAudioSource == NULL || (mFlags & AUDIO_AT_EOS));
7055d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
7065d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!allDone) {
7075d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        return;
7085d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    }
7095d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
7108ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    if (mFlags & (LOOPING | AUTO_LOOPING)) {
711bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        seekTo_l(0);
712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
713a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        if (mVideoSource != NULL) {
714bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            postVideoEvent_l();
715bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
716bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
7175d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        LOGV("MEDIA_PLAYBACK_COMPLETE");
7185d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
719bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
720b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        pause_l(true /* at eos */);
7212e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
7222e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mFlags |= AT_EOS;
723bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
724bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
725bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
726bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() {
727bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
7280a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
7290a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mFlags &= ~CACHE_UNDERRUN;
7300a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
7317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return play_l();
7327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
733bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
7347b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() {
735bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & PLAYING) {
736bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
737bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
738bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
739bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (!(mFlags & PREPARED)) {
740bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        status_t err = prepare_l();
741bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
742bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        if (err != OK) {
743bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            return err;
744bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
745bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
746bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
747bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags |= PLAYING;
748bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags |= FIRST_FRAME;
749bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
750fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    bool deferredAudioSeek = false;
751fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber
752bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
753bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mAudioPlayer == NULL) {
754bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mAudioSink != NULL) {
755ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber                mAudioPlayer = new AudioPlayer(mAudioSink, this);
756bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mAudioPlayer->setSource(mAudioSource);
757e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
758e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber                // We've already started the MediaSource in order to enable
759e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber                // the prefetcher to read its data.
760e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber                status_t err = mAudioPlayer->start(
761e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber                        true /* sourceAlreadyStarted */);
76288c030e0e0152791ff74f90249f55fce01371198Andreas Huber
76388c030e0e0152791ff74f90249f55fce01371198Andreas Huber                if (err != OK) {
76488c030e0e0152791ff74f90249f55fce01371198Andreas Huber                    delete mAudioPlayer;
76588c030e0e0152791ff74f90249f55fce01371198Andreas Huber                    mAudioPlayer = NULL;
76688c030e0e0152791ff74f90249f55fce01371198Andreas Huber
76788c030e0e0152791ff74f90249f55fce01371198Andreas Huber                    mFlags &= ~(PLAYING | FIRST_FRAME);
76888c030e0e0152791ff74f90249f55fce01371198Andreas Huber
76988c030e0e0152791ff74f90249f55fce01371198Andreas Huber                    return err;
77088c030e0e0152791ff74f90249f55fce01371198Andreas Huber                }
771bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
772bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mTimeSource = mAudioPlayer;
773bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
774fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber                deferredAudioSeek = true;
7751862a33b246249630b654182afb5914da3480d4cAndreas Huber
7761862a33b246249630b654182afb5914da3480d4cAndreas Huber                mWatchForAudioSeekComplete = false;
7771862a33b246249630b654182afb5914da3480d4cAndreas Huber                mWatchForAudioEOS = true;
778bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
779bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        } else {
780bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mAudioPlayer->resume();
781bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
782bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
783bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
784bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mTimeSource == NULL && mAudioPlayer == NULL) {
7855d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSource = &mSystemTimeSource;
786bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
787bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
788bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
789a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        // Kick off video playback
790a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        postVideoEvent_l();
791bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
792bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
793fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    if (deferredAudioSeek) {
794fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        // If there was a seek request while we were paused
795fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        // and we're just starting up again, honor the request now.
796fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        seekAudioIfNecessary_l();
797fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    }
798fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber
7992e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mFlags & AT_EOS) {
8002e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // Legacy behaviour, if a stream finishes playing and then
8012e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // is started again, we play from the start...
8022e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        seekTo_l(0);
8032e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
8042e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
805dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
806dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        int64_t position;
807dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        getPosition(&position);
808dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
809dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                Playback::START, position / 1000);
810dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
811dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
812bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
813bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
814bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
8155daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::notifyVideoSize_l() {
8165daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
8175daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
8185daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    int32_t decodedWidth, decodedHeight;
8195daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
8205daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
8215daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
822ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
823ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
824ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
825ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
826ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
827ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
828ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (rotationDegrees == 90 || rotationDegrees == 270) {
829ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
830ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                MEDIA_SET_VIDEO_SIZE, decodedHeight, decodedWidth);
831ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    } else {
832ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        notifyListener_l(
833ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                MEDIA_SET_VIDEO_SIZE, decodedWidth, decodedHeight);
834ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
8355daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
8365daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
837bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() {
8380a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    if (mSurface == NULL) {
8390a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        return;
8400a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    }
841bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
8420a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    sp<MetaData> meta = mVideoSource->getFormat();
843bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
8440a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t format;
8450a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    const char *component;
8460a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    int32_t decodedWidth, decodedHeight;
8470a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyColorFormat, &format));
8480a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findCString(kKeyDecoderComponent, &component));
8490a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
8500a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
8514844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
852ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    int32_t rotationDegrees;
853ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    if (!mVideoTrack->getFormat()->findInt32(
854ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                kKeyRotation, &rotationDegrees)) {
855ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        rotationDegrees = 0;
856ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber    }
857ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber
8580a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    mVideoRenderer.clear();
8594844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
8600a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // Must ensure that mVideoRenderer's destructor is actually executed
8610a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    // before creating a new one.
8620a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    IPCThreadState::self()->flushCommands();
8630a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber
8640a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    if (USE_SURFACE_ALLOC && strncmp(component, "OMX.", 4) == 0) {
8650a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Hardware decoders avoid the CPU color conversion by decoding
8660a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // directly to ANativeBuffers, so we must use a renderer that
8670a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // just pushes those buffers to the ANativeWindow.
868ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber        mVideoRenderer =
869ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            new AwesomeNativeWindowRenderer(mSurface, rotationDegrees);
8700a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    } else {
8710a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // Other decoders are instantiated locally and as a consequence
8720a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // allocate their buffers in local address space.  This renderer
8730a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // then performs a color conversion and copy to get the data
8740a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        // into the ANativeBuffer.
8750a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber        mVideoRenderer = new AwesomeLocalRenderer(
8760a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber            (OMX_COLOR_FORMATTYPE)format,
8770a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber            mSurface,
8780a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber            mVideoWidth, mVideoHeight,
879ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            decodedWidth, decodedHeight,
880ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber            rotationDegrees);
881bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
882bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
883bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
884bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() {
885bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
8860a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
8870a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    mFlags &= ~CACHE_UNDERRUN;
8880a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
889bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause_l();
890bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
891bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
892b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huberstatus_t AwesomePlayer::pause_l(bool at_eos) {
893bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!(mFlags & PLAYING)) {
894bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
895bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
896bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
89766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    cancelPlayerEvents(true /* keepBufferingGoing */);
898bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
899bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioPlayer != NULL) {
900b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        if (at_eos) {
901b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // If we played the audio stream to completion we
902b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // want to make sure that all samples remaining in the audio
903b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            // track's queue are played out.
904b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioPlayer->pause(true /* playPendingSamples */);
905b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        } else {
906b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber            mAudioPlayer->pause();
907b2e3954c94717e43b3dc9b880564f166cfbbc0a2Andreas Huber        }
908bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags &= ~PLAYING;
911bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
912dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    if (mDecryptHandle != NULL) {
913dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
914dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                Playback::PAUSE, 0);
915dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
916dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
917bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
918bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
919bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
920bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const {
9210a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    return (mFlags & PLAYING) || (mFlags & CACHE_UNDERRUN);
922bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9245daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Hubervoid AwesomePlayer::setSurface(const sp<Surface> &surface) {
9255daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    Mutex::Autolock autoLock(mLock);
9265daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
9275daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber    mSurface = surface;
9285daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber}
9295daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
930bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink(
931bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const sp<MediaPlayerBase::AudioSink> &audioSink) {
932bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
933bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
934bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mAudioSink = audioSink;
935bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
936bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
937bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) {
938bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
939bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
940bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags = mFlags & ~LOOPING;
941bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
942bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (shouldLoop) {
943bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mFlags |= LOOPING;
944bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
945bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
946bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
947bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
948bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
949bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) {
9502415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    Mutex::Autolock autoLock(mMiscStateLock);
951bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
952bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mDurationUs < 0) {
953bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
954bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
955bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
956bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *durationUs = mDurationUs;
957bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
958bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
959bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
960bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
961bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) {
9628d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    if (mRTSPController != NULL) {
9638d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber        *positionUs = mRTSPController->getNormalPlayTimeUs();
9648d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    }
9658d342970108926c4ea355c90d26a2a353ec0fd47Andreas Huber    else if (mSeeking) {
966dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber        *positionUs = mSeekTimeUs;
967dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber    } else if (mVideoSource != NULL) {
9682415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        Mutex::Autolock autoLock(mMiscStateLock);
969bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mVideoTimeUs;
970bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else if (mAudioPlayer != NULL) {
971bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mAudioPlayer->getMediaTimeUs();
972bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
973bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = 0;
974bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
975bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
976bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
977bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
978bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
979bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) {
98070f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber    if (mExtractorFlags & MediaExtractor::CAN_SEEK) {
981acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        Mutex::Autolock autoLock(mLock);
982acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return seekTo_l(timeUs);
983acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    }
984acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
985acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
986bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
987bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9880dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber// static
9890dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::OnRTSPSeekDoneWrapper(void *cookie) {
9900dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    static_cast<AwesomePlayer *>(cookie)->onRTSPSeekDone();
9910dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber}
9920dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber
9930dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Hubervoid AwesomePlayer::onRTSPSeekDone() {
9940dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    notifyListener_l(MEDIA_SEEK_COMPLETE);
9950dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber    mSeekNotificationSent = true;
9960dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber}
9970dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber
998bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) {
999cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    if (mRTSPController != NULL) {
10000dcd837af4169bdb6fb2a0c384722dc4f57433c6Andreas Huber        mRTSPController->seekAsync(timeUs, OnRTSPSeekDoneWrapper, this);
1001cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber        return OK;
1002cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber    }
1003cce326fe43411855aca2f719e505b051bc4b61b3Andreas Huber
10040a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    if (mFlags & CACHE_UNDERRUN) {
10050a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        mFlags &= ~CACHE_UNDERRUN;
10060a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        play_l();
10070a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber    }
10080a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1009bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeeking = true;
10101321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    mSeekNotificationSent = false;
1011bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = timeUs;
10125d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS);
1013bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1014bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    seekAudioIfNecessary_l();
1015bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10161321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    if (!(mFlags & PLAYING)) {
10171321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        LOGV("seeking while paused, sending SEEK_COMPLETE notification"
10181321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber             " immediately.");
10191321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
10201321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
10211321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        mSeekNotificationSent = true;
10221321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber    }
10231321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
1024bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1025bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1026bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1027bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() {
1028a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mSeeking && mVideoSource == NULL && mAudioPlayer != NULL) {
1029bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mAudioPlayer->seekTo(mSeekTimeUs);
1030bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10311862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = true;
10321862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = true;
10331321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        mSeekNotificationSent = false;
1034dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
1035dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        if (mDecryptHandle != NULL) {
1036dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1037dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::PAUSE, 0);
1038dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang            mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1039dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang                    Playback::START, mSeekTimeUs / 1000);
1040dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang        }
1041bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1042bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1043bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1044bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getVideoDimensions(
1045bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int32_t *width, int32_t *height) const {
1046bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
1047bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1048bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoWidth < 0 || mVideoHeight < 0) {
1049bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
1050bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1051bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1052bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *width = mVideoWidth;
1053bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *height = mVideoHeight;
1054bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1055bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
1056bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1057bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
105888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) {
105988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1060bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
106188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack = source;
106288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
106388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
106488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() {
106588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    sp<MetaData> meta = mAudioTrack->getFormat();
1066717826ececd8d39596f62418677721d70776add1Andreas Huber
1067717826ececd8d39596f62418677721d70776add1Andreas Huber    const char *mime;
1068717826ececd8d39596f62418677721d70776add1Andreas Huber    CHECK(meta->findCString(kKeyMIMEType, &mime));
1069717826ececd8d39596f62418677721d70776add1Andreas Huber
1070717826ececd8d39596f62418677721d70776add1Andreas Huber    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
107188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        mAudioSource = mAudioTrack;
1072717826ececd8d39596f62418677721d70776add1Andreas Huber    } else {
1073717826ececd8d39596f62418677721d70776add1Andreas Huber        mAudioSource = OMXCodec::Create(
107488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mClient.interface(), mAudioTrack->getFormat(),
1075717826ececd8d39596f62418677721d70776add1Andreas Huber                false, // createEncoder
107688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mAudioTrack);
1077717826ececd8d39596f62418677721d70776add1Andreas Huber    }
1078bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1079bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
1080bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
108188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
10822415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1083bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1084bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1085bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1086bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1087bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1088a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        status_t err = mAudioSource->start();
1089a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber
1090a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        if (err != OK) {
1091a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            mAudioSource.clear();
1092a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber            return err;
1093a945bfd91aa291fba4d9201ffcb38fce40eab7feAndreas Huber        }
109481f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_QCELP)) {
109581f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // For legacy reasons we're simply going to ignore the absence
109681f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // of an audio decoder for QCELP instead of aborting playback
109781f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        // altogether.
109881f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber        return OK;
109981f82c32459029bf0744e28c73f95a7f18cab5acAndreas Huber    }
1100e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
1101bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mAudioSource != NULL ? OK : UNKNOWN_ERROR;
1102bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
110488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) {
110588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
1106bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
110788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack = source;
110888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
110988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
11102a4d22d79e927f2245537921e10fc5fda1c47a29Andreas Huberstatus_t AwesomePlayer::initVideoDecoder(uint32_t flags) {
1111bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoSource = OMXCodec::Create(
111288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            mClient.interface(), mVideoTrack->getFormat(),
1113bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            false, // createEncoder
111439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            mVideoTrack,
1115e332a9181cf6a3155ed1a0fd2afc212ccb1f2753Andreas Huber            NULL, flags, USE_SURFACE_ALLOC ? mSurface : NULL);
1116bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1117bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
1118bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
111988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
11202415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber            Mutex::Autolock autoLock(mMiscStateLock);
1121bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
1122bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
1123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1125bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
112688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        CHECK(mVideoTrack->getFormat()->findInt32(kKeyWidth, &mVideoWidth));
112788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        CHECK(mVideoTrack->getFormat()->findInt32(kKeyHeight, &mVideoHeight));
1128bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1129139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        status_t err = mVideoSource->start();
1130139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber
1131139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        if (err != OK) {
1132139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            mVideoSource.clear();
1133139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber            return err;
1134139a5d5bd33c9fc7708d0a79f11ee928f7796e6bAndreas Huber        }
1135bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1136bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1137bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mVideoSource != NULL ? OK : UNKNOWN_ERROR;
1138bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1139bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
11404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Hubervoid AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) {
11414769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    if (!mSeeking) {
11424769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        return;
11434769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    }
11444769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
11454769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    if (mAudioPlayer != NULL) {
1146f83dd80384f70da1f6d36d60e831439ff7739ad7Jamie Gennis        LOGV("seeking audio to %lld us (%.2f secs).", videoTimeUs, videoTimeUs / 1E6);
11474769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
11484769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // If we don't have a video time, seek audio to the originally
11494769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // requested seek time instead.
11504769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
11514769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs);
11524769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mAudioPlayer->resume();
11534769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mWatchForAudioSeekComplete = true;
11544769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        mWatchForAudioEOS = true;
11554769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    } else if (!mSeekNotificationSent) {
11564769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // If we're playing video only, report seek complete now,
11574769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        // otherwise audio player will notify us later.
11584769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
11594769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    }
11604769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
11614769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    mFlags |= FIRST_FRAME;
11624769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    mSeeking = false;
11634769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    mSeekNotificationSent = false;
1164a89082944308805b0def7de87c67e370e74b8789Gloria Wang
1165a89082944308805b0def7de87c67e370e74b8789Gloria Wang    if (mDecryptHandle != NULL) {
1166a89082944308805b0def7de87c67e370e74b8789Gloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1167a89082944308805b0def7de87c67e370e74b8789Gloria Wang                Playback::PAUSE, 0);
1168a89082944308805b0def7de87c67e370e74b8789Gloria Wang        mDrmManagerClient->setPlaybackStatus(mDecryptHandle,
1169a89082944308805b0def7de87c67e370e74b8789Gloria Wang                Playback::START, videoTimeUs / 1000);
1170a89082944308805b0def7de87c67e370e74b8789Gloria Wang    }
11714769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber}
11724769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
1173c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() {
1174bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
11757b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (!mVideoEventPending) {
11767b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // The event has been cancelled in reset_l() but had already
11777b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // been scheduled for execution at that time.
11787b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return;
11797b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
1180bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
1181bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1182bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mSeeking) {
1183bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mLastVideoBuffer) {
1184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mLastVideoBuffer->release();
1185bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mLastVideoBuffer = NULL;
1186bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1187bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1188bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mVideoBuffer) {
1189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer->release();
1190bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer = NULL;
1191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
11920a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
11930a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        if (mCachedSource != NULL && mAudioSource != NULL) {
11940a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // We're going to seek the video source first, followed by
11950a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // the audio source.
11960a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // In order to avoid jumps in the DataSource offset caused by
11970a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // the audio codec prefetching data from the old locations
11980a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // while the video codec is already reading data from the new
11990a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // locations, we'll "pause" the audio source, causing it to
12000a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            // stop reading input data until a subsequent seek.
12010a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
12020a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            if (mAudioPlayer != NULL) {
12030a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber                mAudioPlayer->pause();
12040a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            }
12050a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber            mAudioSource->pause();
12060a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        }
1207bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1209bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!mVideoBuffer) {
1210bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        MediaSource::ReadOptions options;
1211bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mSeeking) {
1212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6);
1213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1214abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber            options.setSeekTo(
1215abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber                    mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST_SYNC);
1216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        for (;;) {
1218bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            status_t err = mVideoSource->read(&mVideoBuffer, &options);
1219c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber            options.clearSeekTo();
1220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (err != OK) {
1222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                CHECK_EQ(mVideoBuffer, NULL);
1223bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1224bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                if (err == INFO_FORMAT_CHANGED) {
1225bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    LOGV("VideoSource signalled format change.");
1226bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12275daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber                    notifyVideoSize_l();
12285daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber
1229a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    if (mVideoRenderer != NULL) {
1230fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        mVideoRendererIsPreview = false;
1231a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                        initRenderer_l();
1232a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    }
1233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    continue;
1234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                }
1235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12364769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // So video playback is complete, but we may still have
12374769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // a seek request pending that needs to be applied
12384769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                // to the audio track.
12394769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                if (mSeeking) {
12404769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                    LOGV("video stream ended while seeking!");
12414769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                }
12424769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber                finishSeekIfNecessary(-1);
12434769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber
12445d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber                mFlags |= VIDEO_AT_EOS;
12455295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber                postStreamDoneEvent_l(err);
1246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                return;
1247bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
1248bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12494844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            if (mVideoBuffer->range_length() == 0) {
125008411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // Some decoders, notably the PV AVC software decoder
125108411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // return spurious empty buffers that we just want to ignore.
125208411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber
12534844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer->release();
12544844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer = NULL;
12554844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                continue;
12564844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            }
12574844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
1258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            break;
1259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
1260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t timeUs;
1263bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
1264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12652415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    {
12662415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        Mutex::Autolock autoLock(mMiscStateLock);
12672415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber        mVideoTimeUs = timeUs;
12682415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    }
1269bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
127002a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber    bool wasSeeking = mSeeking;
12714769cc92740e3ab58e9263d42553c12bbf79e3beAndreas Huber    finishSeekIfNecessary(timeUs);
1272bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12735d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource;
12745d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber
1275bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & FIRST_FRAME) {
1276bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mFlags &= ~FIRST_FRAME;
1277bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12785d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mTimeSourceDeltaUs = ts->getRealTimeUs() - timeUs;
1279bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1280bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1281bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t realTimeUs, mediaTimeUs;
12825d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    if (!(mFlags & AUDIO_AT_EOS) && mAudioPlayer != NULL
1283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) {
1284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;
1285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12875d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber    int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs;
1288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t latenessUs = nowUs - timeUs;
1290bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
129102a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber    if (wasSeeking) {
129202a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber        // Let's display the first frame after seeking right away.
129302a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber        latenessUs = 0;
129402a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber    }
129502a1db7dc1de2f2df306ec10bab992bc8bbaaca8Andreas Huber
1296f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber    if (mRTPSession != NULL) {
1297f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber        // We'll completely ignore timestamps for gtalk videochat
1298f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber        // and we'll play incoming video as fast as we get it.
1299f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber        latenessUs = 0;
1300f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber    }
1301f8ca90452ff3e252f20de38f1c3eee524c808c3eAndreas Huber
1302650773d00356129ffd661cdaef3fb3095c343707Andreas Huber    if (latenessUs > 40000) {
1303650773d00356129ffd661cdaef3fb3095c343707Andreas Huber        // We're more than 40ms late.
1304ec9dd59902c8beea4ba6a842f3a843d46150d949Andreas Huber        LOGV("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6);
1305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer->release();
1307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer = NULL;
1308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        postVideoEvent_l();
1310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (latenessUs < -10000) {
1314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        // We're more than 10ms early.
1315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        postVideoEvent_l(10000);
1317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1318bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1320fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
1321fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRendererIsPreview = false;
1322fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1323a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        initRenderer_l();
1324a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1325a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber
1326a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mVideoRenderer != NULL) {
1327a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        mVideoRenderer->render(mVideoBuffer);
1328a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
1329bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1330bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mLastVideoBuffer) {
1331bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mLastVideoBuffer->release();
1332bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mLastVideoBuffer = NULL;
1333bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1334bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mLastVideoBuffer = mVideoBuffer;
1335bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoBuffer = NULL;
1336bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1337bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    postVideoEvent_l();
1338bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1339bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1340bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) {
1341bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoEventPending) {
1342bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1343bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1344bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1345bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = true;
1346bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs);
1347bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1348bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13495295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) {
1350bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mStreamDoneEventPending) {
1351bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
1352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
1353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = true;
13545295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber
13555295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    mStreamDoneStatus = status;
1356bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEvent(mStreamDoneEvent);
1357bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
1358bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
135966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() {
136066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mBufferingEventPending) {
136166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        return;
136266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
136366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = true;
136466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mQueue.postEventWithDelay(mBufferingEvent, 1000000ll);
136566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
136666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
13671862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l() {
13681862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mAudioStatusEventPending) {
13691862a33b246249630b654182afb5914da3480d4cAndreas Huber        return;
13701862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
13711862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = true;
1372ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber    mQueue.postEvent(mCheckAudioStatusEvent);
13731862a33b246249630b654182afb5914da3480d4cAndreas Huber}
13741862a33b246249630b654182afb5914da3480d4cAndreas Huber
13751862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() {
13761862a33b246249630b654182afb5914da3480d4cAndreas Huber    Mutex::Autolock autoLock(mLock);
1377d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mAudioStatusEventPending) {
1378d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        // Event was dispatched and while we were blocking on the mutex,
1379d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        // has already been cancelled.
1380d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
1381d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
1382d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber
13831862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
13841862a33b246249630b654182afb5914da3480d4cAndreas Huber
13851862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) {
13861862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = false;
13871321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber
13881321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        if (!mSeekNotificationSent) {
13891321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            notifyListener_l(MEDIA_SEEK_COMPLETE);
13901321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber            mSeekNotificationSent = true;
13911321fdd94d354431b930735e9f38f32ecd189a2dAndreas Huber        }
1392dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber
1393dac4ee72bac87388a1495e098f39d73168c8078fAndreas Huber        mSeeking = false;
13941862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
13951862a33b246249630b654182afb5914da3480d4cAndreas Huber
13965295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    status_t finalStatus;
13975295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) {
13981862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = false;
13995d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mFlags |= AUDIO_AT_EOS;
14005d2de4da54504836e4b772b3010ac28c19f667f0Andreas Huber        mFlags |= FIRST_FRAME;
14015295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        postStreamDoneEvent_l(finalStatus);
14021862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
14031862a33b246249630b654182afb5914da3480d4cAndreas Huber}
14041862a33b246249630b654182afb5914da3480d4cAndreas Huber
1405c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() {
1406c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1407bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return prepare_l();
1408bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
1409c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1410bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() {
1411bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARED) {
1412bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return OK;
1413bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1414bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1415bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1416bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1417bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1418bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1419bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = false;
1420c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    status_t err = prepareAsync_l();
1421c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1422c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    if (err != OK) {
1423c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        return err;
1424c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1425c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1426bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
1427c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        mPreparedCondition.wait(mLock);
1428c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1429c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1430bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return mPrepareResult;
1431c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1432c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1433c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() {
1434c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1435bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1436bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1437bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1438bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1439bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1440bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = true;
1441c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return prepareAsync_l();
1442c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1443c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1444c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() {
1445bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1446bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1447c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1448c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
14492e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (!mQueueStarted) {
14502e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.start();
14512e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueueStarted = true;
14522e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
14532e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
1454bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mFlags |= PREPARING;
1455c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = new AwesomeEvent(
1456c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onPrepareAsyncEvent);
1457c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1458c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mQueue.postEvent(mAsyncPrepareEvent);
1459c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1460c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return OK;
1461c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1462c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1463bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() {
1464e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    sp<DataSource> dataSource;
1465e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1466e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (!strncasecmp("http://", mUri.string(), 7)) {
14670a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        mConnectingDataSource = new NuHTTPDataSource;
1468e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1469e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.unlock();
147079f77ef3b0a37660ba8c5bcb2dfbfda3860f2135Andreas Huber        status_t err = mConnectingDataSource->connect(mUri, &mUriHeaders);
1471e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mLock.lock();
1472e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1473e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (err != OK) {
1474e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource.clear();
1475e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
1476e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            LOGI("mConnectingDataSource->connect() returned %d", err);
1477e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            return err;
1478e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
1479e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
14800a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#if 0
14810a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        mCachedSource = new NuCachedSource2(
14820a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber                new ThrottledSource(
14830a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber                    mConnectingDataSource, 50 * 1024 /* bytes/sec */));
14840a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#else
14850a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        mCachedSource = new NuCachedSource2(mConnectingDataSource);
14860a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber#endif
1487e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mConnectingDataSource.clear();
14880a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
14890a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        dataSource = mCachedSource;
1490e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber    } else if (!strncasecmp(mUri.string(), "httplive://", 11)) {
1491e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber        String8 uri("http://");
1492e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber        uri.append(mUri.string() + 11);
1493e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
1494bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber        sp<LiveSource> liveSource = new LiveSource(uri.string());
1495e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
1496bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber        mCachedSource = new NuCachedSource2(liveSource);
14970a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        dataSource = mCachedSource;
1498e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
1499e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber        sp<MediaExtractor> extractor =
1500e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber            MediaExtractor::Create(dataSource, MEDIA_MIMETYPE_CONTAINER_MPEG2TS);
15010a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber
1502bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber        static_cast<MPEG2TSExtractor *>(extractor.get())
1503bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber            ->setLiveSource(liveSource);
1504bff07d0b22a5ee2d9f044f6cb5e4be1532017ab0Andreas Huber
15050a5baa9b411fe086013d2a5e9126ed63fbad046cAndreas Huber        return setDataSource_l(extractor);
15061aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd    } else if (!strncmp("rtsp://gtalk/", mUri.string(), 13)) {
150739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        if (mLooper == NULL) {
150839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            mLooper = new ALooper;
1509a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber            mLooper->setName("gtalk rtp");
1510ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber            mLooper->start(
1511ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber                    false /* runOnCallingThread */,
1512ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber                    false /* canCallJava */,
1513ff53123821a3ec2e71fdb1a971ea2cbae3119826Andreas Huber                    PRIORITY_HIGHEST);
151439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
151539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
15161aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        const char *startOfCodecString = &mUri.string()[13];
15171aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        const char *startOfSlash1 = strchr(startOfCodecString, '/');
15181aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        if (startOfSlash1 == NULL) {
15191aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            return BAD_VALUE;
15201aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        }
15211aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        const char *startOfWidthString = &startOfSlash1[1];
15221aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        const char *startOfSlash2 = strchr(startOfWidthString, '/');
15231aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        if (startOfSlash2 == NULL) {
15241aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            return BAD_VALUE;
15251aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        }
15261aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        const char *startOfHeightString = &startOfSlash2[1];
15271aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd
15281aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        String8 codecString(startOfCodecString, startOfSlash1 - startOfCodecString);
15291aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        String8 widthString(startOfWidthString, startOfSlash2 - startOfWidthString);
15301aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        String8 heightString(startOfHeightString);
15311aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd
153239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0
153339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        mRTPPusher = new UDPPusher("/data/misc/rtpout.bin", 5434);
153439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        mLooper->registerHandler(mRTPPusher);
153539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
153639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        mRTCPPusher = new UDPPusher("/data/misc/rtcpout.bin", 5435);
153739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        mLooper->registerHandler(mRTCPPusher);
153839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
153939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
154039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        mRTPSession = new ARTPSession;
154139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        mLooper->registerHandler(mRTPSession);
154239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
154339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0
154439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        // My AMR SDP
154539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        static const char *raw =
154639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "v=0\r\n"
154739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
154839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "s=QuickTime\r\n"
154939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "t=0 0\r\n"
155039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "a=range:npt=0-315\r\n"
155139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "a=isma-compliance:2,2.0,2\r\n"
155239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "m=audio 5434 RTP/AVP 97\r\n"
155339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "c=IN IP4 127.0.0.1\r\n"
155439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "b=AS:30\r\n"
155539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "a=rtpmap:97 AMR/8000/1\r\n"
155639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "a=fmtp:97 octet-align\r\n";
155739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#elif 1
15581aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        String8 sdp;
15591aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        sdp.appendFormat(
156039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "v=0\r\n"
156139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "o=- 64 233572944 IN IP4 127.0.0.0\r\n"
156239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "s=QuickTime\r\n"
156339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "t=0 0\r\n"
156439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "a=range:npt=0-315\r\n"
156539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "a=isma-compliance:2,2.0,2\r\n"
156639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "m=video 5434 RTP/AVP 97\r\n"
156739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "c=IN IP4 127.0.0.1\r\n"
156839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            "b=AS:30\r\n"
15691aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            "a=rtpmap:97 %s/90000\r\n"
15701aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            "a=cliprect:0,0,%s,%s\r\n"
15711aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            "a=framesize:97 %s-%s\r\n",
15721aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd
15731aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            codecString.string(),
15741aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            heightString.string(), widthString.string(),
15751aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            widthString.string(), heightString.string()
15761aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd            );
15771aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd        const char *raw = sdp.string();
15781aa4fed23595d45b0ad0af86c9e839196172abe5Mike Dodd
157939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
158039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
158139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        sp<ASessionDescription> desc = new ASessionDescription;
158239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        CHECK(desc->setTo(raw, strlen(raw)));
158339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
158439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        CHECK_EQ(mRTPSession->setup(desc), (status_t)OK);
158539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
158639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        if (mRTPPusher != NULL) {
158739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            mRTPPusher->start();
158839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
158939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
159039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        if (mRTCPPusher != NULL) {
159139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            mRTCPPusher->start();
159239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
159339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
159439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        CHECK_EQ(mRTPSession->countTracks(), 1u);
159539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        sp<MediaSource> source = mRTPSession->trackAt(0);
159639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
159739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#if 0
159839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        bool eos;
159939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        while (((APacketSource *)source.get())
160039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber                ->getQueuedDuration(&eos) < 5000000ll && !eos) {
160139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            usleep(100000ll);
160239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
160339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber#endif
160439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
160539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        const char *mime;
160639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        CHECK(source->getFormat()->findCString(kKeyMIMEType, &mime));
160739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
160839ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        if (!strncasecmp("video/", mime, 6)) {
160939ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            setVideoSource(source);
161039ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        } else {
161139ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            CHECK(!strncasecmp("audio/", mime, 6));
161239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber            setAudioSource(source);
161339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        }
161439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
161539ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        mExtractorFlags = MediaExtractor::CAN_PAUSE;
161639ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber
161739ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber        return OK;
1618cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber    } else if (!strncasecmp("rtsp://", mUri.string(), 7)) {
1619cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        if (mLooper == NULL) {
1620cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mLooper = new ALooper;
1621a814c1fdc2acf0ed2ee3b175110f6039be7c4873Andreas Huber            mLooper->setName("rtsp");
1622cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mLooper->start();
1623cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
1624cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        mRTSPController = new ARTSPController(mLooper);
1625cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        status_t err = mRTSPController->connect(mUri.string());
1626cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
1627cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        LOGI("ARTSPController::connect returned %d", err);
1628cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber
1629cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        if (err != OK) {
1630cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            mRTSPController.clear();
1631cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber            return err;
1632cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        }
1633e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber
1634cf7b9c7aae758ac0b99833915053c63c2ac46e09Andreas Huber        sp<MediaExtractor> extractor = mRTSPController.get();
1635e71d10e7ad55ccbcb0756c007caef1c959090384Andreas Huber        return setDataSource_l(extractor);
1636e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    } else {
1637e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        dataSource = DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
1638e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
1639bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1640bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (dataSource == NULL) {
1641bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1642bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1643bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1644bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
1645bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1646bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (extractor == NULL) {
1647bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1648bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1649bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1650dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    dataSource->getDrmInfo(&mDecryptHandle, &mDrmManagerClient);
1651b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang    if (mDecryptHandle != NULL) {
1652b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        if (RightsStatus::RIGHTS_VALID == mDecryptHandle->status) {
1653b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            if (DecryptApiType::WV_BASED == mDecryptHandle->decryptApiType) {
1654b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang                LOGD("Setting mCachedSource to NULL for WVM\n");
1655b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang                mCachedSource.clear();
1656b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            }
1657b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        } else {
1658b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, ERROR_NO_LICENSE);
1659b371426ce4cf2fa6d8c3d1903b61322feb165d35Gloria Wang        }
1660dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    }
1661dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang
1662bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return setDataSource_l(extractor);
1663bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
1664bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
166588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) {
166688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(err != OK);
166788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
166888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    if (mIsAsyncPrepare) {
166988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
167088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    }
167188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
167288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPrepareResult = err;
16736a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber    mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED);
167488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAsyncPrepareEvent = NULL;
167588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPreparedCondition.broadcast();
167688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
167788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
1678e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber// static
1679e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huberbool AwesomePlayer::ContinuePreparation(void *cookie) {
1680e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    AwesomePlayer *me = static_cast<AwesomePlayer *>(cookie);
1681e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
1682e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber    return (me->mFlags & PREPARE_CANCELLED) == 0;
1683e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber}
1684e966fb05c7e67a7f5dce65024de60aac83eb6f81Andreas Huber
1685c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() {
16868650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    Mutex::Autolock autoLock(mLock);
1687bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
16888650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mFlags & PREPARE_CANCELLED) {
16898650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        LOGI("prepare was cancelled before doing anything");
16908650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        abortPrepare(UNKNOWN_ERROR);
16918650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        return;
16928650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
1693e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
16948650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mUri.size() > 0) {
16958650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = finishSetDataSource_l();
1696bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
16978650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
16988650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
16998650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
1700bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
17018650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
1702bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
17038650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mVideoTrack != NULL && mVideoSource == NULL) {
17048650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initVideoDecoder();
17051322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
17068650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
17078650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
17088650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
17091322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
17108650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
17111322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
17128650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mAudioTrack != NULL && mAudioSource == NULL) {
17138650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        status_t err = initAudioDecoder();
17141322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
17158650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        if (err != OK) {
17168650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            abortPrepare(err);
17178650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber            return;
17181322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
1719c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1720c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
17216a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber    mFlags |= PREPARING_CONNECTED;
17226a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber
17238650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    if (mCachedSource != NULL || mRTSPController != NULL) {
17248650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        postBufferingEvent_l();
17258650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    } else {
17268650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber        finishAsyncPrepare_l();
17278650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber    }
17288650e1960905097f6f1d6aa462ccb1c93c656834Andreas Huber}
1729c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
17308650e1960905097f6f1d6aa462ccb1c93c656834Andreas Hubervoid AwesomePlayer::finishAsyncPrepare_l() {
1731bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mIsAsyncPrepare) {
17325daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber        if (mVideoSource == NULL) {
1733bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0);
1734bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        } else {
17355daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber            notifyVideoSize_l();
1736bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
1737c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1738bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        notifyListener_l(MEDIA_PREPARED);
1739bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1740c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1741bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPrepareResult = OK;
17426a05c9e912aeb8bfe1ef99516def91a177a481b6Andreas Huber    mFlags &= ~(PREPARING|PREPARE_CANCELLED|PREPARING_CONNECTED);
1743bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mFlags |= PREPARED;
1744c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = NULL;
1745bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPreparedCondition.broadcast();
1746c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1747c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
17487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::suspend() {
1749e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    LOGV("suspend");
17507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    Mutex::Autolock autoLock(mLock);
17517b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
17527b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (mSuspensionState != NULL) {
17535c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang        if (mLastVideoBuffer == NULL) {
17545c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang            //go into here if video is suspended again
17555c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang            //after resuming without being played between
17565c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang            //them
17575c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang            SuspensionState *state = mSuspensionState;
17585c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang            mSuspensionState = NULL;
17595c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang            reset_l();
17605c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang            mSuspensionState = state;
17615c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang            return OK;
17625c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang        }
17635c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang
17645c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang        delete mSuspensionState;
17655c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang        mSuspensionState = NULL;
17667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
17677b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
1768e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    if (mFlags & PREPARING) {
1769e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        mFlags |= PREPARE_CANCELLED;
1770e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        if (mConnectingDataSource != NULL) {
1771e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            LOGI("interrupting the connection process");
1772e94bd14078d327ef2f800e69907efce641a13272Andreas Huber            mConnectingDataSource->disconnect();
1773e94bd14078d327ef2f800e69907efce641a13272Andreas Huber        }
1774e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    }
1775e94bd14078d327ef2f800e69907efce641a13272Andreas Huber
17767b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    while (mFlags & PREPARING) {
17777b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        mPreparedCondition.wait(mLock);
17787b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
17797b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
17807b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    SuspensionState *state = new SuspensionState;
17817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    state->mUri = mUri;
17827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    state->mUriHeaders = mUriHeaders;
17837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    state->mFileSource = mFileSource;
17847b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
17858ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    state->mFlags = mFlags & (PLAYING | AUTO_LOOPING | LOOPING | AT_EOS);
17862415ecb5bb4e1459024f6d6c8ae2d6e3dc4fbdc7Andreas Huber    getPosition(&state->mPositionUs);
17877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
1788fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    if (mLastVideoBuffer) {
1789fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        size_t size = mLastVideoBuffer->range_length();
17902b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber
1791fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        if (size) {
17922b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber            int32_t unreadable;
17932b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber            if (!mLastVideoBuffer->meta_data()->findInt32(
17942b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                        kKeyIsUnreadable, &unreadable)
17952b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                    || unreadable == 0) {
17962b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                state->mLastVideoFrameSize = size;
17972b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                state->mLastVideoFrame = malloc(size);
17982b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                memcpy(state->mLastVideoFrame,
17992b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                       (const uint8_t *)mLastVideoBuffer->data()
18002b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                            + mLastVideoBuffer->range_offset(),
18012b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                       size);
18022b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber
18032b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                state->mVideoWidth = mVideoWidth;
18042b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                state->mVideoHeight = mVideoHeight;
18052b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber
18062b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                sp<MetaData> meta = mVideoSource->getFormat();
18072b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                CHECK(meta->findInt32(kKeyColorFormat, &state->mColorFormat));
18082b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                CHECK(meta->findInt32(kKeyWidth, &state->mDecodedWidth));
18092b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                CHECK(meta->findInt32(kKeyHeight, &state->mDecodedHeight));
18102b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber            } else {
18112b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                LOGV("Unable to save last video frame, we have no access to "
18122b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber                     "the decoded video data.");
18132b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber            }
1814fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        }
1815fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
1816fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
18177b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    reset_l();
18187b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18197b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mSuspensionState = state;
18207b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18217b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return OK;
18227b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
18237b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18247b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::resume() {
1825e94bd14078d327ef2f800e69907efce641a13272Andreas Huber    LOGV("resume");
18267b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    Mutex::Autolock autoLock(mLock);
18277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18287b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (mSuspensionState == NULL) {
18297b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return INVALID_OPERATION;
18307b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
18317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18327b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    SuspensionState *state = mSuspensionState;
18337b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mSuspensionState = NULL;
18347b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18357b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    status_t err;
18367b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (state->mFileSource != NULL) {
18377b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        err = setDataSource_l(state->mFileSource);
18387b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        if (err == OK) {
18407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber            mFileSource = state->mFileSource;
18417b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        }
18427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    } else {
18437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        err = setDataSource_l(state->mUri, &state->mUriHeaders);
18447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
18457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (err != OK) {
18477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        delete state;
18487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        state = NULL;
18497b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return err;
18517b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
18527b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18537b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    seekTo_l(state->mPositionUs);
18547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18558ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    mFlags = state->mFlags & (AUTO_LOOPING | LOOPING | AT_EOS);
18567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18570a5ca668c6f7d45706e9aec4a1dfec0aacc6d233Andreas Huber    if (state->mLastVideoFrame && mSurface != NULL) {
1858fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRenderer =
1859fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            new AwesomeLocalRenderer(
1860fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    (OMX_COLOR_FORMATTYPE)state->mColorFormat,
18615daeb129a2c2ba3d14ccd94af283b5f561c783eaAndreas Huber                    mSurface,
1862fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    state->mVideoWidth,
1863fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    state->mVideoHeight,
1864fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    state->mDecodedWidth,
1865ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                    state->mDecodedHeight,
1866ba529e486dde15fe75ea1b48570f9d60a4cf3c48Andreas Huber                    0);
1867fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1868fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRendererIsPreview = true;
1869fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1870fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        ((AwesomeLocalRenderer *)mVideoRenderer.get())->render(
1871fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                state->mLastVideoFrame, state->mLastVideoFrameSize);
1872fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
1873fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
18747b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (state->mFlags & PLAYING) {
18757b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        play_l();
18767b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
18777b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18785c117390591da780e1f53c1c9c91c1efdacbc674Gloria Wang    mSuspensionState = state;
18797b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    state = NULL;
18807b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
18817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return OK;
18827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
18837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
1884acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberuint32_t AwesomePlayer::flags() const {
1885acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return mExtractorFlags;
1886acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber}
1887acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
1888ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioEOS() {
1889ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber    postCheckAudioStatusEvent_l();
1890ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
1891ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
1892ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Hubervoid AwesomePlayer::postAudioSeekComplete() {
1893ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber    postCheckAudioStatusEvent_l();
1894ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber}
1895ed54ad0f8619ae416b0968ade6248894cbfc4dbaAndreas Huber
1896bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}  // namespace android
1897