NuPlayer.cpp revision 22fc52f6f72f39e33c3970d0291de3569118aa5c
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayer" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h" 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h" 2543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber#include "NuPlayerDriver.h" 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h" 275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h" 285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h" 295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h" 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h> 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber : mAudioEOS(false), 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 485bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed(false) { 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 56f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 6043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 63f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->setObject("source", new StreamingSource(source)); 675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 705bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->setObject("source", new HTTPLiveSource(url)); 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 78f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) { 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, id()); 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("surface", surface); 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 84f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 90f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 9543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // XXX to be implemented 9643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 9743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 9843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 9943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // XXX to be implemented 10043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 10143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 10643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 10743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 10843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 10943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 11043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 11143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 11253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 11453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 11553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 11853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 11953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 12053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 12453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 12553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 12653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 12753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 12853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 12953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 13053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 13153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 132f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetDataSource"); 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 1415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetVideoSurface: 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetVideoSurface"); 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("surface", &obj)); 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mSurface = static_cast<Surface *>(obj.get()); 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetAudioSink"); 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 17143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("kWhatStart"); 17243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 1741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 1751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 1765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 1911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 1921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 1931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 1941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 1951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 1961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 1975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 1985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 19943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("scanning sources haveAudio=%d, haveVideo=%d", 20043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 20143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(false, &mVideoDecoder); 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 2055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (!mSource->feedMoreTSData()) { 2091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 2101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 2111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 2121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 2131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 2195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 2405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mSource->feedMoreTSData()) { 2415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 2425bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueEOS(audio, ERROR_END_OF_STREAM); 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 2471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 24853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 2501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 2531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("decoder %s flush completed", audio ? "audio" : "video"); 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 2601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("initiating %s decoder shutdown", 26153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 26353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 26553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 26653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 26753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 26853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 26953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 2723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 2732c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 2742c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber CHECK(audio); 2752c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2762c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber int32_t numChannels; 2772c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 2782c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2792c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber int32_t sampleRate; 2802c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 2812c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("Audio output format changed to %d Hz, %d channels", 2832c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber sampleRate, numChannels); 2842c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 2852c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber mAudioSink->close(); 2862c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK); 2872c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber mAudioSink->start(); 2883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 2893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mRenderer->signalAudioSinkChanged(); 2903831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 2911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s shutdown completed", audio ? "audio" : "video"); 2923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 2933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 2943831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 2953831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 2963831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 2973831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 2983831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 2993831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3003831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 3013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 3023831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 3033831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3043831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reached %s EOS", audio ? "audio" : "video"); 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 33543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 33643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 33743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 33843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 33943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 34043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 34143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 34243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 34343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 34443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("renderer %s flush completed.", audio ? "audio" : "video"); 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 3621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 3631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatReset"); 3641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 3661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 3671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 3681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("postponing reset"); 3701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 3721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 3731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 3741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 3761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 3771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 3781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 3791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 3811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 3821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 3831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 3851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 3861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 3871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 3891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 3901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 3911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 39243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 39343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 39443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 39543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 39643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 39722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 39843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 39943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 40043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 40143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 40243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 40343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 40443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 40543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 40643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 40743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 40843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 40943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 41043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 41143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 4193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 4203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4213831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 4243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4263831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("both audio and video are flushed now."); 4283831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mRenderer->signalTimeDiscontinuity(); 4303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 43122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 4323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 4333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 43522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 4363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 4373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 4403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 4431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reset completed"); 4441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 4461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 4481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 4491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 45022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 4511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 4521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 4541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 4561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 4571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 4581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 4601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mSource.clear(); 4611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 46243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 46343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 46443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 46543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 46643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 46743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 4681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 4691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4825bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *decoder = new Decoder(notify, audio ? NULL : mSurface); 498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 50343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 50443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 50543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 50643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 50743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 50843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 50943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 51853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 5255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == -EWOULDBLOCK) { 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (err != OK) { 530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == INFO_DISCONTINUITY) { 5315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber int32_t type; 5325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 5335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 5345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber bool formatChange = 5355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber type == ATSParser::DISCONTINUITY_FORMATCHANGE; 53653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 5371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s discontinuity (formatChange=%d)", 53853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video", formatChange); 53953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 5401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(audio, formatChange); 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", err); 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("feeding %s input buffer at media time %.2f secs", 554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 564f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("renderBuffer %s", audio ? "audio" : "video"); 566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 578f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 57943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->sendEvent(msg, ext1, ext2); 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 5931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 5941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 59543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 5961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 5981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 5991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 6011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 6021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 6041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 6051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 6061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 6081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 6101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 6111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 6121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 6131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 6151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 6161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 6171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 6191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 6211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 6221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 6231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 6241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 629