NuPlayer.cpp revision ea9d51bd710e6739077a3700f27a1c37767a2f6d
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        {
1633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("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        {
1763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("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        {
1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("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        {
1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("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
2323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("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) {
2883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("got %s decoder EOS", audio ? "audio" : "video");
289dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber                } else {
2903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("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
3093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("decoder %s flush completed", audio ? "audio" : "video");
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
3123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("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
3333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("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
3583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("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) {
3713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("%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) {
4183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                    ALOGV("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
4523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block                ALOGV("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        {
4643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatReset");
4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
466b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber            if (mRenderer != NULL) {
467b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // There's an edge case where the renderer owns all output
468b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // buffers and is paused, therefore the decoder will not read
469b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // more input data and will never encounter the matching
470b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                // discontinuity. To avoid this, we resume the renderer.
471b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
472b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                if (mFlushingAudio == AWAITING_DISCONTINUITY
473b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                        || mFlushingVideo == AWAITING_DISCONTINUITY) {
474b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                    mRenderer->resume();
475b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber                }
476b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber            }
477b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber
4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
4811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
482ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber                ALOGV("postponing reset mFlushingAudio=%d, mFlushingVideo=%d",
483ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber                      mFlushingAudio, mFlushingVideo);
4841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
4861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
4901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
4911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
4921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber            mTimeDiscontinuityPending = true;
4956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
4961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
4971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
4981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
5011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
5021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
5031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
5051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
5061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
5071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
50843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
50943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
51043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
51143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
51243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
5133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
51443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
51543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
51643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
51743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
51843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
51943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
52043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
52143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
52243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
52343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
52443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
52543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
52643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
52743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
528b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatPause:
529b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
530b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
531b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->pause();
532b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
533b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
534b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
535b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        case kWhatResume:
536b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        {
537b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            CHECK(mRenderer != NULL);
538b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            mRenderer->resume();
539b408222bd9479c291874b607acae1425d6154fe7Andreas Huber            break;
540b408222bd9479c291874b607acae1425d6154fe7Andreas Huber        }
541b408222bd9479c291874b607acae1425d6154fe7Andreas Huber
542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
5493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
5503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
5513831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
5543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
5553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("both audio and video are flushed now.");
5583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if (mTimeDiscontinuityPending) {
5606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mRenderer->signalTimeDiscontinuity();
5616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        mTimeDiscontinuityPending = false;
5626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
5633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
56422fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
5653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
5663831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5673831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
56822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
5693831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
5703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
5713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
5723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
5733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
5763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("reset completed");
5771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
5791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
5801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
5811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
5821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
58322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
5841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
5851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
5861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
5891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
5901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
5911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    ++mScanSourcesGeneration;
5932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    mScanSourcesPending = false;
5942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
5951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
5962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
5972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    if (mSource != NULL) {
5982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource->stop();
5992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        mSource.clear();
6002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    }
6011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
60243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
60343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
60543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
60643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
60743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
6081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
6091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
6111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
6121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
6141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
6161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
6171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
6181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6225bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    if (!audio) {
6343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        const char *mime;
6353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        CHECK(meta->findCString(kKeyMIMEType, &mime));
6363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime);
6373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    }
6383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    *decoder = audio ? new Decoder(notify) :
6441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten                       new Decoder(notify, mNativeWindow);
645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
64943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
65043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
65143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
65243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
65343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
65443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
65543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
65643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
660f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
66453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
66553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    bool dropAccessUnit;
6743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    do {
6753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
6765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
6773fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (err == -EWOULDBLOCK) {
6783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return err;
6793fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        } else if (err != OK) {
6803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            if (err == INFO_DISCONTINUITY) {
6813fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                int32_t type;
6823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
68353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
6843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                bool formatChange =
6856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    (audio &&
6866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT))
6876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    || (!audio &&
6886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT));
68953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
6906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0;
6916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
6926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                LOGI("%s discontinuity (formatChange=%d, time=%d)",
6936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                     audio ? "audio" : "video", formatChange, timeChange);
69432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
6953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                if (audio) {
6963fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingAudioUntilMediaTimeUs = -1;
6973fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                } else {
6983fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    mSkipRenderingVideoUntilMediaTimeUs = -1;
6993fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                }
70032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (timeChange) {
7026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    sp<AMessage> extra;
7036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (accessUnit->meta()->findMessage("extra", &extra)
7046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            && extra != NULL) {
7056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        int64_t resumeAtMediaTimeUs;
7066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        if (extra->findInt64(
7076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) {
7086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            LOGI("suppressing rendering of %s until %lld us",
7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    audio ? "audio" : "video", resumeAtMediaTimeUs);
7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            if (audio) {
7126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingAudioUntilMediaTimeUs =
7136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            } else {
7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                mSkipRenderingVideoUntilMediaTimeUs =
7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                                    resumeAtMediaTimeUs;
7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                            }
7183fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                        }
71932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                    }
72032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                }
7213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
7226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                mTimeDiscontinuityPending =
7236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    mTimeDiscontinuityPending || timeChange;
7246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                if (formatChange || timeChange) {
7266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    flushDecoder(audio, formatChange);
7276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                } else {
7286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    // This stream is unaffected by the discontinuity
7296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    if (audio) {
7316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingAudio = FLUSHED;
7326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    } else {
7336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                        mFlushingVideo = FLUSHED;
7346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    }
7356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    finishFlushIfPossible();
7376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
7386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                    return -EWOULDBLOCK;
7396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber                }
74032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            }
74132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
7423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->setInt32("err", err);
7433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            reply->post();
7443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            return OK;
745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio) {
7483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesTotal;
7493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
7503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
7513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        dropAccessUnit = false;
7523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        if (!audio
7533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoLateByUs > 100000ll
7543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && mVideoIsAVC
7553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                && !IsAVCReferenceFrame(accessUnit)) {
7563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            dropAccessUnit = true;
7573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber            ++mNumFramesDropped;
7583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        }
7593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    } while (dropAccessUnit);
760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
7663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    ALOGV("feeding %s input buffer at media time %.2f secs",
767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setObject("buffer", accessUnit);
772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
777f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
7783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block    // ALOGV("renderBuffer %s", audio ? "audio" : "video");
779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
78318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) {
78418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // We're currently attempting to flush the decoder, in order
78518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // to complete this, the decoder wants all its buffers back,
78618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // so we don't want any output buffers it sent us (from before
78718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        // we initiated the flush) to be stuck in the renderer's queue.
78818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
7893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        ALOGV("we're still flushing the %s decoder, sending its output buffer"
79018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber             " right back.", audio ? "audio" : "video");
79118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
79218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        reply->post();
79318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber        return;
79418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber    }
79518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber
796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
80132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    int64_t &skipUntilMediaTimeUs =
80232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        audio
80332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            ? mSkipRenderingAudioUntilMediaTimeUs
80432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            : mSkipRenderingVideoUntilMediaTimeUs;
80532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
80632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    if (skipUntilMediaTimeUs >= 0) {
80732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        int64_t mediaTimeUs;
80832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs));
80932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
81032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        if (mediaTimeUs < skipUntilMediaTimeUs) {
8113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block            ALOGV("dropping %s buffer at time %lld as requested.",
81232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 audio ? "audio" : "video",
81332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber                 mediaTimeUs);
81432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
81532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            reply->post();
81632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber            return;
81732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        }
81832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
81932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber        skipUntilMediaTimeUs = -1;
82032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber    }
82132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber
822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
825f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
82643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
83043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
83243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
836a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber    driver->notifyListener(msg, ext1, ext2);
837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
8391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
8406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) {
8416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber        LOGI("flushDecoder %s without decoder present",
8426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber             audio ? "audio" : "video");
8436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber    }
8446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber
8451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
8461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
84743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
8481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
8501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
8511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
8531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
8541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
8561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
8571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
8581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
8601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
8621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
8631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
8641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
8651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
8661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
8671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
8681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
8691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
8711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
8721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
8731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
8741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
8751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
8761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
8771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
8781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
8791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
881