AwesomePlayer.cpp revision e7e3b785a0e7819db4c895a4f60e9a4dd755880c
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
23bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "include/AwesomePlayer.h"
2466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber#include "include/Prefetcher.h"
25733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber#include "include/SoftwareRenderer.h"
26bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
274844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber#include <binder/IPCThreadState.h>
28bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/AudioPlayer.h>
29bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/DataSource.h>
30bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/FileSource.h>
31bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaBuffer.h>
32717826ececd8d39596f62418677721d70776add1Andreas Huber#include <media/stagefright/MediaDefs.h>
33bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaExtractor.h>
34bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaDebug.h>
35bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MediaSource.h>
36bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/MetaData.h>
37bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include <media/stagefright/OMXCodec.h>
38717826ececd8d39596f62418677721d70776add1Andreas Huber
393cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/ISurface.h>
403cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian
41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubernamespace android {
42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
43bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstruct AwesomeEvent : public TimedEventQueue::Event {
44c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    AwesomeEvent(
45c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            AwesomePlayer *player,
46c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            void (AwesomePlayer::*method)())
47bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        : mPlayer(player),
48c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber          mMethod(method) {
49bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
50bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
51bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprotected:
52bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual ~AwesomeEvent() {}
53bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
54bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    virtual void fire(TimedEventQueue *queue, int64_t /* now_us */) {
55c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        (mPlayer->*mMethod)();
56bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
57bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
58bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberprivate:
59bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomePlayer *mPlayer;
60c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    void (AwesomePlayer::*mMethod)();
61bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
62bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent(const AwesomeEvent &);
63bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    AwesomeEvent &operator=(const AwesomeEvent &);
64bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber};
65bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
66733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeRemoteRenderer : public AwesomeRenderer {
67733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeRemoteRenderer(const sp<IOMXRenderer> &target)
68733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        : mTarget(target) {
69733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
70733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
71733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual void render(MediaBuffer *buffer) {
72733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        void *id;
73733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        if (buffer->meta_data()->findPointer(kKeyBufferID, &id)) {
74733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            mTarget->render((IOMX::buffer_id)id);
75733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        }
76733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
77733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
78733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate:
79733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    sp<IOMXRenderer> mTarget;
80733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
81733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeRemoteRenderer(const AwesomeRemoteRenderer &);
82733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeRemoteRenderer &operator=(const AwesomeRemoteRenderer &);
83733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber};
84733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
85733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberstruct AwesomeLocalRenderer : public AwesomeRenderer {
86733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(
87fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            bool previewOnly,
88988e3f0b2c74095deae580157c57935a98573052Andreas Huber            const char *componentName,
89733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
90733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            const sp<ISurface> &surface,
91733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            size_t displayWidth, size_t displayHeight,
92733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            size_t decodedWidth, size_t decodedHeight)
93988e3f0b2c74095deae580157c57935a98573052Andreas Huber        : mTarget(NULL),
94988e3f0b2c74095deae580157c57935a98573052Andreas Huber          mLibHandle(NULL) {
95fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            init(previewOnly, componentName,
96988e3f0b2c74095deae580157c57935a98573052Andreas Huber                 colorFormat, surface, displayWidth,
97988e3f0b2c74095deae580157c57935a98573052Andreas Huber                 displayHeight, decodedWidth, decodedHeight);
98733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
99733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
100733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual void render(MediaBuffer *buffer) {
101fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        render((const uint8_t *)buffer->data() + buffer->range_offset(),
102fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber               buffer->range_length());
103fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
104fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
105fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    void render(const void *data, size_t size) {
106fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mTarget->render(data, size, NULL);
107733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
108733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
109733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprotected:
110733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    virtual ~AwesomeLocalRenderer() {
111733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        delete mTarget;
112733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        mTarget = NULL;
113988e3f0b2c74095deae580157c57935a98573052Andreas Huber
114988e3f0b2c74095deae580157c57935a98573052Andreas Huber        if (mLibHandle) {
115988e3f0b2c74095deae580157c57935a98573052Andreas Huber            dlclose(mLibHandle);
116988e3f0b2c74095deae580157c57935a98573052Andreas Huber            mLibHandle = NULL;
117988e3f0b2c74095deae580157c57935a98573052Andreas Huber        }
118733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    }
119733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
120733b7729ea462fae9c6899456444e28fef1c757cAndreas Huberprivate:
121988e3f0b2c74095deae580157c57935a98573052Andreas Huber    VideoRenderer *mTarget;
122988e3f0b2c74095deae580157c57935a98573052Andreas Huber    void *mLibHandle;
123988e3f0b2c74095deae580157c57935a98573052Andreas Huber
124988e3f0b2c74095deae580157c57935a98573052Andreas Huber    void init(
125fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            bool previewOnly,
126988e3f0b2c74095deae580157c57935a98573052Andreas Huber            const char *componentName,
127988e3f0b2c74095deae580157c57935a98573052Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
128988e3f0b2c74095deae580157c57935a98573052Andreas Huber            const sp<ISurface> &surface,
129988e3f0b2c74095deae580157c57935a98573052Andreas Huber            size_t displayWidth, size_t displayHeight,
130988e3f0b2c74095deae580157c57935a98573052Andreas Huber            size_t decodedWidth, size_t decodedHeight);
131733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
132733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer(const AwesomeLocalRenderer &);
133733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber    AwesomeLocalRenderer &operator=(const AwesomeLocalRenderer &);;
134733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber};
135733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber
136988e3f0b2c74095deae580157c57935a98573052Andreas Hubervoid AwesomeLocalRenderer::init(
137fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        bool previewOnly,
138988e3f0b2c74095deae580157c57935a98573052Andreas Huber        const char *componentName,
139988e3f0b2c74095deae580157c57935a98573052Andreas Huber        OMX_COLOR_FORMATTYPE colorFormat,
140988e3f0b2c74095deae580157c57935a98573052Andreas Huber        const sp<ISurface> &surface,
141988e3f0b2c74095deae580157c57935a98573052Andreas Huber        size_t displayWidth, size_t displayHeight,
142988e3f0b2c74095deae580157c57935a98573052Andreas Huber        size_t decodedWidth, size_t decodedHeight) {
143fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    if (!previewOnly) {
144fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        // We will stick to the vanilla software-color-converting renderer
145fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        // for "previewOnly" mode, to avoid unneccessarily switching overlays
146fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        // more often than necessary.
147fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
148fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW);
149fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
150fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        if (mLibHandle) {
151fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            typedef VideoRenderer *(*CreateRendererFunc)(
152fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    const sp<ISurface> &surface,
153fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    const char *componentName,
154fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    OMX_COLOR_FORMATTYPE colorFormat,
155fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    size_t displayWidth, size_t displayHeight,
156fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    size_t decodedWidth, size_t decodedHeight);
157fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
158fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            CreateRendererFunc func =
159fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                (CreateRendererFunc)dlsym(
160fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        mLibHandle,
161fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        "_Z14createRendererRKN7android2spINS_8ISurfaceEEEPKc20"
162fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        "OMX_COLOR_FORMATTYPEjjjj");
163fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
164fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            if (func) {
165fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                mTarget =
166fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    (*func)(surface, componentName, colorFormat,
167fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        displayWidth, displayHeight,
168fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        decodedWidth, decodedHeight);
169fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            }
170988e3f0b2c74095deae580157c57935a98573052Andreas Huber        }
171988e3f0b2c74095deae580157c57935a98573052Andreas Huber    }
172988e3f0b2c74095deae580157c57935a98573052Andreas Huber
173988e3f0b2c74095deae580157c57935a98573052Andreas Huber    if (mTarget == NULL) {
174988e3f0b2c74095deae580157c57935a98573052Andreas Huber        mTarget = new SoftwareRenderer(
175988e3f0b2c74095deae580157c57935a98573052Andreas Huber                colorFormat, surface, displayWidth, displayHeight,
176988e3f0b2c74095deae580157c57935a98573052Andreas Huber                decodedWidth, decodedHeight);
177988e3f0b2c74095deae580157c57935a98573052Andreas Huber    }
178988e3f0b2c74095deae580157c57935a98573052Andreas Huber}
179988e3f0b2c74095deae580157c57935a98573052Andreas Huber
180bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::AwesomePlayer()
1812e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    : mQueueStarted(false),
1822e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber      mTimeSource(NULL),
183fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber      mVideoRendererIsPreview(false),
184bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mAudioPlayer(NULL),
185bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber      mFlags(0),
186bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber      mLastVideoBuffer(NULL),
1877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber      mVideoBuffer(NULL),
1887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber      mSuspensionState(NULL) {
189bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    CHECK_EQ(mClient.connect(), OK);
190bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
191bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    DataSource::RegisterDefaultSniffers();
192bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
193c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mVideoEvent = new AwesomeEvent(this, &AwesomePlayer::onVideoEvent);
194bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
195c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mStreamDoneEvent = new AwesomeEvent(this, &AwesomePlayer::onStreamDone);
196bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
197c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mBufferingEvent = new AwesomeEvent(this, &AwesomePlayer::onBufferingUpdate);
19866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
199c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
200c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mCheckAudioStatusEvent = new AwesomeEvent(
201c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onCheckAudioStatus);
202c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
2031862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
204bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
205bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
206bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
207bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
208bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas HuberAwesomePlayer::~AwesomePlayer() {
2092e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mQueueStarted) {
2102e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.stop();
2112e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
212bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
213bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset();
214bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
215bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mClient.disconnect();
216bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
217bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
21866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::cancelPlayerEvents(bool keepBufferingGoing) {
219bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mVideoEvent->eventID());
220bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
221bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.cancelEvent(mStreamDoneEvent->eventID());
222bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
2231862a33b246249630b654182afb5914da3480d4cAndreas Huber    mQueue.cancelEvent(mCheckAudioStatusEvent->eventID());
2241862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
22566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
22666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (!keepBufferingGoing) {
22766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mQueue.cancelEvent(mBufferingEvent->eventID());
22866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        mBufferingEventPending = false;
22966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
230bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
231bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2320726045216f576e97672ebeefc265d39c4ebaaa5Andreas Hubervoid AwesomePlayer::setListener(const wp<MediaPlayerBase> &listener) {
233bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
234bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mListener = listener;
235bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
236bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2375561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huberstatus_t AwesomePlayer::setDataSource(
2385561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
239bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
2407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(uri, headers);
2417b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
242bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const char *uri, const KeyedVector<String8, String8> *headers) {
245bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
246bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
247bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri = uri;
24866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
249bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (headers) {
250bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mUriHeaders = *headers;
25166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
25266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
253bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // The actual work will be done during preparation in the call to
254bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // ::finishSetDataSource_l to avoid blocking the calling thread in
255bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    // setDataSource for any significant time.
25666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
257bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return OK;
258bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
259bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
260bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource(
261bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int fd, int64_t offset, int64_t length) {
262bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
263bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
264bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
265bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<DataSource> dataSource = new FileSource(fd, offset, length);
267bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2687b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    status_t err = dataSource->initCheck();
269bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
270bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
271bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
272bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
273bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
2747b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource = dataSource;
2757b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
2767b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return setDataSource_l(dataSource);
2777b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
2787b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
2797b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::setDataSource_l(
2807b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        const sp<DataSource> &dataSource) {
2817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
282bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
283bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (extractor == NULL) {
284bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
285bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
286bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
287bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return setDataSource_l(extractor);
288bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
289bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
290bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setDataSource_l(const sp<MediaExtractor> &extractor) {
291bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveAudio = false;
292bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    bool haveVideo = false;
293bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    for (size_t i = 0; i < extractor->countTracks(); ++i) {
294bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        sp<MetaData> meta = extractor->getTrackMetaData(i);
295bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
296bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const char *mime;
297bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
298bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
299bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (!haveVideo && !strncasecmp(mime, "video/", 6)) {
30088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setVideoSource(extractor->getTrack(i));
30188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveVideo = true;
302bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        } else if (!haveAudio && !strncasecmp(mime, "audio/", 6)) {
30388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            setAudioSource(extractor->getTrack(i));
30488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            haveAudio = true;
305bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
306bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
307bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (haveAudio && haveVideo) {
308bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            break;
309bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
310bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
311bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
312bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return !haveAudio && !haveVideo ? UNKNOWN_ERROR : OK;
313bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
314bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
315bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset() {
316bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
317bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    reset_l();
318bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
319bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
320bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::reset_l() {
321bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
322bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mPreparedCondition.wait(mLock);
323bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
324bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
325bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    cancelPlayerEvents();
326bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
3277b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (mPrefetcher != NULL) {
3287b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        CHECK_EQ(mPrefetcher->getStrongCount(), 1);
3297b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
3307b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mPrefetcher.clear();
3317b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
33288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack.clear();
33388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack.clear();
33488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
3357b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // Shutdown audio first, so that the respone to the reset request
3367b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // appears to happen instantaneously as far as the user is concerned
3377b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // If we did this later, audio would continue playing while we
3387b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // shutdown the video-related resources and the player appear to
3397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    // not be as responsive to a reset request.
3407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioSource.clear();
3417b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
3427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (mTimeSource != mAudioPlayer) {
3437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        delete mTimeSource;
3447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
3457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mTimeSource = NULL;
3467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
3477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete mAudioPlayer;
3487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mAudioPlayer = NULL;
3497b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
350b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber    mVideoRenderer.clear();
351b9280d5c2313c41eb490f58198c4e59118e0e3e6Andreas Huber
352bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mLastVideoBuffer) {
353bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mLastVideoBuffer->release();
354bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mLastVideoBuffer = NULL;
355bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
356bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
357bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoBuffer) {
358bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer->release();
359bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer = NULL;
360bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
361bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
362bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
363bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoSource->stop();
36469f5f4c021ee55055df39718244c036faf2d3382Andreas Huber
36569f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // The following hack is necessary to ensure that the OMX
36669f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // component is completely released by the time we may try
36769f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        // to instantiate it again.
36869f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        wp<MediaSource> tmp = mVideoSource;
369bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoSource.clear();
37069f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        while (tmp.promote() != NULL) {
37169f5f4c021ee55055df39718244c036faf2d3382Andreas Huber            usleep(1000);
37269f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        }
37369f5f4c021ee55055df39718244c036faf2d3382Andreas Huber        IPCThreadState::self()->flushCommands();
374bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
375bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
376bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mDurationUs = -1;
377bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags = 0;
378bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoWidth = mVideoHeight = -1;
379bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mTimeSourceDeltaUs = 0;
380bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoTimeUs = 0;
381bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
382bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeeking = false;
383bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = 0;
38466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
385bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUri.setTo("");
386bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mUriHeaders.clear();
3877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
3887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mFileSource.clear();
3897b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
3907b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete mSuspensionState;
3917b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mSuspensionState = NULL;
392bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
393bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
394c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::notifyListener_l(int msg, int ext1, int ext2) {
3950726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber    if (mListener != NULL) {
3960726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        sp<MediaPlayerBase> listener = mListener.promote();
3970726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
3980726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        if (listener != NULL) {
399c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            listener->sendEvent(msg, ext1, ext2);
40066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        }
40166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
40266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
40366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
40466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::onBufferingUpdate() {
40566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    Mutex::Autolock autoLock(mLock);
406d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mBufferingEventPending) {
407d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
408d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
40966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = false;
41066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
41166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mDurationUs >= 0) {
41266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        int64_t cachedDurationUs = mPrefetcher->getCachedDurationUs();
413e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
414e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber        LOGV("cache holds %.2f secs worth of data.", cachedDurationUs / 1E6);
415e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
41666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        int64_t positionUs = 0;
417a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        if (mVideoSource != NULL) {
41866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber            positionUs = mVideoTimeUs;
41966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        } else if (mAudioPlayer != NULL) {
42066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber            positionUs = mAudioPlayer->getMediaTimeUs();
4210726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber        }
42266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
42366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        cachedDurationUs += positionUs;
42466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
42566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        double percentage = (double)cachedDurationUs / mDurationUs;
42666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        notifyListener_l(MEDIA_BUFFERING_UPDATE, percentage * 100.0);
42766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
42866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        postBufferingEvent_l();
4290726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber    }
4300726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber}
4310726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber
432bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::onStreamDone() {
433bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    // Posted whenever any stream finishes playing.
434bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
435bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
436d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mStreamDoneEventPending) {
437d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
438d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
439bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = false;
440bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
4415295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    if (mStreamDoneStatus == ERROR_END_OF_STREAM && (mFlags & LOOPING)) {
442bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        seekTo_l(0);
443bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
444a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        if (mVideoSource != NULL) {
445bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            postVideoEvent_l();
446bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
447bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
4485295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        if (mStreamDoneStatus == ERROR_END_OF_STREAM) {
4495295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber            LOGV("MEDIA_PLAYBACK_COMPLETE");
4505295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber            notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
4515295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        } else {
4525295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber            LOGV("MEDIA_ERROR %d", mStreamDoneStatus);
4535295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber
4545295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber            notifyListener_l(
4555295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber                    MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, mStreamDoneStatus);
4565295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        }
457bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
458bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        pause_l();
4592e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
4602e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mFlags |= AT_EOS;
461bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
462bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
463bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
464bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::play() {
465bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
4667b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return play_l();
4677b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
468bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
4697b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::play_l() {
470bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & PLAYING) {
471bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
472bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
473bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
474bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (!(mFlags & PREPARED)) {
475bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        status_t err = prepare_l();
476bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
477bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        if (err != OK) {
478bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            return err;
479bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
480bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
481bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
482bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags |= PLAYING;
483bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags |= FIRST_FRAME;
484bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
485fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    bool deferredAudioSeek = false;
486fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber
487bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
488bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mAudioPlayer == NULL) {
489bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mAudioSink != NULL) {
490bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mAudioPlayer = new AudioPlayer(mAudioSink);
491bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mAudioPlayer->setSource(mAudioSource);
492e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
493e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber                // We've already started the MediaSource in order to enable
494e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber                // the prefetcher to read its data.
495e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber                status_t err = mAudioPlayer->start(
496e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber                        true /* sourceAlreadyStarted */);
49788c030e0e0152791ff74f90249f55fce01371198Andreas Huber
49888c030e0e0152791ff74f90249f55fce01371198Andreas Huber                if (err != OK) {
49988c030e0e0152791ff74f90249f55fce01371198Andreas Huber                    delete mAudioPlayer;
50088c030e0e0152791ff74f90249f55fce01371198Andreas Huber                    mAudioPlayer = NULL;
50188c030e0e0152791ff74f90249f55fce01371198Andreas Huber
50288c030e0e0152791ff74f90249f55fce01371198Andreas Huber                    mFlags &= ~(PLAYING | FIRST_FRAME);
50388c030e0e0152791ff74f90249f55fce01371198Andreas Huber
50488c030e0e0152791ff74f90249f55fce01371198Andreas Huber                    return err;
50588c030e0e0152791ff74f90249f55fce01371198Andreas Huber                }
506bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
507bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                delete mTimeSource;
508bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mTimeSource = mAudioPlayer;
509bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
510fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber                deferredAudioSeek = true;
5111862a33b246249630b654182afb5914da3480d4cAndreas Huber
5121862a33b246249630b654182afb5914da3480d4cAndreas Huber                mWatchForAudioSeekComplete = false;
5131862a33b246249630b654182afb5914da3480d4cAndreas Huber                mWatchForAudioEOS = true;
514bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
515bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        } else {
516bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mAudioPlayer->resume();
517bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
5181862a33b246249630b654182afb5914da3480d4cAndreas Huber
5191862a33b246249630b654182afb5914da3480d4cAndreas Huber        postCheckAudioStatusEvent_l();
520bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
521bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
522bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mTimeSource == NULL && mAudioPlayer == NULL) {
523bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mTimeSource = new SystemTimeSource;
524bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
525bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
526bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
527a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        // Kick off video playback
528a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        postVideoEvent_l();
529bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
530bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
531fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    if (deferredAudioSeek) {
532fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        // If there was a seek request while we were paused
533fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        // and we're just starting up again, honor the request now.
534fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber        seekAudioIfNecessary_l();
535fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber    }
536fd4a8e09a54469bbccea6248f84319a1eb78765eAndreas Huber
53766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    postBufferingEvent_l();
53866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
5392e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (mFlags & AT_EOS) {
5402e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // Legacy behaviour, if a stream finishes playing and then
5412e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        // is started again, we play from the start...
5422e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        seekTo_l(0);
5432e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
5442e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
545bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
546bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
547bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
548bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::initRenderer_l() {
549bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mISurface != NULL) {
550bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        sp<MetaData> meta = mVideoSource->getFormat();
551bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
552bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int32_t format;
553bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const char *component;
554bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int32_t decodedWidth, decodedHeight;
555bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        CHECK(meta->findInt32(kKeyColorFormat, &format));
556bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        CHECK(meta->findCString(kKeyDecoderComponent, &component));
557bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        CHECK(meta->findInt32(kKeyWidth, &decodedWidth));
558bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        CHECK(meta->findInt32(kKeyHeight, &decodedHeight));
559bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
5604844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber        mVideoRenderer.clear();
5614844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
5624844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber        // Must ensure that mVideoRenderer's destructor is actually executed
5634844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber        // before creating a new one.
5644844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber        IPCThreadState::self()->flushCommands();
5654844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
566733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        if (!strncmp("OMX.", component, 4)) {
567733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            // Our OMX codecs allocate buffers on the media_server side
568733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            // therefore they require a remote IOMXRenderer that knows how
569733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            // to display them.
570733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            mVideoRenderer = new AwesomeRemoteRenderer(
571733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                mClient.interface()->createRenderer(
572733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                        mISurface, component,
573733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                        (OMX_COLOR_FORMATTYPE)format,
574733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                        decodedWidth, decodedHeight,
575733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                        mVideoWidth, mVideoHeight));
576733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        } else {
577733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            // Other decoders are instantiated locally and as a consequence
578733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            // allocate their buffers in local address space.
579733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber            mVideoRenderer = new AwesomeLocalRenderer(
580fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                false,  // previewOnly
581988e3f0b2c74095deae580157c57935a98573052Andreas Huber                component,
582733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                (OMX_COLOR_FORMATTYPE)format,
583733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                mISurface,
584733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                mVideoWidth, mVideoHeight,
585733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber                decodedWidth, decodedHeight);
586733b7729ea462fae9c6899456444e28fef1c757cAndreas Huber        }
587bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
588bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
589bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
590bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause() {
591bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
592bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause_l();
593bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
594bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
595bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::pause_l() {
596bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!(mFlags & PLAYING)) {
597bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return OK;
598bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
599bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
60066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    cancelPlayerEvents(true /* keepBufferingGoing */);
601bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
602bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioPlayer != NULL) {
603bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mAudioPlayer->pause();
604bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
605bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
606bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags &= ~PLAYING;
607bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
608bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
609bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
610bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
611bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberbool AwesomePlayer::isPlaying() const {
612bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
613bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
614bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mFlags & PLAYING;
615bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
616bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
617bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setISurface(const sp<ISurface> &isurface) {
618bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
619bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
620bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mISurface = isurface;
621bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
622bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
623bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::setAudioSink(
624bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        const sp<MediaPlayerBase::AudioSink> &audioSink) {
625bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
626bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
627bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mAudioSink = audioSink;
628bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
629bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
630bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::setLooping(bool shouldLoop) {
631bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
632bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
633bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mFlags = mFlags & ~LOOPING;
634bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
635bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (shouldLoop) {
636bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mFlags |= LOOPING;
637bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
638bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
639bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
640bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
641bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
642bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getDuration(int64_t *durationUs) {
643bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
644bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
645bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mDurationUs < 0) {
646bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
647bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
648bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
649bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *durationUs = mDurationUs;
650bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
651bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
652bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
653bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
654bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getPosition(int64_t *positionUs) {
655bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
6567b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return getPosition_l(positionUs);
6577b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
658bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
6597b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::getPosition_l(int64_t *positionUs) {
660a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mVideoSource != NULL) {
661bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mVideoTimeUs;
662bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else if (mAudioPlayer != NULL) {
663bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = mAudioPlayer->getMediaTimeUs();
664bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    } else {
665bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        *positionUs = 0;
666bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
667bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
668bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
669bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
670bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
671bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo(int64_t timeUs) {
672bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
673bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return seekTo_l(timeUs);
674bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
675bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
676bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::seekTo_l(int64_t timeUs) {
677bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeeking = true;
678bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mSeekTimeUs = timeUs;
6792e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    mFlags &= ~AT_EOS;
680bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
681bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    seekAudioIfNecessary_l();
682bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
683bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
684bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
685bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
686bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::seekAudioIfNecessary_l() {
687a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mSeeking && mVideoSource == NULL && mAudioPlayer != NULL) {
688bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mAudioPlayer->seekTo(mSeekTimeUs);
689bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
6901862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = true;
6911862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = true;
692bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mSeeking = false;
693bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
694bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
695bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
696bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huberstatus_t AwesomePlayer::getVideoDimensions(
697bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int32_t *width, int32_t *height) const {
698bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
699bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
700bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoWidth < 0 || mVideoHeight < 0) {
701bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return UNKNOWN_ERROR;
702bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
703bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
704bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *width = mVideoWidth;
705bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *height = mVideoHeight;
706bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
707bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return OK;
708bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
709bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
71088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setAudioSource(sp<MediaSource> source) {
71188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
712bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
71366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mPrefetcher != NULL) {
71466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        source = mPrefetcher->addSource(source);
71566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
71666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
71788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAudioTrack = source;
71888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
71988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
72088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initAudioDecoder() {
72188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    sp<MetaData> meta = mAudioTrack->getFormat();
722717826ececd8d39596f62418677721d70776add1Andreas Huber
723717826ececd8d39596f62418677721d70776add1Andreas Huber    const char *mime;
724717826ececd8d39596f62418677721d70776add1Andreas Huber    CHECK(meta->findCString(kKeyMIMEType, &mime));
725717826ececd8d39596f62418677721d70776add1Andreas Huber
726717826ececd8d39596f62418677721d70776add1Andreas Huber    if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) {
72788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        mAudioSource = mAudioTrack;
728717826ececd8d39596f62418677721d70776add1Andreas Huber    } else {
729717826ececd8d39596f62418677721d70776add1Andreas Huber        mAudioSource = OMXCodec::Create(
73088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mClient.interface(), mAudioTrack->getFormat(),
731717826ececd8d39596f62418677721d70776add1Andreas Huber                false, // createEncoder
73288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                mAudioTrack);
733717826ececd8d39596f62418677721d70776add1Andreas Huber    }
734bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
735bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioSource != NULL) {
736bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
73788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mAudioTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
738bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
739bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
740bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
741bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
742bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
743bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
744e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber    mAudioSource->start();
745e7e3b785a0e7819db4c895a4f60e9a4dd755880cAndreas Huber
746bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mAudioSource != NULL ? OK : UNKNOWN_ERROR;
747bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
748bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
74988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::setVideoSource(sp<MediaSource> source) {
75088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(source != NULL);
751bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
75266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mPrefetcher != NULL) {
75366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        source = mPrefetcher->addSource(source);
75466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
75566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
75688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mVideoTrack = source;
75788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
75888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
75988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huberstatus_t AwesomePlayer::initVideoDecoder() {
760bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoSource = OMXCodec::Create(
76188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            mClient.interface(), mVideoTrack->getFormat(),
762bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            false, // createEncoder
76388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber            mVideoTrack);
764bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
765bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoSource != NULL) {
766bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        int64_t durationUs;
76788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        if (mVideoTrack->getFormat()->findInt64(kKeyDuration, &durationUs)) {
768bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (mDurationUs < 0 || durationUs > mDurationUs) {
769bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                mDurationUs = durationUs;
770bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
771bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
772bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
77388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        CHECK(mVideoTrack->getFormat()->findInt32(kKeyWidth, &mVideoWidth));
77488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        CHECK(mVideoTrack->getFormat()->findInt32(kKeyHeight, &mVideoHeight));
775bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
776bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoSource->start();
777bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
778bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
779bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mVideoSource != NULL ? OK : UNKNOWN_ERROR;
780bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
781bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
782c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onVideoEvent() {
783bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    Mutex::Autolock autoLock(mLock);
7847b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (!mVideoEventPending) {
7857b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // The event has been cancelled in reset_l() but had already
7867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        // been scheduled for execution at that time.
7877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return;
7887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
789bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = false;
790bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
791bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mSeeking) {
792bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mLastVideoBuffer) {
793bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mLastVideoBuffer->release();
794bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mLastVideoBuffer = NULL;
795bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
796bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
797bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mVideoBuffer) {
798bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer->release();
799bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mVideoBuffer = NULL;
800bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
801bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
802bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
803bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (!mVideoBuffer) {
804bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        MediaSource::ReadOptions options;
805bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mSeeking) {
806bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6);
807bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
808bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            options.setSeekTo(mSeekTimeUs);
809bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
810bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        for (;;) {
811bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            status_t err = mVideoSource->read(&mVideoBuffer, &options);
812c1689e49ac867de33f2e81289449878ac2e536a0Andreas Huber            options.clearSeekTo();
813bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
814bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            if (err != OK) {
815bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                CHECK_EQ(mVideoBuffer, NULL);
816bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
817bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                if (err == INFO_FORMAT_CHANGED) {
818bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    LOGV("VideoSource signalled format change.");
819bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
820a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    if (mVideoRenderer != NULL) {
821fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        mVideoRendererIsPreview = false;
822a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                        initRenderer_l();
823a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber                    }
824bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                    continue;
825bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                }
826bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
8275295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber                postStreamDoneEvent_l(err);
828bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber                return;
829bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            }
830bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
8314844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            if (mVideoBuffer->range_length() == 0) {
83208411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // Some decoders, notably the PV AVC software decoder
83308411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber                // return spurious empty buffers that we just want to ignore.
83408411b75d4c30ce26180639f158e2f33d190eee8Andreas Huber
8354844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer->release();
8364844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                mVideoBuffer = NULL;
8374844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber                continue;
8384844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber            }
8394844ac54e8b5997c3b03872dbafe8ebed4787517Andreas Huber
840bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            break;
841bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
842bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
843bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
844bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t timeUs;
845bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs));
846bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
847bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoTimeUs = timeUs;
848bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
849bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mSeeking) {
850bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        if (mAudioPlayer != NULL) {
851bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            LOGV("seeking audio to %lld us (%.2f secs).", timeUs, timeUs / 1E6);
852bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
853bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            mAudioPlayer->seekTo(timeUs);
8541862a33b246249630b654182afb5914da3480d4cAndreas Huber            mWatchForAudioSeekComplete = true;
8551862a33b246249630b654182afb5914da3480d4cAndreas Huber            mWatchForAudioEOS = true;
856bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        } else {
857bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            // If we're playing video only, report seek complete now,
858bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber            // otherwise audio player will notify us later.
8590726045216f576e97672ebeefc265d39c4ebaaa5Andreas Huber            notifyListener_l(MEDIA_SEEK_COMPLETE);
860bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        }
861bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
862bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mFlags |= FIRST_FRAME;
863bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mSeeking = false;
864bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
865bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
866bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mFlags & FIRST_FRAME) {
867bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mFlags &= ~FIRST_FRAME;
868bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
869bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mTimeSourceDeltaUs = mTimeSource->getRealTimeUs() - timeUs;
870bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
871bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
872bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t realTimeUs, mediaTimeUs;
873bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mAudioPlayer != NULL
874bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        && mAudioPlayer->getMediaTimeMapping(&realTimeUs, &mediaTimeUs)) {
875bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mTimeSourceDeltaUs = realTimeUs - mediaTimeUs;
876bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
877bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
878bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t nowUs = mTimeSource->getRealTimeUs() - mTimeSourceDeltaUs;
879bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
880bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t latenessUs = nowUs - timeUs;
881bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
882650773d00356129ffd661cdaef3fb3095c343707Andreas Huber    if (latenessUs > 40000) {
883650773d00356129ffd661cdaef3fb3095c343707Andreas Huber        // We're more than 40ms late.
884ec9dd59902c8beea4ba6a842f3a843d46150d949Andreas Huber        LOGV("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6);
885bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
886bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer->release();
887bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mVideoBuffer = NULL;
888bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
889bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        postVideoEvent_l();
890bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
891bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
892bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
893bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (latenessUs < -10000) {
894bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        // We're more than 10ms early.
895bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
896bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        postVideoEvent_l(10000);
897bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
898bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
899bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
900fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    if (mVideoRendererIsPreview || mVideoRenderer == NULL) {
901fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRendererIsPreview = false;
902fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
903a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        initRenderer_l();
904a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
905a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber
906a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    if (mVideoRenderer != NULL) {
907a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber        mVideoRenderer->render(mVideoBuffer);
908a657f8deaf21acbe5faba7be1df9c6681d44d471Andreas Huber    }
909bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
910bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mLastVideoBuffer) {
911bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mLastVideoBuffer->release();
912bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        mLastVideoBuffer = NULL;
913bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
914bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mLastVideoBuffer = mVideoBuffer;
915bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoBuffer = NULL;
916bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
917bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    postVideoEvent_l();
918bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
919bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
920bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Hubervoid AwesomePlayer::postVideoEvent_l(int64_t delayUs) {
921bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mVideoEventPending) {
922bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
923bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
924bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
925bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mVideoEventPending = true;
926bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEventWithDelay(mVideoEvent, delayUs < 0 ? 10000 : delayUs);
927bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
928bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
9295295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Hubervoid AwesomePlayer::postStreamDoneEvent_l(status_t status) {
930bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mStreamDoneEventPending) {
931bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return;
932bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    }
933bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mStreamDoneEventPending = true;
9345295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber
9355295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    mStreamDoneStatus = status;
936bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mQueue.postEvent(mStreamDoneEvent);
937bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}
938bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
93966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Hubervoid AwesomePlayer::postBufferingEvent_l() {
94066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mPrefetcher == NULL) {
94166b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        return;
94266b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
94366b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
94466b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    if (mBufferingEventPending) {
94566b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber        return;
94666b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    }
94766b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mBufferingEventPending = true;
94866b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber    mQueue.postEventWithDelay(mBufferingEvent, 1000000ll);
94966b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber}
95066b0a35c9a4136a84c3f73b1b25fcb5220138b95Andreas Huber
9511862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::postCheckAudioStatusEvent_l() {
9521862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mAudioStatusEventPending) {
9531862a33b246249630b654182afb5914da3480d4cAndreas Huber        return;
9541862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
9551862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = true;
9561862a33b246249630b654182afb5914da3480d4cAndreas Huber    mQueue.postEventWithDelay(mCheckAudioStatusEvent, 100000ll);
9571862a33b246249630b654182afb5914da3480d4cAndreas Huber}
9581862a33b246249630b654182afb5914da3480d4cAndreas Huber
9591862a33b246249630b654182afb5914da3480d4cAndreas Hubervoid AwesomePlayer::onCheckAudioStatus() {
9601862a33b246249630b654182afb5914da3480d4cAndreas Huber    Mutex::Autolock autoLock(mLock);
961d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    if (!mAudioStatusEventPending) {
962d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        // Event was dispatched and while we were blocking on the mutex,
963d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        // has already been cancelled.
964d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber        return;
965d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber    }
966d29345dfa29cdcc650f3705e43950ef2500f6728Andreas Huber
9671862a33b246249630b654182afb5914da3480d4cAndreas Huber    mAudioStatusEventPending = false;
9681862a33b246249630b654182afb5914da3480d4cAndreas Huber
9691862a33b246249630b654182afb5914da3480d4cAndreas Huber    if (mWatchForAudioSeekComplete && !mAudioPlayer->isSeeking()) {
9701862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioSeekComplete = false;
9711862a33b246249630b654182afb5914da3480d4cAndreas Huber        notifyListener_l(MEDIA_SEEK_COMPLETE);
9721862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
9731862a33b246249630b654182afb5914da3480d4cAndreas Huber
9745295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    status_t finalStatus;
9755295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber    if (mWatchForAudioEOS && mAudioPlayer->reachedEOS(&finalStatus)) {
9761862a33b246249630b654182afb5914da3480d4cAndreas Huber        mWatchForAudioEOS = false;
9775295c0c55d41a2906ea7f65a3f22e6278cb17d4bAndreas Huber        postStreamDoneEvent_l(finalStatus);
9781862a33b246249630b654182afb5914da3480d4cAndreas Huber    }
9791862a33b246249630b654182afb5914da3480d4cAndreas Huber
9801862a33b246249630b654182afb5914da3480d4cAndreas Huber    postCheckAudioStatusEvent_l();
9811862a33b246249630b654182afb5914da3480d4cAndreas Huber}
9821862a33b246249630b654182afb5914da3480d4cAndreas Huber
983c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepare() {
984c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
985bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return prepare_l();
986bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
987c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
988bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::prepare_l() {
989bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARED) {
990bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return OK;
991bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
992bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
993bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
994bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
995bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
996bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
997bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = false;
998c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    status_t err = prepareAsync_l();
999c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1000c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    if (err != OK) {
1001c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        return err;
1002c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1003c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1004bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    while (mFlags & PREPARING) {
1005c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        mPreparedCondition.wait(mLock);
1006c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1007c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1008bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return mPrepareResult;
1009c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1010c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1011c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync() {
1012c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1013bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1014bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1015bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1016bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1017bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1018bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mIsAsyncPrepare = true;
1019c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return prepareAsync_l();
1020c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1021c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1022c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huberstatus_t AwesomePlayer::prepareAsync_l() {
1023bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mFlags & PREPARING) {
1024bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;  // async prepare already pending
1025c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1026c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
10272e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    if (!mQueueStarted) {
10282e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueue.start();
10292e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber        mQueueStarted = true;
10302e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    }
10312e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber
1032bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mFlags |= PREPARING;
1033c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = new AwesomeEvent(
1034c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber            this, &AwesomePlayer::onPrepareAsyncEvent);
1035c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1036c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mQueue.postEvent(mAsyncPrepareEvent);
1037c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1038c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return OK;
1039c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1040c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1041bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huberstatus_t AwesomePlayer::finishSetDataSource_l() {
1042bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    sp<DataSource> dataSource =
1043bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        DataSource::CreateFromURI(mUri.string(), &mUriHeaders);
1044bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1045bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (dataSource == NULL) {
1046bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1047bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1048bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1049bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    sp<MediaExtractor> extractor = MediaExtractor::Create(dataSource);
1050bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1051bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (extractor == NULL) {
1052bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        return UNKNOWN_ERROR;
1053bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1054bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1055bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (dataSource->flags() & DataSource::kWantsPrefetching) {
1056bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        mPrefetcher = new Prefetcher;
1057bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1058bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1059bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    return setDataSource_l(extractor);
1060bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber}
1061bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
106288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Hubervoid AwesomePlayer::abortPrepare(status_t err) {
106388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    CHECK(err != OK);
106488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
106588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    if (mIsAsyncPrepare) {
106688d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber        notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
106788d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    }
106888d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
106988d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPrepareResult = err;
107088d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mFlags &= ~PREPARING;
107188d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mAsyncPrepareEvent = NULL;
107288d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber    mPreparedCondition.broadcast();
107388d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber}
107488d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber
1075c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Hubervoid AwesomePlayer::onPrepareAsyncEvent() {
10761322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber    sp<Prefetcher> prefetcher;
10771322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
1078bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    {
1079bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        Mutex::Autolock autoLock(mLock);
1080bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1081bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        if (mUri.size() > 0) {
1082bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            status_t err = finishSetDataSource_l();
1083bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
1084bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            if (err != OK) {
108588d8a83de12592635248aa1a3bd6b9ea46108501Andreas Huber                abortPrepare(err);
1086bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber                return;
1087bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            }
1088bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
1089bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber
10901322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        if (mVideoTrack != NULL && mVideoSource == NULL) {
10911322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber            status_t err = initVideoDecoder();
10921322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
10931322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber            if (err != OK) {
10941322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber                abortPrepare(err);
10951322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber                return;
10961322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber            }
10971322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
10981322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
10991322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        if (mAudioTrack != NULL && mAudioSource == NULL) {
11001322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber            status_t err = initAudioDecoder();
11011322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber
11021322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber            if (err != OK) {
11031322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber                abortPrepare(err);
11041322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber                return;
11051322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber            }
11061322e7ebc33e8e161fb73cd47e43dd93357608e4Andreas Huber        }
1107c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1108c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        prefetcher = mPrefetcher;
1109c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1110c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1111c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    if (prefetcher != NULL) {
1112c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber        prefetcher->prepare();
11137b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        prefetcher.clear();
1114c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    }
1115c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1116c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    Mutex::Autolock autoLock(mLock);
1117c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1118bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    if (mIsAsyncPrepare) {
1119bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        if (mVideoWidth < 0 || mVideoHeight < 0) {
1120bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            notifyListener_l(MEDIA_SET_VIDEO_SIZE, 0, 0);
1121bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        } else {
1122bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber            notifyListener_l(MEDIA_SET_VIDEO_SIZE, mVideoWidth, mVideoHeight);
1123bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        }
1124c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1125bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber        notifyListener_l(MEDIA_PREPARED);
1126bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    }
1127c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
1128bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPrepareResult = OK;
1129bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mFlags &= ~PREPARING;
1130bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mFlags |= PREPARED;
1131c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    mAsyncPrepareEvent = NULL;
1132bd22c52280179b29eefac91ef7e7bbbc33d25904Andreas Huber    mPreparedCondition.broadcast();
1133c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber}
1134c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber
11357b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::suspend() {
11367b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    LOGI("suspend");
11377b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    Mutex::Autolock autoLock(mLock);
11387b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (mSuspensionState != NULL) {
11407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return INVALID_OPERATION;
11417b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
11427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11437b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    while (mFlags & PREPARING) {
11447b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        mPreparedCondition.wait(mLock);
11457b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
11467b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11477b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    SuspensionState *state = new SuspensionState;
11487b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    state->mUri = mUri;
11497b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    state->mUriHeaders = mUriHeaders;
11507b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    state->mFileSource = mFileSource;
11517b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11522e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    state->mFlags = mFlags & (PLAYING | LOOPING | AT_EOS);
11537b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    getPosition_l(&state->mPositionUs);
11547b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
1155fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    if (mLastVideoBuffer) {
1156fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        size_t size = mLastVideoBuffer->range_length();
1157fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        if (size) {
1158fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            state->mLastVideoFrameSize = size;
1159fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            state->mLastVideoFrame = malloc(size);
1160fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            memcpy(state->mLastVideoFrame,
1161fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                   (const uint8_t *)mLastVideoBuffer->data()
1162fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                        + mLastVideoBuffer->range_offset(),
1163fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                   size);
1164fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1165fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            state->mVideoWidth = mVideoWidth;
1166fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            state->mVideoHeight = mVideoHeight;
1167fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1168fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            sp<MetaData> meta = mVideoSource->getFormat();
1169fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            CHECK(meta->findInt32(kKeyColorFormat, &state->mColorFormat));
1170fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            CHECK(meta->findInt32(kKeyWidth, &state->mDecodedWidth));
1171fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            CHECK(meta->findInt32(kKeyHeight, &state->mDecodedHeight));
1172fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        }
1173fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
1174fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
11757b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    reset_l();
11767b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11777b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mSuspensionState = state;
11787b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11797b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return OK;
11807b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
11817b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11827b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huberstatus_t AwesomePlayer::resume() {
11837b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    LOGI("resume");
11847b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    Mutex::Autolock autoLock(mLock);
11857b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11867b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (mSuspensionState == NULL) {
11877b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return INVALID_OPERATION;
11887b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
11897b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11907b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    SuspensionState *state = mSuspensionState;
11917b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    mSuspensionState = NULL;
11927b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11937b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    status_t err;
11947b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (state->mFileSource != NULL) {
11957b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        err = setDataSource_l(state->mFileSource);
11967b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
11977b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        if (err == OK) {
11987b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber            mFileSource = state->mFileSource;
11997b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        }
12007b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    } else {
12017b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        err = setDataSource_l(state->mUri, &state->mUriHeaders);
12027b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
12037b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
12047b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (err != OK) {
12057b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        delete state;
12067b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        state = NULL;
12077b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
12087b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        return err;
12097b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
12107b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
12117b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    seekTo_l(state->mPositionUs);
12127b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
12132e8ffaf95bd35358ecd14ddf00cddaf3abefe0a9Andreas Huber    mFlags = state->mFlags & (LOOPING | AT_EOS);
12147b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
1215fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    if (state->mLastVideoFrame && mISurface != NULL) {
1216fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRenderer =
1217fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber            new AwesomeLocalRenderer(
1218fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    true,  // previewOnly
1219fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    "",
1220fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    (OMX_COLOR_FORMATTYPE)state->mColorFormat,
1221fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    mISurface,
1222fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    state->mVideoWidth,
1223fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    state->mVideoHeight,
1224fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    state->mDecodedWidth,
1225fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                    state->mDecodedHeight);
1226fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1227fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        mVideoRendererIsPreview = true;
1228fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
1229fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber        ((AwesomeLocalRenderer *)mVideoRenderer.get())->render(
1230fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber                state->mLastVideoFrame, state->mLastVideoFrameSize);
1231fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber    }
1232fa090f541bb84a546af2ec834e91a032ff10e66eAndreas Huber
12337b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    if (state->mFlags & PLAYING) {
12347b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber        play_l();
12357b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    }
12367b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
12377b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    delete state;
12387b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    state = NULL;
12397b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
12407b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber    return OK;
12417b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber}
12427b3396acc702451be9bafb19d7fe26d55d43a316Andreas Huber
1243bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber}  // namespace android
1244bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
1245