NuPlayer.cpp revision 6e3d311b6631b12aac2879d1b08c3534aece78b1
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"
282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "RTSPSource.h"
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h"
305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h>
421173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h>
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h"
453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
46f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
50f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    : mUIDValid(false),
523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoIsAVC(false),
539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber      mAudioEOS(false),
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber      mTimeDiscontinuityPending(false),
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mResetPostponed(false),
623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingAudioUntilMediaTimeUs(-1ll),
633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mSkipRenderingVideoUntilMediaTimeUs(-1ll),
643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mVideoLateByUs(0ll),
653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesTotal(0ll),
663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesDropped(0ll) {
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
69f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) {
739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUIDValid = true;
749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mUID = uid;
759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
7743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
7843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
81f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new StreamingSource(source));
855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
885bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (!strncasecmp(url, "rtsp://", 7)) {
932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        msg->setObject(
942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                "source", new RTSPSource(url, headers, mUIDValid, mUID));
952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    } else {
962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        msg->setObject(
972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber                "source", new HTTPLiveSource(url, headers, mUIDValid, mUID));
982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1031173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) {
1041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id());
1051173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ?
1061173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                new SurfaceTextureClient(surfaceTexture) : NULL);
1071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient));
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
111f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
117f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
12143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
122b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatPause, id()))->post();
12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
126b408222bd9479c291874b607acae1425d6154fe7Andreas Huber    (new AMessage(kWhatResume, id()))->post();
12743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
12843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
1301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
1311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
1321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
13343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
13443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
13543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
13643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
13743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
13843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
13953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
1401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
14153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
14253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
14553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
14653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
14753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
15153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
15253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
15353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
15453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
15553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
15653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
15753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
15853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
159f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetDataSource");
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
1685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1741173118eace0e9e347cb007f0da817cee87579edGlenn Kasten        case kWhatSetVideoNativeWindow:
175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1761173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            LOGV("kWhatSetVideoNativeWindow");
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
1791173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            CHECK(msg->findObject("native-window", &obj));
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1811173118eace0e9e347cb007f0da817cee87579edGlenn Kasten            mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetAudioSink");
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
19843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("kWhatStart");
19943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoIsAVC = false;
2011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
2021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
20332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingAudioUntilMediaTimeUs = -1;
20432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            mSkipRenderingVideoUntilMediaTimeUs = -1;
2053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mVideoLateByUs = 0;
2063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesTotal = 0;
2073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            mNumFramesDropped = 0;
2081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
2231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
2241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
2251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
2261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
2271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
2281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
2291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
2305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
2315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
23243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("scanning sources haveAudio=%d, haveVideo=%d",
23343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
23443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            instantiateDecoder(false, &mVideoDecoder);
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
2385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
241eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            status_t err;
242eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber            if ((err = mSource->feedMoreTSData()) != OK) {
2431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
2441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
2451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
246eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber
247eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (err == ERROR_END_OF_STREAM) {
248eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
249eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    } else {
250eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                        notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
251eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    }
2521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
2585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
279eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber                    if (mSource->feedMoreTSData() == OK) {
2801183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber                        msg->post(10000ll);
2815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
284dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                int32_t err;
285dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                CHECK(codecRequest->findInt32("err", &err));
286dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
287dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                if (err == ERROR_END_OF_STREAM) {
288dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                    LOGV("got %s decoder EOS", audio ? "audio" : "video");
289dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                } else {
290dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                    LOGV("got %s decoder EOS w/ error %d",
291dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         audio ? "audio" : "video",
292dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                         err);
293dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                }
294dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber
295dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                mRenderer->queueEOS(audio, err);
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
2971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
29853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
3001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
3031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
3053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
3063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mVideoLateByUs = 0;
307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("decoder %s flush completed", audio ? "audio" : "video");
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
3121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    LOGV("initiating %s decoder shutdown",
31353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
31553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
31753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
31853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
31953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
32053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
32153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
3233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
3252c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
32631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
32731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
32831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
3292c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
33031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
3322c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Audio output format changed to %d Hz, %d channels",
33431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
3352c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
33631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
337078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                    CHECK_EQ(mAudioSink->open(
338078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                sampleRate,
339078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                numChannels,
340078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                AUDIO_FORMAT_PCM_16_BIT,
341078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                                8 /* bufferCount */),
342078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber                             (status_t)OK);
34331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
3443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
34531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
34631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
34731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
34831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
34931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
35031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
35131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
35231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
35331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
35431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
35531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
35631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
35731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
35831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Video output format changed to %d x %d "
359cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         "(crop: %d x %d @ (%d, %d))",
36031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
361cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropRight - cropLeft + 1),
362cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         (cropBottom - cropTop + 1),
363cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber                         cropLeft, cropTop);
36431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
36531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
36631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            MEDIA_SET_VIDEO_SIZE,
36731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropRight - cropLeft + 1,
36831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropBottom - cropTop + 1);
36931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
3703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
3711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("%s shutdown completed", audio ? "audio" : "video");
3723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
3733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
3743831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
3763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
3773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
3783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
3793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
3813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
3823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
3833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
385c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber            } else if (what == ACodec::kWhatError) {
386c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                LOGE("Received error from %s decoder, aborting playback.",
387c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                     audio ? "audio" : "video");
388c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
389c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                mRenderer->queueEOS(audio, UNKNOWN_ERROR);
390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
408c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                int32_t finalResult;
409c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                CHECK(msg->findInt32("finalResult", &finalResult));
410c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
417c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                if (finalResult == ERROR_END_OF_STREAM) {
418c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    LOGV("reached %s EOS", audio ? "audio" : "video");
419c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                } else {
420dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                    LOGE("%s track encountered an error (%d)",
421c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                         audio ? "audio" : "video", finalResult);
422c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber
423c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                    notifyListener(
424c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                            MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult);
425c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber                }
426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
43143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
43243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
43343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
43443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
4353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs));
4363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
43743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
43843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
43943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
44043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
4413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
4423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        driver->notifyFrameStats(
4433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                                mNumFramesTotal, mNumFramesDropped);
44443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
44543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
4463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            } else if (what == Renderer::kWhatFlushComplete) {
447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("renderer %s flush completed.", audio ? "audio" : "video");
453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
4641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatReset");
4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
4671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
4681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
4691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("postponing reset");
4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
4731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            mTimeDiscontinuityPending = true;
4826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
4831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
4841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
4851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
4881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
4891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
4921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
4931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
4941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
49543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
49643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
49743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
49843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
49943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
50022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber            LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
50143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
50343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
50443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
50543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
50643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
50743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
50843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
50943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
51043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
51143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
51243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
51343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
51443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
515b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
516b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
517b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
518b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
519b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
520b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
521b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
522b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
523b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
524b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
525b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
526b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
527b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
528b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
5363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
5373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
5383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
5413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
5423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("both audio and video are flushed now.");
5453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mTimeDiscontinuityPending) {
5476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mRenderer->signalTimeDiscontinuity();
5486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mTimeDiscontinuityPending = false;
5496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
5503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
55122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
5523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
5533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
55522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
5563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
5573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
5603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        LOGV("reset completed");
5641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
5661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
5671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
5681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
5691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
57022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
5721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
5731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
5761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
5771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
5781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    ++mScanSourcesGeneration;
5802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mScanSourcesPending = false;
5812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
5821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
5832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
5842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mSource != NULL) {
5852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource->stop();
5862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource.clear();
5872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
5881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
58943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
59043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
59143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
59243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
59343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
59443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
5951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
5981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
5991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
6011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
6031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
6041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
6051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6095bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    if (!audio) {
6213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        const char *mime;
6223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
6233fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime);
6243fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    }
6253fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6301173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
6311173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
63643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
63743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
63843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
63943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
64043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
64143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
64243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
64343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
647f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
65153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
65253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    bool dropAccessUnit;
6613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    do {
6623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
6635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
6643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (err == -EWOULDBLOCK) {
6653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return err;
6663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        } else if (err != OK) {
6673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            if (err == INFO_DISCONTINUITY) {
6683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                int32_t type;
6693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
67053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
6713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                bool formatChange =
6726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (audio &&
6736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT))
6746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    || (!audio &&
6756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT));
67653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
6776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
6786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
6796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                LOGI("%s discontinuity (formatChange=%d, time=%d)",
6806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     audio ? "audio" : "video", formatChange, timeChange);
68132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (audio) {
6833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingAudioUntilMediaTimeUs = -1;
6843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                } else {
6853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingVideoUntilMediaTimeUs = -1;
6863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                }
68732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (timeChange) {
6896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    sp<AMessage> extra;
6906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (accessUnit->meta()->findMessage("extra", &extra)
6916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            && extra != NULL) {
6926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        int64_t resumeAtMediaTimeUs;
6936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        if (extra->findInt64(
6946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
6956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            LOGI("suppressing rendering of %s until %lld us",
6966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    audio ? "audio" : "video", resumeAtMediaTimeUs);
6976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
6986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            if (audio) {
6996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingAudioUntilMediaTimeUs =
7006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
7016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            } else {
7026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingVideoUntilMediaTimeUs =
7036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
7046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            }
7053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        }
70632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
70732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
7083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mTimeDiscontinuityPending =
7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    mTimeDiscontinuityPending || timeChange;
7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (formatChange || timeChange) {
7136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    flushDecoder(audio, formatChange);
7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                } else {
7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    // This stream is unaffected by the discontinuity
7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (audio) {
7186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingAudio = FLUSHED;
7196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    } else {
7206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingVideo = FLUSHED;
7216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    }
7226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    finishFlushIfPossible();
7246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    return -EWOULDBLOCK;
7266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                }
72732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
72832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->setInt32("err", err);
7303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->post();
7313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return OK;
732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio) {
7353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesTotal;
7363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
7373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
7383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        dropAccessUnit = false;
7393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio
7403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoLateByUs > 100000ll
7413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoIsAVC
7423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && !IsAVCReferenceFrame(accessUnit)) {
7433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            dropAccessUnit = true;
7443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesDropped;
7453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
7463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    } while (dropAccessUnit);
747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
74843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
7531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("feeding %s input buffer at media time %.2f secs",
754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setObject("buffer", accessUnit);
759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
764f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
76543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("renderBuffer %s", audio ? "audio" : "video");
766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
77018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
77118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
77218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
77318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
77418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
77518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
77618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        LOGV("we're still flushing the %s decoder, sending its output buffer"
77718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
77818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
77918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
78018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
78118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
78218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
78832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
78932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
79032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
79132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
79232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
79332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
79432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
79532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
79632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
79732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
79832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            LOGV("dropping %s buffer at time %lld as requested.",
79932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
80032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
80132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
80232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
80332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
80432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
80532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
80632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
80732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
80832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
812f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
81343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
81743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
81943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
823a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber    driver->notifyListener(msg, ext1, ext2);
824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
8276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
8286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        LOGI("flushDecoder %s without decoder present",
8296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber             audio ? "audio" : "video");
8306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
8316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
8321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
8331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
83443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
8351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
8371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
8381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
8401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
8411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
8431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
8441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
8451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
8471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
8491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
8501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
8511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
8521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
8531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
8541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
8551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
8561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
8581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
8601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
8611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
8621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
8631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
8641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
8651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
8661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
868