NuPlayer.cpp revision 3fe62150fa3dd6d25cb84aad80bc9e27ddd16c45
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License.
6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and
14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License.
15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */
16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayer"
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h"
225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h"
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h"
2543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber#include "NuPlayerDriver.h"
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h"
275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h"
285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h"
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h>
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h>
411173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h"
443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
45f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
49f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    : mUIDValid(false),
513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoIsAVC(false),
529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mAudioEOS(false),
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
545bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mResetPostponed(false),
603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingAudioUntilMediaTimeUs(-1ll),
613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingVideoUntilMediaTimeUs(-1ll),
623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoLateByUs(0ll),
633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesTotal(0ll),
643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesDropped(0ll) {
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
67f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) {
719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
7543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
7643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
79f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new StreamingSource(source));
835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
865bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
909b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    msg->setObject("source", new HTTPLiveSource(url, headers, mUIDValid, mUID));
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
94f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) {
951173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surface));
971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->post();
981173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
1001173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
1011173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
1021173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ?
1031173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                new SurfaceTextureClient(surfaceTexture) : NULL);
1041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient));
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
108f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
114f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
11843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
119b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
12143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
12243c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
123b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
1271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
1281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
1291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
13043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
13143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
13243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
13343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
13443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
13543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
13653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
1371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
13853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
13953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
14253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
14353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
14453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
14853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
14953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
15053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
15153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
15253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
15353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
15453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
15553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
156f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetDataSource");
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
1655bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1711173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            LOGV("kWhatSetVideoNativeWindow");
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
1761173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1781173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetAudioSink");
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
19543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("kWhatStart");
19643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1973fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoIsAVC = false;
1981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
1991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
20032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
20132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
2023fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoLateByUs = 0;
2033fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesTotal = 0;
2043fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesDropped = 0;
2051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
2211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
2221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
2231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
2241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
2251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
2261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
2285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
22943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("scanning sources haveAudio=%d, haveVideo=%d",
23043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
23143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            instantiateDecoder(false, &mVideoDecoder);
233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
2355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (!mSource->feedMoreTSData()) {
2391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
2401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
2411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
2421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
2431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
2495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
2705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    if (mSource->feedMoreTSData()) {
2715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                        msg->post();
2725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
2771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
27853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
2831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
2853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
2863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mVideoLateByUs = 0;
287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("decoder %s flush completed", audio ? "audio" : "video");
290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
2921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    LOGV("initiating %s decoder shutdown",
29353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
29553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
29753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
29853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
29953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
30053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
30153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
3033831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3043831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
3052c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
30631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
30731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
30831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
3092c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
3122c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Audio output format changed to %d Hz, %d channels",
31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
3152c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
317078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                    CHECK_EQ(mAudioSink->open(
318078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                sampleRate,
319078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                numChannels,
320078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                AUDIO_FORMAT_PCM_16_BIT,
321078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                8 /* bufferCount */),
322078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                             (status_t)OK);
32331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
3243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
32531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
32631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
32731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
32831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
32931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
33031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
33231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
33431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
33531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
33631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
33731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
33831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Video output format changed to %d x %d "
339cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         "(crop: %d x %d @ (%d, %d))",
34031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
341cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropRight - cropLeft + 1),
342cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropBottom - cropTop + 1),
343cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         cropLeft, cropTop);
34431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
34531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
34631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            MEDIA_SET_VIDEO_SIZE,
34731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropRight - cropLeft + 1,
34831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropBottom - cropTop + 1);
34931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
3503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
3511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("%s shutdown completed", audio ? "audio" : "video");
3523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
3533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
3543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
3563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
3573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
3583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
3593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
3613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
3623831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
3633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
365c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber            } else if (what == ACodec::kWhatError) {
366c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                LOGE("Received error from %s decoder, aborting playback.",
367c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                     audio ? "audio" : "video");
368c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
369c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
388c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                int32_t finalResult;
389c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                CHECK(msg->findInt32("finalResult", &finalResult));
390c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
397c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                if (finalResult == ERROR_END_OF_STREAM) {
398c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    LOGV("reached %s EOS", audio ? "audio" : "video");
399c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                } else {
400c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    LOGE("%s track encountered an error (0x%08x)",
401c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                         audio ? "audio" : "video", finalResult);
402c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
403c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    notifyListener(
404c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
405c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                }
406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
41143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
41243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
41343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
41443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
4153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
4163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
41743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
41843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
41943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
42043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
4213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
4223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        driver->notifyFrameStats(
4233fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                mNumFramesTotal, mNumFramesDropped);
42443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
42543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
4263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            } else if (what == Renderer::kWhatFlushComplete) {
427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("renderer %s flush completed.", audio ? "audio" : "video");
433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
4431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
4441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatReset");
4451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
4471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
4481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
4491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("postponing reset");
4511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
4531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
4571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
4581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
4621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
4661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
4671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
47343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
47443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
47543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
47643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
47743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
47822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber            LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
47943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
48043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
48143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
48243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
48343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
48443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
48543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
48643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
48743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
48843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
48943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
49043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
49143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
49243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
493b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
494b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
495b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
496b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
497b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
498b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
499b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
500b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
501b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
502b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
503b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
504b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
505b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
506b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
5143831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
5153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
5163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
5193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
5203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5213831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("both audio and video are flushed now.");
5233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mRenderer->signalTimeDiscontinuity();
5253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
52622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
5273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
5283831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
53022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
5313831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
5323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
5353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
5381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        LOGV("reset completed");
5391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
5411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
5421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
5431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
54522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
5471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
5481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
5511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
5521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
5551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mSource.clear();
5561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
55743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
55843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
55943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
56043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
56143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
56243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
5661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
5671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
5691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
5721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
5731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5775bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    if (!audio) {
5893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        const char *mime;
5903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
5913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime);
5923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    }
5933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5981173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
5991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
60543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
60643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
60743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
60843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
60943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
61043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
61143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
615f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
61953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
62053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    bool dropAccessUnit;
6293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    do {
6303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
6315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
6323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (err == -EWOULDBLOCK) {
6333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return err;
6343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        } else if (err != OK) {
6353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            if (err == INFO_DISCONTINUITY) {
6363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                int32_t type;
6373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
63853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
6393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                bool formatChange =
6403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    type == ATSParser::DISCONTINUITY_FORMATCHANGE;
64153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
6423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                LOGV("%s discontinuity (formatChange=%d)",
6433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                     audio ? "audio" : "video", formatChange);
64432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (audio) {
6463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingAudioUntilMediaTimeUs = -1;
6473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                } else {
6483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingVideoUntilMediaTimeUs = -1;
6493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                }
65032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                sp<AMessage> extra;
6523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (accessUnit->meta()->findMessage("extra", &extra)
6533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        && extra != NULL) {
6543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    int64_t resumeAtMediaTimeUs;
6553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    if (extra->findInt64(
6563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
6573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        LOGI("suppressing rendering of %s until %lld us",
6583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                audio ? "audio" : "video", resumeAtMediaTimeUs);
6593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
6603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        if (audio) {
6613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                            mSkipRenderingAudioUntilMediaTimeUs =
6623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                resumeAtMediaTimeUs;
6633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        } else {
6643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                            mSkipRenderingVideoUntilMediaTimeUs =
6653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                resumeAtMediaTimeUs;
6663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        }
66732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
66832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
6693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
6703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                flushDecoder(audio, formatChange);
67132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
67232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->setInt32("err", err);
6743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->post();
6753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return OK;
676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio) {
6793fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesTotal;
6803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
6813fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
6823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        dropAccessUnit = false;
6833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio
6843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoLateByUs > 100000ll
6853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoIsAVC
6863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && !IsAVCReferenceFrame(accessUnit)) {
6873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            dropAccessUnit = true;
6883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesDropped;
6893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
6903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    } while (dropAccessUnit);
691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
69243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
6971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("feeding %s input buffer at media time %.2f secs",
698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setObject("buffer", accessUnit);
703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
708f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
70943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("renderBuffer %s", audio ? "audio" : "video");
710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
71418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
71518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
71618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
71718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
71818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
71918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
72018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        LOGV("we're still flushing the %s decoder, sending its output buffer"
72118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
72218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
72318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
72418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
72518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
72618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
73232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
73332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
73432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
73532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
73632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
73732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
73832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
73932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
74032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
74132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
74232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            LOGV("dropping %s buffer at time %lld as requested.",
74332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
74432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
74532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
74632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
74732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
74832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
74932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
75032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
75132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
75232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
756f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
75743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
76143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
76343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
76743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    driver->sendEvent(msg, ext1, ext2);
768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
7711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
7721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
77343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
7741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
7761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
7771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
7791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
7801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
7821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
7831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
7841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
7861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
7881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
7891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
7901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
7911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
7921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
7931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
7941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
7951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
7971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
7981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
7991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
8001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
8011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
8021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
8031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
8041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
8051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
807