NuPlayer.cpp revision 31e2508c75018145a8238925ff1a08cbde4e799a
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License.
6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and
14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License.
15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */
16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayer"
19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h"
225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h"
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h"
2543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber#include "NuPlayerDriver.h"
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h"
275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h"
285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h"
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h>
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
41f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
45f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    : mAudioEOS(false),
47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
485bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetPostponed(false) {
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
56f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) {
6043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDriver = driver;
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
63f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new StreamingSource(source));
675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
705bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new HTTPLiveSource(url));
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
78f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) {
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, id());
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("surface", surface);
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
84f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
90f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
9443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() {
9543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // XXX to be implemented
9643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
9743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
9843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() {
9943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // XXX to be implemented
10043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
10143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
1031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
1041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
1051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
10643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) {
10743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSeek, id());
10843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->setInt64("seekTimeUs", seekTimeUs);
10943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    msg->post();
11043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
11143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
11253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
1131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
11453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
11553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
11853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
11953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
12053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
12453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
12553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
12653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
12753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
12853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
12953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
13053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
13153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
132f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetDataSource");
137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
1415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetVideoSurface:
148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetVideoSurface");
150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("surface", &obj));
153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mSurface = static_cast<Surface *>(obj.get());
155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetAudioSink");
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
17143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("kWhatStart");
17243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
1741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
1751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
1911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
1921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
1931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
1941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
1951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
1961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
1985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
19943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            LOGV("scanning sources haveAudio=%d, haveVideo=%d",
20043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 mAudioDecoder != NULL, mVideoDecoder != NULL);
20143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            instantiateDecoder(false, &mVideoDecoder);
203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
2055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (!mSource->feedMoreTSData()) {
2091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
2101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
2111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
2121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
2131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
2195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
2405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    if (mSource->feedMoreTSData()) {
2415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                        msg->post();
2425bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
2471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
24853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
2501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
2531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("decoder %s flush completed", audio ? "audio" : "video");
258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
2601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    LOGV("initiating %s decoder shutdown",
26153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
26353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
26553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
26653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
26753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
26853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
26953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
2713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
2732c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
27431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                if (audio) {
27531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t numChannels;
27631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("channel-count", &numChannels));
2772c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
27831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t sampleRate;
27931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
2802c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
28131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Audio output format changed to %d Hz, %d channels",
28231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         sampleRate, numChannels);
2832c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
28431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->close();
28531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK);
28631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mAudioSink->start();
2873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
28831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    mRenderer->signalAudioSinkChanged();
28931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                } else {
29031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    // video
29131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
29231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t width, height;
29331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("width", &width));
29431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findInt32("height", &height));
29531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
29631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    int32_t cropLeft, cropTop, cropRight, cropBottom;
29731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    CHECK(codecRequest->findRect(
29831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                "crop",
29931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                                &cropLeft, &cropTop, &cropRight, &cropBottom));
30031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
30131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    LOGV("Video output format changed to %d x %d "
30231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         "(crop: %d, %d, %d, %d)",
30331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         width, height,
30431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                         cropLeft, cropTop, cropRight, cropBottom);
30531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber
30631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                    notifyListener(
30731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            MEDIA_SET_VIDEO_SIZE,
30831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropRight - cropLeft + 1,
30931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                            cropBottom - cropTop + 1);
31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber                }
3113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
3121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("%s shutdown completed", audio ? "audio" : "video");
3133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
3143831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
3153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
3173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
3183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
3193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
3203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3213831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
3223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
3233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
3243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("reached %s EOS", audio ? "audio" : "video");
351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
35643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            } else if (what == Renderer::kWhatPosition) {
35743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                int64_t positionUs;
35843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                CHECK(msg->findInt64("positionUs", &positionUs));
35943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
36043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (mDriver != NULL) {
36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    sp<NuPlayerDriver> driver = mDriver.promote();
36243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    if (driver != NULL) {
36343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                        driver->notifyPosition(positionUs);
36443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    }
36543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("renderer %s flush completed.", audio ? "audio" : "video");
373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
3831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
3841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatReset");
3851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
3871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
3881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
3891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("postponing reset");
3911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
3931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
3941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
3951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
3971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
3981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
3991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
4021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
4031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
4061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
4071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
4081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
4101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
4111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
4121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
41343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        case kWhatSeek:
41443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
41543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            int64_t seekTimeUs;
41643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            CHECK(msg->findInt64("seekTimeUs", &seekTimeUs));
41743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
41822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber            LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)",
41943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                 seekTimeUs, seekTimeUs / 1E6);
42043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
42143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mSource->seekTo(seekTimeUs);
42243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
42343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mDriver != NULL) {
42443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                sp<NuPlayerDriver> driver = mDriver.promote();
42543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                if (driver != NULL) {
42643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                    driver->notifySeekComplete();
42743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                }
42843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
42943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
43043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
43143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
43243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
4403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
4413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
4423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
4453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
4463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("both audio and video are flushed now.");
4493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mRenderer->signalTimeDiscontinuity();
4513831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
45222fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mAudioDecoder != NULL) {
4533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
4543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
45622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    if (mVideoDecoder != NULL) {
4573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
4583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
4593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
4603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
4613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
4641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        LOGV("reset completed");
4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
4671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
4681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
4691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
47122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber    } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
4731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
4751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
4811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mSource.clear();
4821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
48343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL) {
48443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
48543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
48643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyResetComplete();
48743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
48843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
4891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
4901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
4921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
4931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
4951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
4971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
4981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
4991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5035bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    *decoder = new Decoder(notify, audio ? NULL : mSurface);
519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
52343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t durationUs;
52443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) {
52543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        sp<NuPlayerDriver> driver = mDriver.promote();
52643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        if (driver != NULL) {
52743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            driver->notifyDuration(durationUs);
52843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
52943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
53043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
534f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
53853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
53953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
5465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err == -EWOULDBLOCK) {
549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (err != OK) {
551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err == INFO_DISCONTINUITY) {
5525bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            int32_t type;
5535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
5545bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
5555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            bool formatChange =
5565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                type == ATSParser::DISCONTINUITY_FORMATCHANGE;
55753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
5581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("%s discontinuity (formatChange=%d)",
55953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                 audio ? "audio" : "video", formatChange);
56053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
5611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            flushDecoder(audio, formatChange);
562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", err);
565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
56943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
5741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("feeding %s input buffer at media time %.2f secs",
575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setObject("buffer", accessUnit);
580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
585f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
58643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    // LOGV("renderBuffer %s", audio ? "audio" : "video");
587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
599f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
60043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDriver == NULL) {
601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    sp<NuPlayerDriver> driver = mDriver.promote();
605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (driver == NULL) {
607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
61043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    driver->sendEvent(msg, ext1, ext2);
611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
6141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
6151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
61643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mScanSourcesPending = false;
6171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
6191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
6201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
6221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
6231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
6251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
6261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
6271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
6291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
6311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
6321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
6331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
6341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
6351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
6361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
6371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
6381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
6401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
6411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
6421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
6431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
6441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
6451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
6461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
6471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
6481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
650