NuPlayer.cpp revision 53df1a460bcfdd129ca2bc416dee2009e35c042e
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"
22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h"
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h"
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerStreamListener.h"
25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
263831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h>
27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h>
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h>
29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h>
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h>
31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h>
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h>
33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h>
34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
35f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber////////////////////////////////////////////////////////////////////////////////
38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
39f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer()
40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    : mEOS(false),
41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mAudioEOS(false),
42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mVideoEOS(false),
43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingAudio(NONE),
44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber      mFlushingVideo(NONE) {
45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
47f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() {
48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
50f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setListener(const wp<MediaPlayerBase> &listener) {
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mListener = listener;
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
54f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) {
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    source->incStrong(this);
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setPointer("source", source.get());  // XXX unsafe.
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
63f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) {
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, id());
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("surface", surface);
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
69f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) {
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id());
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->setObject("sink", sink);
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    msg->post();
73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
75f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() {
76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    (new AMessage(kWhatStart, id()))->post();
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
7953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static
8053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *formatChange) {
8153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    switch (state) {
8253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER:
8353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            if (formatChange != NULL) {
8453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                *formatChange = false;
8553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
8653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
8753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
8853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        case FLUSHING_DECODER_FORMATCHANGE:
8953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            if (formatChange != NULL) {
9053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                *formatChange = true;
9153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
9253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return true;
9353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
9453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber        default:
9553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            return false;
9653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    }
9753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber}
9853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
99f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    switch (msg->what()) {
101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetDataSource:
102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGI("kWhatSetDataSource");
104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(mSource == NULL);
106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            void *ptr;
108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findPointer("source", &ptr));
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mSource = static_cast<IStreamSource *>(ptr);
111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mSource->decStrong(this);
112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mStreamListener = new NuPlayerStreamListener(mSource, id());
114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mTSParser = new ATSParser;
115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetVideoSurface:
119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGI("kWhatSetVideoSurface");
121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("surface", &obj));
124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mSurface = static_cast<Surface *>(obj.get());
126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatSetAudioSink:
130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGI("kWhatSetAudioSink");
132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<RefBase> obj;
134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findObject("sink", &obj));
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get());
137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatStart:
141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mStreamListener->start();
143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer = new Renderer(
145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioSink,
146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    new AMessage(kWhatRendererNotify, id()));
147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            looper()->registerHandler(mRenderer);
149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            (new AMessage(kWhatScanSources, id()))->post();
151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatScanSources:
155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
1563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            instantiateDecoder(
1573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    false,
1583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    &mVideoDecoder,
1593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    false /* ignoreCodecSpecificData */);
160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioSink != NULL) {
1623831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                instantiateDecoder(
1633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                        true,
1643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                        &mAudioDecoder,
1653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                        false /* ignoreCodecSpecificData */);
166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mEOS) {
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                break;
170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            feedMoreTSData();
173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (mAudioDecoder == NULL || mVideoDecoder == NULL) {
175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                msg->post(100000ll);
176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatVideoNotify:
181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatAudioNotify:
182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            bool audio = msg->what() == kWhatAudioNotify;
184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            sp<AMessage> codecRequest;
186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findMessage("codec-request", &codecRequest));
187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(codecRequest->findInt32("what", &what));
190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == ACodec::kWhatFillThisBuffer) {
192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                status_t err = feedDecoderInputData(
193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        audio, codecRequest);
194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (err == -EWOULDBLOCK && !mEOS) {
196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    feedMoreTSData();
197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    msg->post();
198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatEOS) {
200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mRenderer->queueEOS(audio, ERROR_END_OF_STREAM);
201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else if (what == ACodec::kWhatFlushCompleted) {
20253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                bool formatChange;
20353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
20553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    CHECK(IsFlushingState(mFlushingAudio, &formatChange));
206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = FLUSHED;
207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
20853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    CHECK(IsFlushingState(mFlushingVideo, &formatChange));
209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = FLUSHED;
210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                LOGI("decoder %s flush completed", audio ? "audio" : "video");
213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                if (formatChange) {
21553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    LOGI("initiating %s decoder shutdown",
21653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                         audio ? "audio" : "video");
217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
21853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown();
219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
22053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    if (audio) {
22153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingAudio = SHUTTING_DOWN_DECODER;
22253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    } else {
22353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        mFlushingVideo = SHUTTING_DOWN_DECODER;
22453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    }
225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
2263831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
2282c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber            } else if (what == ACodec::kWhatOutputFormatChanged) {
2292c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                CHECK(audio);
2302c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2312c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                int32_t numChannels;
2322c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                CHECK(codecRequest->findInt32("channel-count", &numChannels));
2332c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2342c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                int32_t sampleRate;
2352c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                CHECK(codecRequest->findInt32("sample-rate", &sampleRate));
2362c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2372c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                LOGI("Audio output format changed to %d Hz, %d channels",
2382c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                     sampleRate, numChannels);
2392c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber
2402c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                mAudioSink->close();
2412c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK);
2422c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber                mAudioSink->start();
2433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                mRenderer->signalAudioSinkChanged();
2453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber            } else if (what == ACodec::kWhatShutdownCompleted) {
2463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                LOGI("%s shutdown completed", audio ? "audio" : "video");
2473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                if (audio) {
2483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mAudioDecoder.clear();
2493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER);
2513831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingAudio = SHUT_DOWN;
2523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                } else {
2533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mVideoDecoder.clear();
2543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER);
2563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                    mFlushingVideo = SHUT_DOWN;
2573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                }
2583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
2593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                finishFlushIfPossible();
260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer);
262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                renderBuffer(audio, codecRequest);
264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatRendererNotify:
270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            int32_t what;
272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK(msg->findInt32("what", &what));
273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (what == Renderer::kWhatEOS) {
275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (audio) {
279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mAudioEOS = true;
280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                } else {
281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mVideoEOS = true;
282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                LOGI("reached %s EOS", audio ? "audio" : "video");
285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if ((mAudioEOS || mAudioDecoder == NULL)
287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        && (mVideoEOS || mVideoDecoder == NULL)) {
288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0);
289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete);
292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                int32_t audio;
294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(msg->findInt32("audio", &audio));
295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                LOGI("renderer %s flush completed.", audio ? "audio" : "video");
297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        case kWhatMoreDataQueued:
302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        {
303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        default:
307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            TRESPASS();
308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
3123831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() {
3133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) {
3143831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
3153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
3163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) {
3183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        return;
3193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
3203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3213831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    LOGI("both audio and video are flushed now.");
3223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mRenderer->signalTimeDiscontinuity();
3243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingAudio == SHUT_DOWN) {
3263831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        instantiateDecoder(
3273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                true,
3283831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                &mAudioDecoder,
3293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                true /* ignoreCodecSpecificData */);
3303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        CHECK(mAudioDecoder != NULL);
3313831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    } else if (mAudioDecoder != NULL) {
3323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mAudioDecoder->signalResume();
3333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
3343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    if (mFlushingVideo == SHUT_DOWN) {
3363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        instantiateDecoder(
3373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                false,
3383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                &mVideoDecoder,
3393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                true /* ignoreCodecSpecificData */);
3403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        CHECK(mVideoDecoder != NULL);
3413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    } else if (mVideoDecoder != NULL) {
3423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        mVideoDecoder->signalResume();
3433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    }
3443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
3453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingAudio = NONE;
3463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    mFlushingVideo = NONE;
3473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber}
3483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber
349f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::feedMoreTSData() {
350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(!mEOS);
351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    for (int32_t i = 0; i < 10; ++i) {
353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        char buffer[188];
354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ssize_t n = mStreamListener->read(buffer, sizeof(buffer));
355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (n == 0) {
357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            LOGI("input data EOS reached.");
358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mTSParser->signalEOS(ERROR_END_OF_STREAM);
359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mEOS = true;
360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        } else if (n == INFO_DISCONTINUITY) {
362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mTSParser->signalDiscontinuity(ATSParser::DISCONTINUITY_SEEK);
363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        } else if (n < 0) {
364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            CHECK_EQ(n, -EWOULDBLOCK);
365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            break;
366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        } else {
367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (buffer[0] == 0x00) {
368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                // XXX legacy
3693831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                mTSParser->signalDiscontinuity(
3703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                        buffer[1] == 0x00
3713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                            ? ATSParser::DISCONTINUITY_SEEK
3723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber                            : ATSParser::DISCONTINUITY_FORMATCHANGE);
373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mTSParser->feedTSPacket(buffer, sizeof(buffer));
375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
380f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::dequeueNextAccessUnit(
381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ATSParser::SourceType *type, sp<ABuffer> *accessUnit) {
382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    accessUnit->clear();
383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t audioErr = -EWOULDBLOCK;
385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t audioTimeUs;
386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AnotherPacketSource> audioSource =
388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        static_cast<AnotherPacketSource *>(
389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mTSParser->getSource(ATSParser::MPEG2ADTS_AUDIO).get());
390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (audioSource != NULL) {
392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        audioErr = audioSource->nextBufferTime(&audioTimeUs);
393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t videoErr = -EWOULDBLOCK;
396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t videoTimeUs;
397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AnotherPacketSource> videoSource =
399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        static_cast<AnotherPacketSource *>(
400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mTSParser->getSource(ATSParser::AVC_VIDEO).get());
401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (videoSource != NULL) {
403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        videoErr = videoSource->nextBufferTime(&videoTimeUs);
404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (audioErr == -EWOULDBLOCK || videoErr == -EWOULDBLOCK) {
407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (audioErr != OK && videoErr != OK) {
411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return audioErr;
412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (videoErr != OK || (audioErr == OK && audioTimeUs < videoTimeUs)) {
415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        *type = ATSParser::MPEG2ADTS_AUDIO;
416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return audioSource->dequeueAccessUnit(accessUnit);
417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else {
418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        *type = ATSParser::AVC_VIDEO;
419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return videoSource->dequeueAccessUnit(accessUnit);
420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
423f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::dequeueAccessUnit(
424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        ATSParser::SourceType type, sp<ABuffer> *accessUnit) {
425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AnotherPacketSource> source =
426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        static_cast<AnotherPacketSource *>(mTSParser->getSource(type).get());
427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (source == NULL) {
429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t finalResult;
433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!source->hasBufferAvailable(&finalResult)) {
434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return finalResult == OK ? -EWOULDBLOCK : finalResult;
435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return source->dequeueAccessUnit(accessUnit);
438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
440f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::instantiateDecoder(
4413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber        bool audio, sp<Decoder> *decoder, bool ignoreCodecSpecificData) {
442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (*decoder != NULL) {
443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    ATSParser::SourceType type =
447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO;
448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AnotherPacketSource> source =
450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        static_cast<AnotherPacketSource *>(
451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                mTSParser->getSource(type).get());
452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (source == NULL) {
454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return -EWOULDBLOCK;
455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> notify =
458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify,
459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                     id());
460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    *decoder = new Decoder(notify, audio ? NULL : mSurface);
462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    looper()->registerHandler(*decoder);
463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    const sp<MetaData> &meta = source->getFormat();
4653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber    (*decoder)->configure(meta, ignoreCodecSpecificData);
466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
470f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
47453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber    if ((audio && IsFlushingState(mFlushingAudio))
47553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            || (!audio && IsFlushingState(mFlushingVideo))) {
476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", INFO_DISCONTINUITY);
477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> accessUnit;
482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    status_t err = dequeueAccessUnit(
483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            audio ? ATSParser::MPEG2ADTS_AUDIO : ATSParser::AVC_VIDEO,
484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            &accessUnit);
485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (err == -EWOULDBLOCK) {
487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return err;
488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    } else if (err != OK) {
489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        if (err == INFO_DISCONTINUITY) {
49053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            int32_t formatChange;
49153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            if (!accessUnit->meta()->findInt32(
49253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                        "format-change", &formatChange)) {
49353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                formatChange = 0;
49453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            }
49553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
49653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber            LOGI("%s discontinuity (formatChange=%d)",
49753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                 audio ? "audio" : "video", formatChange);
49853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            (audio ? mAudioDecoder : mVideoDecoder)->signalFlush();
500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            mRenderer->flush(audio);
501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            if (audio) {
503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(mFlushingAudio == NONE
504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        || mFlushingAudio == AWAITING_DISCONTINUITY);
50553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
50653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                mFlushingAudio = formatChange
50753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    ? FLUSHING_DECODER_FORMATCHANGE : FLUSHING_DECODER;
50853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (mFlushingVideo == NONE) {
510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingVideo = (mVideoDecoder != NULL)
511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        ? AWAITING_DISCONTINUITY
512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        : FLUSHED;
513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            } else {
515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                CHECK(mFlushingVideo == NONE
516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        || mFlushingVideo == AWAITING_DISCONTINUITY);
51753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
51853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                mFlushingVideo = formatChange
51953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber                    ? FLUSHING_DECODER_FORMATCHANGE : FLUSHING_DECODER;
52053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber
521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                if (mFlushingAudio == NONE) {
522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                    mFlushingAudio = (mAudioDecoder != NULL)
523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        ? AWAITING_DISCONTINUITY
524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                        : FLUSHED;
525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber                }
526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            }
527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        }
528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->setInt32("err", err);
530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        reply->post();
531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return OK;
532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGV("returned a valid buffer of %s data", audio ? "audio" : "video");
535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0
537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    int64_t mediaTimeUs;
538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs));
539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGI("feeding %s input buffer at media time %.2f secs",
540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         audio ? "audio" : "video",
541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber         mediaTimeUs / 1E6);
542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif
543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->setObject("buffer", accessUnit);
545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    reply->post();
546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
550f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    LOGV("renderBuffer %s", audio ? "audio" : "video");
552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<AMessage> reply;
554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findMessage("reply", &reply));
555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<RefBase> obj;
557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    CHECK(msg->findObject("buffer", &obj));
558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mRenderer->queueBuffer(audio, buffer, reply);
562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
564f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) {
565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (mListener == NULL) {
566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    sp<MediaPlayerBase> listener = mListener.promote();
570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (listener == NULL) {
572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber        return;
573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    listener->sendEvent(msg, ext1, ext2);
576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
579