NuPlayer.cpp revision b408222bd9479c291874b607acae1425d6154fe7
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() { 95b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 9643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 9743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 9843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 99b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 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 433b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 434b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 435b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 436b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 437b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 438b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 439b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 440b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 441b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 442b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 443b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 444b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 445b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 446b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 4543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 4553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 4593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("both audio and video are flushed now."); 4633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mRenderer->signalTimeDiscontinuity(); 4653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 46622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 4673831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 4683831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4693831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 47022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 4713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 4723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4743831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 4753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reset completed"); 4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 4811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 4831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 4841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 48522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 4861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 4871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 4891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 4911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 4921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 4931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 4951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mSource.clear(); 4961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 49743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 49843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 49943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 50043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 50143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 5031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 5061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 5071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 5111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 5121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 5131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5175bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5245bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *decoder = new Decoder(notify, audio ? NULL : mSurface); 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 53843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 53943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 54043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 54143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 54243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 54343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 54443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 548f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 55253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 55353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 5605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == -EWOULDBLOCK) { 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (err != OK) { 565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == INFO_DISCONTINUITY) { 5665bc087c573c70c84c6a39946457590b42d392a33Andreas Huber int32_t type; 5675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 5685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 5695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber bool formatChange = 5705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber type == ATSParser::DISCONTINUITY_FORMATCHANGE; 57153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 5721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s discontinuity (formatChange=%d)", 57353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video", formatChange); 57453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 5751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(audio, formatChange); 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", err); 579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 5881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("feeding %s input buffer at media time %.2f secs", 589f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 599f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 60043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("renderBuffer %s", audio ? "audio" : "video"); 601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 613f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 61443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 61843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->sendEvent(msg, ext1, ext2); 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 6281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 6291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 63043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 6311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 6331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 6341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 6361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 6371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 6391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 6401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 6411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 6431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 6451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 6461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 6471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 6481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 6501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 6511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 6521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 6541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 6561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 6571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 6581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 6591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 664