NuPlayer.cpp revision 1aef211b4e5dc952081727bfd2318b2cb5ca4506
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"
25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h"
265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h"
275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h"
285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h"
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
313831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h>
39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
40f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
44f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    : mAudioEOS(false),
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber      mScanSourcesPending(false),
481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mScanSourcesGeneration(0),
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mFlushingVideo(NONE),
511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetInProgress(false),
521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber      mResetPostponed(false) {
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
55f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
58f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setListener(const wp<MediaPlayerBase> &listener) {
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mListener = listener;
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
62f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
655bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new StreamingSource(source));
665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->post();
675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber}
685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
695bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource(
705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    msg->setObject("source", new HTTPLiveSource(url));
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
77f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) {
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, id());
79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("surface", surface);
80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
83f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
89f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() {
941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (new AMessage(kWhatReset, id()))->post();
951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
9753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) {
9953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
10053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
1011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = false;
10353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
10453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
10553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
1061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case FLUSHING_DECODER_SHUTDOWN:
1071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (needShutdown != NULL) {
1081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                *needShutdown = true;
10953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
11053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
11153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
11253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
11353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
11453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
11553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
11653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
117f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetDataSource");
122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            sp<RefBase> obj;
1265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(msg->findObject("source", &obj));
127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource = static_cast<Source *>(obj.get());
129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetVideoSurface:
133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetVideoSurface");
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("surface", &obj));
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mSurface = static_cast<Surface *>(obj.get());
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatSetAudioSink");
146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mAudioEOS = false;
1571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mVideoEOS = false;
1581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mSource->start();
160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            postScanSources();
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            int32_t generation;
1741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            CHECK(msg->findInt32("generation", &generation));
1751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (generation != mScanSourcesGeneration) {
1761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // Drop obsolete msg.
1771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
1781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
1791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
1805bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            mScanSourcesPending = false;
1815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
1825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            instantiateDecoder(false, &mVideoDecoder);
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
1855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                instantiateDecoder(true, &mAudioDecoder);
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            if (!mSource->feedMoreTSData()) {
1891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
1901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // We're not currently decoding anything (no audio or
1911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    // video tracks found) and we just ran out of input data.
1921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
1931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                }
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
1995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                mScanSourcesPending = true;
200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                if (err == -EWOULDBLOCK) {
2205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    if (mSource->feedMoreTSData()) {
2215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                        msg->post();
2225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                    }
223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
2271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                bool needShutdown;
22853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
2301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &needShutdown));
231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
2331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &needShutdown));
234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("decoder %s flush completed", audio ? "audio" : "video");
238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
2391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                if (needShutdown) {
2401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                    LOGV("initiating %s decoder shutdown",
24153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
24353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
24553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
24653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
24753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
24853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
24953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
2513831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
2532c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
2542c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                CHECK(audio);
2552c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2562c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                int32_t numChannels;
2572c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                CHECK(codecRequest->findInt32("channel-count", &numChannels));
2582c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2592c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                int32_t sampleRate;
2602c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
2612c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("Audio output format changed to %d Hz, %d channels",
2632c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                     sampleRate, numChannels);
2642c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2652c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                mAudioSink->close();
2662c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK);
2672c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                mAudioSink->start();
2683831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2693831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                mRenderer->signalAudioSinkChanged();
2703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
2711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("%s shutdown completed", audio ? "audio" : "video");
2723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
2733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
2743831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
2763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
2773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
2783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
2793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
2813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
2823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
2833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("reached %s EOS", audio ? "audio" : "video");
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("renderer %s flush completed.", audio ? "audio" : "video");
322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        case kWhatReset:
3321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        {
3331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("kWhatReset");
3341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mFlushingAudio != NONE || mFlushingVideo != NONE) {
3361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // We're currently flushing, postpone the reset until that's
3371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                // completed.
3381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                LOGV("postponing reset");
3401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                mResetPostponed = true;
3421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
3431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
3441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder == NULL && mVideoDecoder == NULL) {
3461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                finishReset();
3471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                break;
3481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
3491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mAudioDecoder != NULL) {
3511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(true /* audio */, true /* needShutdown */);
3521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
3531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            if (mVideoDecoder != NULL) {
3551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                flushDecoder(false /* audio */, true /* needShutdown */);
3561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            }
3571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
3581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mResetInProgress = true;
3591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            break;
3601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
3611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3683831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
3693831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
3703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
3713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
3723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
3743831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
3753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
3763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("both audio and video are flushed now.");
3783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mRenderer->signalTimeDiscontinuity();
3803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    bool scanSourcesAgain = false;
3825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
3833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio == SHUT_DOWN) {
3845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        scanSourcesAgain = true;
3853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    } else if (mAudioDecoder != NULL) {
3863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
3873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
3883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo == SHUT_DOWN) {
3905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        scanSourcesAgain = true;
3913831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    } else if (mVideoDecoder != NULL) {
3923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
3933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
3943831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3953831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
3963831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mResetInProgress) {
3991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        LOGV("reset completed");
4001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetInProgress = false;
4021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        finishReset();
4031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (mResetPostponed) {
4041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        (new AMessage(kWhatReset, id()))->post();
4051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mResetPostponed = false;
4061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else if (scanSourcesAgain) {
4071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        postScanSources();
4081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
4091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
4101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() {
4121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mAudioDecoder == NULL);
4131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    CHECK(mVideoDecoder == NULL);
4141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer.clear();
4161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mSource.clear();
4171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    notifyListener(MEDIA_RESET_COMPLETE, 0, 0);
4191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
4201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() {
4221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (mScanSourcesPending) {
4231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        return;
424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
4251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    sp<AMessage> msg = new AMessage(kWhatScanSources, id());
4271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->setInt32("generation", mScanSourcesGeneration);
4281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    msg->post();
4291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mScanSourcesPending = true;
431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4335bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) {
434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    sp<MetaData> meta = mSource->getFormat(audio);
439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    if (meta == NULL) {
441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    *decoder = new Decoder(notify, audio ? NULL : mSurface);
449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
4515bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    (*decoder)->configure(meta);
452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
456f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
46053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
46153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
4685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    status_t err = mSource->dequeueAccessUnit(audio, &accessUnit);
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err == -EWOULDBLOCK) {
471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (err != OK) {
473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err == INFO_DISCONTINUITY) {
4745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            int32_t type;
4755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            CHECK(accessUnit->meta()->findInt32("discontinuity", &type));
4765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
4775bc087c573c70c84c6a39946457590b42d392a33Andreas Huber            bool formatChange =
4785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber                type == ATSParser::DISCONTINUITY_FORMATCHANGE;
47953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            LOGV("%s discontinuity (formatChange=%d)",
48153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                 audio ? "audio" : "video", formatChange);
48253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
4831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            flushDecoder(audio, formatChange);
484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", err);
487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
4961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    LOGV("feeding %s input buffer at media time %.2f secs",
497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setObject("buffer", accessUnit);
502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
507f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGV("renderBuffer %s", audio ? "audio" : "video");
509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
521f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mListener == NULL) {
523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<MediaPlayerBase> listener = mListener.promote();
527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (listener == NULL) {
529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    listener->sendEvent(msg, ext1, ext2);
533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
5351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) {
5361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    // Make sure we don't continue to scan sources until we finish flushing.
5371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    ++mScanSourcesGeneration;
5381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
5401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mRenderer->flush(audio);
5411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    FlushStatus newStatus =
5431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER;
5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    if (audio) {
5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingAudio == NONE
5471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingAudio == AWAITING_DISCONTINUITY);
5481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingAudio = newStatus;
5501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingVideo == NONE) {
5521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingVideo = (mVideoDecoder != NULL)
5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
5551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
5561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    } else {
5571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        CHECK(mFlushingVideo == NONE
5581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                || mFlushingVideo == AWAITING_DISCONTINUITY);
5591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mFlushingVideo = newStatus;
5611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
5621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        if (mFlushingAudio == NONE) {
5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber            mFlushingAudio = (mAudioDecoder != NULL)
5641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                ? AWAITING_DISCONTINUITY
5651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber                : FLUSHED;
5661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        }
5671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
5681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
571