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