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