NuPlayer.cpp revision 3fe62150fa3dd6d25cb84aad80bc9e27ddd16c45
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> 373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h> 411173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h" 443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 45f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber : mUIDValid(false), 513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC(false), 529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mAudioEOS(false), 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 545bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mResetPostponed(false), 603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs(-1ll), 613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs(-1ll), 623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs(0ll), 633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0ll), 643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped(0ll) { 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 67f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 7543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 7643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 79f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->setObject("source", new StreamingSource(source)); 835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 865bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 909b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber msg->setObject("source", new HTTPLiveSource(url, headers, mUIDValid, mUID)); 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 94f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) { 951173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surface)); 971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->post(); 981173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1001173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 1011173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 1021173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 1031173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 1041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 114f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 119b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 12143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 12243c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 123b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 13043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 13143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 13243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 13343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 13443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 13543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 13653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 13853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 13953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 14253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 14353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 14453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 14853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 14953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 15053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 15153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 15253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 15353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 15453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 15553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 156f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetDataSource"); 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 1655bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1711173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten LOGV("kWhatSetVideoNativeWindow"); 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 1761173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1781173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetAudioSink"); 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 19543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("kWhatStart"); 19643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1973fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = false; 1981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 1991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 20032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 20132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 2023fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 2033fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = 0; 2043fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = 0; 2051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 2211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 2221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 2231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 2241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 2251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 2285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 22943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("scanning sources haveAudio=%d, haveVideo=%d", 23043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 23143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(false, &mVideoDecoder); 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 2355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (!mSource->feedMoreTSData()) { 2391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 2401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 2411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 2421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 2431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 2495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 2705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mSource->feedMoreTSData()) { 2715bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 2725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueEOS(audio, ERROR_END_OF_STREAM); 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 2771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 27853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 2831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 2853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 2863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("decoder %s flush completed", audio ? "audio" : "video"); 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 2921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("initiating %s decoder shutdown", 29353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 29553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 29753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 29853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 29953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 30053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 30153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3033831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3043831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 3052c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 30631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 30731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 30831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 3092c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 3122c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Audio output format changed to %d Hz, %d channels", 31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 3152c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 317078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 318078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 319078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 320078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 321078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber 8 /* bufferCount */), 322078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 32331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 3243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 32531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 32631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 32731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 32831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 32931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 33031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 33231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 33431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 33531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 33631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 33731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 33831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Video output format changed to %d x %d " 339cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 34031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 341cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropRight - cropLeft + 1), 342cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropBottom - cropTop + 1), 343cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 34431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 34531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 34631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 34731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 34831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 34931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 3511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s shutdown completed", audio ? "audio" : "video"); 3523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 3533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 3543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 3563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 3573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 3583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 3593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 3613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 3623831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 3633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 365c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else if (what == ACodec::kWhatError) { 366c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGE("Received error from %s decoder, aborting playback.", 367c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 368c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 369c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 388c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 389c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 390c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 397c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 398c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGV("reached %s EOS", audio ? "audio" : "video"); 399c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 400c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGE("%s track encountered an error (0x%08x)", 401c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 402c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 403c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 404c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 405c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 41143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 41243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 41343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 41443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 4153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 4163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 41743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 41843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 41943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 42043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 4213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber driver->notifyFrameStats( 4233fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, mNumFramesDropped); 42443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 42543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 4263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (what == Renderer::kWhatFlushComplete) { 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("renderer %s flush completed.", audio ? "audio" : "video"); 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 4431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 4441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatReset"); 4451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 4471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 4481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 4491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("postponing reset"); 4511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 4531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 4571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 4621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 4661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 4671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 47343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 47443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 47543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 47643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 47743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 47822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 47943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 48043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 48143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 48243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 48343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 48443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 48543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 48643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 48743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 48843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 48943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 49043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 49143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 49243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 493b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 494b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 495b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 496b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 497b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 498b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 499b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 500b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 501b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 502b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 503b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 504b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 505b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 506b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 5143831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 5153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 5193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5213831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("both audio and video are flushed now."); 5233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mRenderer->signalTimeDiscontinuity(); 5253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 52622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 5273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 5283831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 53022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 5313831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 5323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 5353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 5381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reset completed"); 5391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 5411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 5421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 5431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 54522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 5471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 5511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 5521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 5551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mSource.clear(); 5561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 55743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 55843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 55943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 56043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 56143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 56243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 5661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 5671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 5721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 5731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5775bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 5893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber const char *mime; 5903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 5913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime); 5923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 5933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5981173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 5991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6025bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 60543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 60643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 60743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 60843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 60943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 61043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 61143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 615f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 61953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 62053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool dropAccessUnit; 6293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber do { 6303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 6315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 6323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == -EWOULDBLOCK) { 6333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return err; 6343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (err != OK) { 6353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == INFO_DISCONTINUITY) { 6363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int32_t type; 6373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 63853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 6393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool formatChange = 6403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber type == ATSParser::DISCONTINUITY_FORMATCHANGE; 64153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 6423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber LOGV("%s discontinuity (formatChange=%d)", 6433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber audio ? "audio" : "video", formatChange); 64432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 6463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 6473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 6483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 6493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 65032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber sp<AMessage> extra; 6523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 6533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && extra != NULL) { 6543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t resumeAtMediaTimeUs; 6553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (extra->findInt64( 6563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 6573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber LOGI("suppressing rendering of %s until %lld us", 6583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 6593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 6613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 6623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber resumeAtMediaTimeUs; 6633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 6643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 6653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber resumeAtMediaTimeUs; 6663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 66732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 66832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 6693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber flushDecoder(audio, formatChange); 67132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 67232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 6743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 6753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 6793fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 6803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 6813fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 6833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 6843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 6853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 6863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 6873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 6883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 6893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 6903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 69243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 6971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("feeding %s input buffer at media time %.2f secs", 698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 708f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 70943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("renderBuffer %s", audio ? "audio" : "video"); 710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 71418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 71518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 71618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 71718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 71818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 71918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 72018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber LOGV("we're still flushing the %s decoder, sending its output buffer" 72118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 72218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 72318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 72418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 72518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 72618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 73232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 73332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 73432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 73532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 73632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 73732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 73832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 73932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 74032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 74132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 74232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber LOGV("dropping %s buffer at time %lld as requested.", 74332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 74432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 74532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 74632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 74732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 74832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 74932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 75032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 75132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 75232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 756f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 75743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 76143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 76343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 76743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->sendEvent(msg, ext1, ext2); 768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 7711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 7721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 77343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 7741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 7761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 7771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 7791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 7801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 7821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 7831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 7841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 7861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 7881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 7891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 7901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 7911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 7921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 7931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 7941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 7951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 7971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 7991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 8001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 8011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 8021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 8051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 807