NuPlayer.cpp revision 31e2508c75018145a8238925ff1a08cbde4e799a
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) { 27431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 27531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 27631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 2772c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 27831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 27931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 2802c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 28131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Audio output format changed to %d Hz, %d channels", 28231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 2832c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 28431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 28531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK); 28631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 2873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 28831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 28931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 29031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 29131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 29231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 29331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 29431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 29531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 29631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 29731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 29831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 29931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 30031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 30131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Video output format changed to %d x %d " 30231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "(crop: %d, %d, %d, %d)", 30331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 30431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropLeft, cropTop, cropRight, cropBottom); 30531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 30631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 30731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 30831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 30931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 3121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s shutdown completed", audio ? "audio" : "video"); 3133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 3143831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 3153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 3173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 3183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 3193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 3203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3213831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 3223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 3233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 3243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reached %s EOS", audio ? "audio" : "video"); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 35643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 35743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 35843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 35943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 36043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 36243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 36343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 36443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 36543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("renderer %s flush completed.", audio ? "audio" : "video"); 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 3831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 3841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatReset"); 3851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 3871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 3881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 3891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("postponing reset"); 3911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 3931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 3941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 3951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 3971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 3981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 3991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 4021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 4031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 4061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 4071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 4101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 41343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 41443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 41543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 41643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 41743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 41822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 41943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 42043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 42143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 42243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 42343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 42443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 42543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 42643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 42743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 42843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 42943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 43043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 43143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 43243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 4403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 4413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 4453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("both audio and video are flushed now."); 4493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mRenderer->signalTimeDiscontinuity(); 4513831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 45222fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 4533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 4543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 45622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 4573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 4583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 4613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 4641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reset completed"); 4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 4671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 4691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 47122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 4731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 4751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 4811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mSource.clear(); 4821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 48343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 48443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 48543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 48643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 48743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 48843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 4891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 4901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 4921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 4931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 4971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 4981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 4991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5035bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *decoder = new Decoder(notify, audio ? NULL : mSurface); 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 52343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 52443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 52543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 52643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 52743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 52843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 52943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 53043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 53953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 5465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == -EWOULDBLOCK) { 549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (err != OK) { 551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == INFO_DISCONTINUITY) { 5525bc087c573c70c84c6a39946457590b42d392a33Andreas Huber int32_t type; 5535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 5545bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 5555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber bool formatChange = 5565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber type == ATSParser::DISCONTINUITY_FORMATCHANGE; 55753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 5581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s discontinuity (formatChange=%d)", 55953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video", formatChange); 56053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 5611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(audio, formatChange); 562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", err); 565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 56943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 5741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("feeding %s input buffer at media time %.2f secs", 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 585f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 58643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("renderBuffer %s", audio ? "audio" : "video"); 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 599f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 60043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 60643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 61043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->sendEvent(msg, ext1, ext2); 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 6141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 6151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 61643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 6171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 6191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 6201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 6221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 6231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 6251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 6261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 6271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 6291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 6311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 6321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 6331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 6341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 6361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 6371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 6381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 6401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 6421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 6431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 6441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 6451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 650