NuPlayer.cpp revision 9b80c2bdb205bc143104f54d0743b6eedd67b14e
1f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn/*
2f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project
3f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn *
4f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
5f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * you may not use this file except in compliance with the License.
6f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * You may obtain a copy of the License at
7f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn *
8f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
9f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn *
10f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * Unless required by applicable law or agreed to in writing, software
11f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
12f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * See the License for the specific language governing permissions and
14f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn * limitations under the License.
156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn */
16f56e1021aaa04c0ee4a0d4e1d4741bb48e41e2b8Dianne Hackborn
176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn//#define LOG_NDEBUG 0
186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn#define LOG_TAG "NuPlayer"
196213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include <utils/Log.h>
205406e7ade87c33f70c83a283781dcc48fb67cdb9Andrii Kulian
216213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include "NuPlayer.h"
22412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
23412754816d2b8e83f0f5f860b13f09f53d2da05fWinson#include "HTTPLiveSource.h"
24f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale#include "NuPlayerDecoder.h"
256213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include "NuPlayerDriver.h"
266213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include "NuPlayerRenderer.h"
275cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale#include "NuPlayerSource.h"
286213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale#include "StreamingSource.h"
290bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski
300bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski#include "ATSParser.h"
310bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski
320bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski#include <media/stagefright/foundation/hexdump.h>
330bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski#include <media/stagefright/foundation/ABuffer.h>
349cac3b4d4629f10423e293a77f3c2184ba867817Filip Gruszczynski#include <media/stagefright/foundation/ADebug.h>
35dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka#include <media/stagefright/foundation/AMessage.h>
366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn#include <media/stagefright/ACodec.h>
37e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale#include <media/stagefright/MediaErrors.h>
38412754816d2b8e83f0f5f860b13f09f53d2da05fWinson#include <media/stagefright/MetaData.h>
396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn#include <surfaceflinger/Surface.h>
40412754816d2b8e83f0f5f860b13f09f53d2da05fWinson#include <gui/ISurfaceTexture.h>
416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornnamespace android {
43cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown
44412754816d2b8e83f0f5f860b13f09f53d2da05fWinson////////////////////////////////////////////////////////////////////////////////
456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne HackbornNuPlayer::NuPlayer()
476e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    : mUIDValid(false),
48412754816d2b8e83f0f5f860b13f09f53d2da05fWinson      mAudioEOS(false),
491e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale      mVideoEOS(false),
50f83e824216435e45f36a3587e269888f791b2a01Selim Cinek      mScanSourcesPending(false),
51f83e824216435e45f36a3587e269888f791b2a01Selim Cinek      mScanSourcesGeneration(0),
52f83e824216435e45f36a3587e269888f791b2a01Selim Cinek      mFlushingAudio(NONE),
53f83e824216435e45f36a3587e269888f791b2a01Selim Cinek      mFlushingVideo(NONE),
54e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale      mResetInProgress(false),
559302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown      mResetPostponed(false) {
56853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung}
571e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne HackbornNuPlayer::~NuPlayer() {
59a9d131c30878cacdaeacb4f43a82a7cc5b872453Jeff Brown}
606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
61f83e824216435e45f36a3587e269888f791b2a01Selim Cinekvoid NuPlayer::setUID(uid_t uid) {
626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    mUIDValid = true;
636e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    mUID = uid;
64f83e824216435e45f36a3587e269888f791b2a01Selim Cinek}
656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
67f83e824216435e45f36a3587e269888f791b2a01Selim Cinek    mDriver = driver;
68e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale}
69e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale
70e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwalevoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
72c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown
73c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown    msg->setObject("source", new StreamingSource(source));
74c042ee2acd8529b95c5dc99240d626e61d2500cdJeff Brown    msg->post();
756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}
766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::setDataSource(
786e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        const char *url, const KeyedVector<String8, String8> *headers) {
799302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
809302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
819302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown    msg->setObject("source", new HTTPLiveSource(url, headers, mUIDValid, mUID));
823787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev    msg->post();
833787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev}
846213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale
856213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwalevoid NuPlayer::setVideoSurface(const sp<Surface> &surface) {
866213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
876213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale    msg->setObject("native-window", new NativeWindowWrapper(surface));
881e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    msg->post();
891e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale}
901e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brownvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ?
946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                new SurfaceTextureClient(surfaceTexture) : NULL);
956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient));
966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    msg->post();
97412754816d2b8e83f0f5f860b13f09f53d2da05fWinson}
98412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
99412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
100412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
101412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    msg->setObject("sink", sink);
102412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    msg->post();
103412754816d2b8e83f0f5f860b13f09f53d2da05fWinson}
104412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
105412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::start() {
106412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    (new AMessage(kWhatStart, id()))->post();
107412754816d2b8e83f0f5f860b13f09f53d2da05fWinson}
108412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
109412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::pause() {
110412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    (new AMessage(kWhatPause, id()))->post();
111412754816d2b8e83f0f5f860b13f09f53d2da05fWinson}
112412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
113412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::resume() {
114412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    (new AMessage(kWhatResume, id()))->post();
115412754816d2b8e83f0f5f860b13f09f53d2da05fWinson}
116412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
117412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::resetAsync() {
118412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    (new AMessage(kWhatReset, id()))->post();
119412754816d2b8e83f0f5f860b13f09f53d2da05fWinson}
120412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
121412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
122412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    sp<AMessage> msg = new AMessage(kWhatSeek, id());
123412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    msg->setInt64("seekTimeUs", seekTimeUs);
124412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    msg->post();
125412754816d2b8e83f0f5f860b13f09f53d2da05fWinson}
126412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
1276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn// static
1286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
1296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    switch (state) {
1308e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang        case FLUSHING_DECODER:
131f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale            if (needShutdown != NULL) {
132412754816d2b8e83f0f5f860b13f09f53d2da05fWinson                *needShutdown = false;
133412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            }
134412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            return true;
135412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
136412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        case FLUSHING_DECODER_SHUTDOWN:
137412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            if (needShutdown != NULL) {
138412754816d2b8e83f0f5f860b13f09f53d2da05fWinson                *needShutdown = true;
139412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            }
140412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            return true;
141412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
142412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        default:
143412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            return false;
144412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    }
145412754816d2b8e83f0f5f860b13f09f53d2da05fWinson}
146412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
147412754816d2b8e83f0f5f860b13f09f53d2da05fWinsonvoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
148412754816d2b8e83f0f5f860b13f09f53d2da05fWinson    switch (msg->what()) {
149412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        case kWhatSetDataSource:
150412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        {
151412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            LOGV("kWhatSetDataSource");
152f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale
153f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale            CHECK(mSource == NULL);
154f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale
155412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            sp<RefBase> obj;
156412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            CHECK(msg->findObject("source", &obj));
157412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
158412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            mSource = static_cast<Source *>(obj.get());
159412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            break;
160412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        }
161412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
162412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        case kWhatSetVideoNativeWindow:
163412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        {
164412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            LOGV("kWhatSetVideoNativeWindow");
165412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
166412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            sp<RefBase> obj;
167412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            CHECK(msg->findObject("native-window", &obj));
168412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
169412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
170412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            break;
171412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        }
172412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
173412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        case kWhatSetAudioSink:
174412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        {
175412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            LOGV("kWhatSetAudioSink");
176412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
177412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            sp<RefBase> obj;
178412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            CHECK(msg->findObject("sink", &obj));
179412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
180412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
181412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            break;
182412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        }
183412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
184412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        case kWhatStart:
185412754816d2b8e83f0f5f860b13f09f53d2da05fWinson        {
186412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            LOGV("kWhatStart");
187412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
188f7cab10b796d0f66eb690867ba327b4bb00165e3Wale Ogunwale            mAudioEOS = false;
189412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            mVideoEOS = false;
190412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            mSkipRenderingAudioUntilMediaTimeUs = -1;
191412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            mSkipRenderingVideoUntilMediaTimeUs = -1;
192412754816d2b8e83f0f5f860b13f09f53d2da05fWinson
193412754816d2b8e83f0f5f860b13f09f53d2da05fWinson            mSource->start();
1946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
1958e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang            mRenderer = new Renderer(
1966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mAudioSink,
1976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    new AMessage(kWhatRendererNotify, id()));
1984cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner
1996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            looper()->registerHandler(mRenderer);
2006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            postScanSources();
2026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            break;
2036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
2046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        case kWhatScanSources:
2069302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        {
2070bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            int32_t generation;
20892fc37294c474fd47b4439736c6cf700c4e46a27Wale Ogunwale            CHECK(msg->findInt32("generation", &generation));
2099302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (generation != mScanSourcesGeneration) {
2106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // Drop obsolete msg.
2116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
2128e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang            }
2136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mScanSourcesPending = false;
2158e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang
2166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            LOGV("scanning sources haveAudio=%d, haveVideo=%d",
2176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                 mAudioDecoder != NULL, mVideoDecoder != NULL);
2184cd0c13f8f765118a24e31548c058b5029481beaCraig Mautner
2196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            instantiateDecoder(false, &mVideoDecoder);
220bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown
2216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mAudioSink != NULL) {
2225fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                instantiateDecoder(true, &mAudioDecoder);
2235fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            }
224ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown
225ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            if (!mSource->feedMoreTSData()) {
226ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
2276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    // We're not currently decoding anything (no audio or
2286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    // video tracks found) and we just ran out of input data.
2296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
2306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
231ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                break;
232ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            }
233ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown
234ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
235ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                msg->post(100000ll);
2360bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                mScanSourcesPending = true;
237bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown            }
238bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown            break;
2395fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        }
2405fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn
2415fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn        case kWhatVideoNotify:
2425cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale        case kWhatAudioNotify:
2435cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale        {
2445fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn            bool audio = msg->what() == kWhatAudioNotify;
245ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown
2460bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            sp<AMessage> codecRequest;
247bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown            CHECK(msg->findMessage("codec-request", &codecRequest));
248bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown
249ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown            int32_t what;
2500bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            CHECK(codecRequest->findInt32("what", &what));
251bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown
2529302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            if (what == ACodec::kWhatFillThisBuffer) {
253ee172414877d64ebfbcdbadf10691d04a5eee684Jeff Brown                status_t err = feedDecoderInputData(
254bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown                        audio, codecRequest);
2556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2566e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (err == -EWOULDBLOCK) {
257f1285916c3ab259b216e5f3da3dba397c8e898b8Wale Ogunwale                    if (mSource->feedMoreTSData()) {
258f1285916c3ab259b216e5f3da3dba397c8e898b8Wale Ogunwale                        msg->post();
259f1285916c3ab259b216e5f3da3dba397c8e898b8Wale Ogunwale                    }
2606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
26126c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale            } else if (what == ACodec::kWhatEOS) {
26226c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale                mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
26326c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale            } else if (what == ACodec::kWhatFlushCompleted) {
2647402ddf9b45efc9616676205534ce7b4fc3a13e6Wale Ogunwale                bool needShutdown;
2657b0f2e82af35e426f53813ade7ecf493de639623Brian Carlstrom
2667b0f2e82af35e426f53813ade7ecf493de639623Brian Carlstrom                if (audio) {
26726c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
26826c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale                    mFlushingAudio = FLUSHED;
26926c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale                } else {
27026c0dfed7a0cd54abafdd0ccbb5b757506d51c76Wale Ogunwale                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
2716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mFlushingVideo = FLUSHED;
2725fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                }
2735fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn
2745fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                LOGV("decoder %s flush completed", audio ? "audio" : "video");
2755fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn
276dc589ac82b5fe2063f4cfd94c8ae26d43d5420a0Sudheer Shanka                if (needShutdown) {
277bd181bb83282571eb793d2e4a48b4d19585de7f2Jeff Brown                    LOGV("initiating %s decoder shutdown",
2785fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                         audio ? "audio" : "video");
2795fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn
2805fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
281def340d45e8795128aab98d9d3cc36bcac58710ebaik.han
2825fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                    if (audio) {
2835fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                        mFlushingAudio = SHUTTING_DOWN_DECODER;
2845fe7e2a3043d6a8ca933c77ccf95c791b57b221aDianne Hackborn                    } else {
2856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                        mFlushingVideo = SHUTTING_DOWN_DECODER;
2866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    }
2876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
2886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
2897402ddf9b45efc9616676205534ce7b4fc3a13e6Wale Ogunwale                finishFlushIfPossible();
2909302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            } else if (what == ACodec::kWhatOutputFormatChanged) {
2919302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                if (audio) {
2929302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    int32_t numChannels;
2939302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
2949302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2959302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    int32_t sampleRate;
2969302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
2979302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
2989302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                    LOGV("Audio output format changed to %d Hz, %d channels",
2999302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                         sampleRate, numChannels);
300e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale
301c08eab81f30a3120ec0929d3508b4a78d498e1ffCraig Mautner                    mAudioSink->close();
302053c8e4ef4a8cbc89506b661dd6ef51a301a895cWale Ogunwale                    CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK);
303a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    mAudioSink->start();
304a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
305053c8e4ef4a8cbc89506b661dd6ef51a301a895cWale Ogunwale                    mRenderer->signalAudioSinkChanged();
306a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                } else {
307a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    // video
308a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
309a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    int32_t width, height;
310a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    CHECK(codecRequest->findInt32("width", &width));
311a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    CHECK(codecRequest->findInt32("height", &height));
312a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
313a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    int32_t cropLeft, cropTop, cropRight, cropBottom;
314a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    CHECK(codecRequest->findRect(
315a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                                "crop",
316a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                                &cropLeft, &cropTop, &cropRight, &cropBottom));
317a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
318a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    LOGV("Video output format changed to %d x %d "
319a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                         "(crop: %d, %d, %d, %d)",
320a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                         width, height,
321a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                         cropLeft, cropTop, cropRight, cropBottom);
322a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
323a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    notifyListener(
324a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                            MEDIA_SET_VIDEO_SIZE,
325a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                            cropRight - cropLeft + 1,
326a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                            cropBottom - cropTop + 1);
327a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                }
328a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            } else if (what == ACodec::kWhatShutdownCompleted) {
329a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                LOGV("%s shutdown completed", audio ? "audio" : "video");
330a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                if (audio) {
331a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    mAudioDecoder.clear();
332a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn
333a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
334f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski                    mFlushingAudio = SHUT_DOWN;
3350bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                } else {
336b15758ab7a6481717d0d29612e870d7241061c31Chong Zhang                    mVideoDecoder.clear();
337f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski
338e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
3393787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev                    mFlushingVideo = SHUT_DOWN;
3403787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev                }
3413787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev
342a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn                finishFlushIfPossible();
343a4b7f2f75e7803193429ec1179fb5e2eb1c6fbdaDianne Hackborn            } else {
3449302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
3459302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown
3469302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                renderBuffer(audio, codecRequest);
3479302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            }
3483787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev
3496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            break;
3506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
3516213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale
3526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        case kWhatRendererNotify:
3536e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        {
3546e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int32_t what;
3556e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            CHECK(msg->findInt32("what", &what));
3566213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale
3576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (what == Renderer::kWhatEOS) {
3586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                int32_t audio;
3596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                CHECK(msg->findInt32("audio", &audio));
3606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if (audio) {
3620bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                    mAudioEOS = true;
3639302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown                } else {
3646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    mVideoEOS = true;
3656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                LOGV("reached %s EOS", audio ? "audio" : "video");
3686e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
3696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                if ((mAudioEOS || mAudioDecoder == NULL)
370e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale                        && (mVideoEOS || mVideoDecoder == NULL)) {
3716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
3726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
3730bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski            } else if (what == Renderer::kWhatPosition) {
3740bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                int64_t positionUs;
3756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                CHECK(msg->findInt64("positionUs", &positionUs));
37664b103a8c58926f63d9ef4c037534a7df87d07efVladislav Kaznacheev
377cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                if (mDriver != NULL) {
378e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale                    sp<NuPlayerDriver> driver = mDriver.promote();
379cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    if (driver != NULL) {
3800bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                        driver->notifyPosition(positionUs);
381cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                    }
382cc4f7db698f88b633a286d8ab1105b28a474cd09Jeff Brown                }
3836e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            } else {
3846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
3858e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang
3868e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang                int32_t audio;
3870bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski                CHECK(msg->findInt32("audio", &audio));
3880bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski
3898e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang                LOGV("renderer %s flush completed.", audio ? "audio" : "video");
3908e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang            }
3918e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang            break;
392e05f5014905569d69d33ff323a3c62c046552789Wale Ogunwale        }
3938e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang
3940bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski        case kWhatMoreDataQueued:
3958e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang        {
3968e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang            break;
3978e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang        }
3988e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang
39983d616a9c7b9505153d258511eb5c16b552e268dJeff Brown        case kWhatReset:
4001e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        {
4010d50d8660dac35f7eceb5d74756de0417095b427Vladislav Kaznacheev            LOGV("kWhatReset");
4026213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale
4036213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
4046213caa42d89cc446de4f8f9ba00630f166f23ccWale Ogunwale                // We're currently flushing, postpone the reset until that's
4056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                // completed.
4060b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown
4076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                LOGV("postponing reset");
4085406e7ade87c33f70c83a283781dcc48fb67cdb9Andrii Kulian
4095406e7ade87c33f70c83a283781dcc48fb67cdb9Andrii Kulian                mResetPostponed = true;
4106e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
4116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
4146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                finishReset();
4156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                break;
4166e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4176e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4186e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mAudioDecoder != NULL) {
4196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                flushDecoder(true /* audio */, true /* needShutdown */);
4206e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            if (mVideoDecoder != NULL) {
4236e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                flushDecoder(false /* audio */, true /* needShutdown */);
4246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4266e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mResetInProgress = true;
4276e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            break;
4286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        }
4296e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        case kWhatSeek:
4316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        {
4326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int64_t seekTimeUs;
4330b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
4346e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
4366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                 seekTimeUs, seekTimeUs / 1E6);
4375845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner
4383818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright            mSource->seekTo(seekTimeUs);
4393818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright
4403818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright            if (mDriver != NULL) {
4413818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright                sp<NuPlayerDriver> driver = mDriver.promote();
4423818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright                if (driver != NULL) {
4433818c9261ceaa3a700ff984fbcd245faeede38d7Michael Wright                    driver->notifySeekComplete();
4446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                }
4456e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            }
4460b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown
447037c33eae74bee2774897d969d48947f9abe254fJeff Brown            break;
448037c33eae74bee2774897d969d48947f9abe254fJeff Brown        }
4496e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
45056194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        case kWhatPause:
45170af00abf73160235d4efe114fcf4753007a8ff3Michael Wright        {
45270af00abf73160235d4efe114fcf4753007a8ff3Michael Wright            CHECK(mRenderer != NULL);
45356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            mRenderer->pause();
4540b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown            break;
45570af00abf73160235d4efe114fcf4753007a8ff3Michael Wright        }
45670af00abf73160235d4efe114fcf4753007a8ff3Michael Wright
45770af00abf73160235d4efe114fcf4753007a8ff3Michael Wright        case kWhatResume:
45856194ebec6212e229f4ccdaa4b187166d20013efJeff Brown        {
45956194ebec6212e229f4ccdaa4b187166d20013efJeff Brown            CHECK(mRenderer != NULL);
4606e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            mRenderer->resume();
4616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            break;
4620b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown        }
463905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown
4646e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        default:
4656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            TRESPASS();
4666e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            break;
4676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4685845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner}
4696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::finishFlushIfPossible() {
4710b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
4726e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return;
4736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
4746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4756e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
4766e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return;
4774532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    }
4784532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
4790b31d812abe152cee3208f59be45bc94d9b299d5Jeff Brown    LOGV("both audio and video are flushed now.");
4804532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
4815cd907d3d6ceebf8731ef1f69347cce6f76109e9Wale Ogunwale    mRenderer->signalTimeDiscontinuity();
4824532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown
4834532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    if (mAudioDecoder != NULL) {
4844532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown        mAudioDecoder->signalResume();
4854532e6158474a263d9d26c2b42240bcf7ce9b172Jeff Brown    }
4866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4876e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    if (mVideoDecoder != NULL) {
4886e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mVideoDecoder->signalResume();
4896e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
490f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski
4910bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski    mFlushingAudio = NONE;
4926e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    mFlushingVideo = NONE;
4936e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4946e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    if (mResetInProgress) {
4956e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        LOGV("reset completed");
4966e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
4976e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mResetInProgress = false;
4986e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        finishReset();
4996e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    } else if (mResetPostponed) {
5006e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        (new AMessage(kWhatReset, id()))->post();
5016e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        mResetPostponed = false;
5026e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
5036e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        postScanSources();
5046e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5056e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}
5066e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5076e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::finishReset() {
5086e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    CHECK(mAudioDecoder == NULL);
5096e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    CHECK(mVideoDecoder == NULL);
5105845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner
5116e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    mRenderer.clear();
5126e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    mSource.clear();
5136e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5146e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    if (mDriver != NULL) {
5156e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        sp<NuPlayerDriver> driver = mDriver.promote();
5169302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown        if (driver != NULL) {
5179302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown            driver->notifyResetComplete();
51872919d2c310db04fdb860e926ccb0bfe6e3aef08Wale Ogunwale        }
5196e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5209302c8796fc4dcda08d4bd1e11733848fd4fafafJeff Brown}
5216e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5226e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackbornvoid NuPlayer::postScanSources() {
5235845812780a29f4594dbdac12e65c4e063ddb4b0Craig Mautner    if (mScanSourcesPending) {
5246e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return;
5256e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
526f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski
5270bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
5286e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    msg->setInt32("generation", mScanSourcesGeneration);
5298e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang    msg->post();
5306e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5316e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    mScanSourcesPending = true;
5326e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn}
5336e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5348e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhangstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
5356e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    if (*decoder != NULL) {
5366e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return OK;
537f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski    }
5380bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski
5396e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    sp<MetaData> meta = mSource->getFormat(audio);
5408e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang
5416e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    if (meta == NULL) {
5426e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return -EWOULDBLOCK;
5436e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5446e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5458e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang    sp<AMessage> notify =
5466e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
547e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale                     id());
548f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski
5490bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski    *decoder = audio ? new Decoder(notify) :
5506e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn                       new Decoder(notify, mNativeWindow);
5518e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang    looper()->registerHandler(*decoder);
5526e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
553e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale    (*decoder)->configure(meta);
554e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale
555e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale    int64_t durationUs;
556e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
5576e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        sp<NuPlayerDriver> driver = mDriver.promote();
5586e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        if (driver != NULL) {
5596e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            driver->notifyDuration(durationUs);
5608e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang        }
5616e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    }
5626e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
563f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski    return OK;
5640bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski}
5656e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5668e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhangstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
5676e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    sp<AMessage> reply;
568e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale    CHECK(msg->findMessage("reply", &reply));
5696e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5706e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    if ((audio && IsFlushingState(mFlushingAudio))
5716e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            || (!audio && IsFlushingState(mFlushingVideo))) {
5728e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang        reply->setInt32("err", INFO_DISCONTINUITY);
5736e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        reply->post();
5746e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return OK;
575f8a2a632023ef0bafa9c7d5a343cf84d10dbd241Filip Gruszczynski    }
5760bd180d8880b3d1b9677f154c034a2af840b4796Filip Gruszczynski
5776e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    sp<ABuffer> accessUnit;
5788e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang    status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
5796e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
5806e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    if (err == -EWOULDBLOCK) {
5816e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn        return err;
5826e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn    } else if (err != OK) {
5838e89b31a62fb9ec5ad33908c5e8e9c7ab2fd949fChong Zhang        if (err == INFO_DISCONTINUITY) {
5846e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            int32_t type;
5856e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn            CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
5866e1eb76f02ccc9dbc309b938f62d39312da8cafeDianne Hackborn
587e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale            bool formatChange =
588e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale                type == ATSParser::DISCONTINUITY_FORMATCHANGE;
589e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale
590e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale            LOGV("%s discontinuity (formatChange=%d)",
591e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale                 audio ? "audio" : "video", formatChange);
592853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung
593853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung            if (audio) {
594853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung                mSkipRenderingAudioUntilMediaTimeUs = -1;
595853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung            } else {
596853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung                mSkipRenderingVideoUntilMediaTimeUs = -1;
597853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung            }
598853c99a083dc6a96694373c48f427e4d3466d4a9Winson Chung
599e89eeac54766633e482b51c15e99d2d93843ce26Wale Ogunwale            sp<AMessage> extra;
6001e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale            if (accessUnit->meta()->findMessage("extra", &extra)
6011e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                    && extra != NULL) {
6021e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                int64_t resumeAtMediaTimeUs;
6031e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                if (extra->findInt64(
6041e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                            "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
6051e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                    LOGI("suppressing rendering of %s until %lld us",
6061e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                            audio ? "audio" : "video", resumeAtMediaTimeUs);
6071e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6081e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                    if (audio) {
6091e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                        mSkipRenderingAudioUntilMediaTimeUs =
6101e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                            resumeAtMediaTimeUs;
6111e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                    } else {
6121e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                        mSkipRenderingVideoUntilMediaTimeUs =
6131e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                            resumeAtMediaTimeUs;
6141e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                    }
6151e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale                }
6161e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale            }
6171e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6181e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale            flushDecoder(audio, formatChange);
6191e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        }
6201e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6211e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        reply->setInt32("err", err);
6221e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        reply->post();
6231e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        return OK;
6241e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    }
6251e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6261e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
6271e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6281e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale#if 0
6291e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    int64_t mediaTimeUs;
6301e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
6311e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    LOGV("feeding %s input buffer at media time %.2f secs",
6323787de16d24001eeb452e1c711d4290a396e67c9Vladislav Kaznacheev         audio ? "audio" : "video",
6332e96c63c4ce37514728ad0fc36db0225d6ad97b9Vladislav Kaznacheev         mediaTimeUs / 1E6);
6342e96c63c4ce37514728ad0fc36db0225d6ad97b9Vladislav Kaznacheev#endif
6351e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6361e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    reply->setObject("buffer", accessUnit);
6371e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    reply->post();
6381e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6391e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    return OK;
6401e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale}
6411e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
642e15352e516fb6ecde12866f0eb27c32470ddbdedMatthew Ngvoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
6431e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    // LOGV("renderBuffer %s", audio ? "audio" : "video");
6441e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6451e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    sp<AMessage> reply;
6461e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    CHECK(msg->findMessage("reply", &reply));
64761ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung
64861ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung    sp<RefBase> obj;
64961ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung    CHECK(msg->findObject("buffer", &obj));
65061ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung
65161ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
65261ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung
65361ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung    int64_t &skipUntilMediaTimeUs =
65461ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung        audio
65561ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung            ? mSkipRenderingAudioUntilMediaTimeUs
65661ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung            : mSkipRenderingVideoUntilMediaTimeUs;
65761ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung
65861ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung    if (skipUntilMediaTimeUs >= 0) {
65961ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung        int64_t mediaTimeUs;
66061ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
66161ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung
66261ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung        if (mediaTimeUs < skipUntilMediaTimeUs) {
66361ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung            LOGV("dropping %s buffer at time %lld as requested.",
66461ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung                 audio ? "audio" : "video",
66561ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung                 mediaTimeUs);
66661ecc1bb39c475e790a6d23afa16204e294432a9Winson Chung
6671e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale            reply->post();
6681e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale            return;
6691e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        }
6701e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6711e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        skipUntilMediaTimeUs = -1;
6721e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    }
6731e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6741e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    mRenderer->queueBuffer(audio, buffer, reply);
6751e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale}
6761e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6771e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwalevoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
6781e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    if (mDriver == NULL) {
6791e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        return;
6801e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    }
6811e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6821e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    sp<NuPlayerDriver> driver = mDriver.promote();
6831e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6841e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    if (driver == NULL) {
6851e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale        return;
6861e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    }
6871e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6881e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    driver->sendEvent(msg, ext1, ext2);
6891e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale}
6901e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6911e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwalevoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
6921e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    // Make sure we don't continue to scan sources until we finish flushing.
6931e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    ++mScanSourcesGeneration;
6941e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    mScanSourcesPending = false;
6951e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6961e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
6971e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    mRenderer->flush(audio);
6981e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale
6991e129a4212ec3b388c65db8f6ce18896362ac35cWale Ogunwale    FlushStatus newStatus =
700ea4265512c3a2c352f6b99b65094138b96f6de75Jeff Brown        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
701
702    if (audio) {
703        CHECK(mFlushingAudio == NONE
704                || mFlushingAudio == AWAITING_DISCONTINUITY);
705
706        mFlushingAudio = newStatus;
707
708        if (mFlushingVideo == NONE) {
709            mFlushingVideo = (mVideoDecoder != NULL)
710                ? AWAITING_DISCONTINUITY
711                : FLUSHED;
712        }
713    } else {
714        CHECK(mFlushingVideo == NONE
715                || mFlushingVideo == AWAITING_DISCONTINUITY);
716
717        mFlushingVideo = newStatus;
718
719        if (mFlushingAudio == NONE) {
720            mFlushingAudio = (mAudioDecoder != NULL)
721                ? AWAITING_DISCONTINUITY
722                : FLUSHED;
723        }
724    }
725}
726
727}  // namespace android
728