NuPlayer.cpp revision 6e3d311b6631b12aac2879d1b08c3534aece78b1
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" 282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "RTSPSource.h" 295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h" 305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h" 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h> 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h> 421173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h" 453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 46f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber : mUIDValid(false), 523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC(false), 539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mAudioEOS(false), 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending(false), 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mResetPostponed(false), 623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs(-1ll), 633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs(-1ll), 643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs(0ll), 653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0ll), 663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped(0ll) { 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 69f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 7743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 7843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 81f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->setObject("source", new StreamingSource(source)); 855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 885bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (!strncasecmp(url, "rtsp://", 7)) { 932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber msg->setObject( 942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber "source", new RTSPSource(url, headers, mUIDValid, mUID)); 952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } else { 962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber msg->setObject( 972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber "source", new HTTPLiveSource(url, headers, mUIDValid, mUID)); 982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1031173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 1041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 1051173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 1061173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 1071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 111f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 117f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 12143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 122b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 126b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 12743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 12843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 13343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 13443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 13543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 13643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 13743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 13843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 13953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 14153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 14253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 14553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 14653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 14753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 15153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 15253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 15353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 15453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 15553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 15653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 15753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 15853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 159f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetDataSource"); 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 1685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1741173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1761173118eace0e9e347cb007f0da817cee87579edGlenn Kasten LOGV("kWhatSetVideoNativeWindow"); 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 1791173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1811173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetAudioSink"); 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 19843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("kWhatStart"); 19943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = false; 2011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 2021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 20332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 20432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 2053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 2063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = 0; 2073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = 0; 2081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 2241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 2251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 2261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 2271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 2281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 2315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 23243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("scanning sources haveAudio=%d, haveVideo=%d", 23343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 23443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(false, &mVideoDecoder); 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 2385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 241eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber status_t err; 242eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if ((err = mSource->feedMoreTSData()) != OK) { 2431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 2441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 2451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 246eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber 247eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (err == ERROR_END_OF_STREAM) { 248eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 249eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } else { 250eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 251eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } 2521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 2585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 279eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (mSource->feedMoreTSData() == OK) { 2801183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber msg->post(10000ll); 2815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 284dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber int32_t err; 285dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber CHECK(codecRequest->findInt32("err", &err)); 286dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 287dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err == ERROR_END_OF_STREAM) { 288dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber LOGV("got %s decoder EOS", audio ? "audio" : "video"); 289dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 290dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber LOGV("got %s decoder EOS w/ error %d", 291dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber audio ? "audio" : "video", 292dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber err); 293dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 294dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 295dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mRenderer->queueEOS(audio, err); 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 2971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 29853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 3001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 3031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 3053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("decoder %s flush completed", audio ? "audio" : "video"); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 3121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("initiating %s decoder shutdown", 31353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 31853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 31953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 32053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 32153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 3252c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 32631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 32731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 32831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 3292c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 33031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 3322c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Audio output format changed to %d Hz, %d channels", 33431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 3352c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 33631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 337078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 338078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 339078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 340078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 341078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber 8 /* bufferCount */), 342078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 34331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 3443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 34531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 34631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 34731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 34831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 34931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 35031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 35131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 35231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 35331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 35431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 35531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 35631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 35731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 35831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Video output format changed to %d x %d " 359cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 36031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 361cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropRight - cropLeft + 1), 362cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropBottom - cropTop + 1), 363cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 36431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 36531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 36631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 36731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 36831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 36931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 3711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s shutdown completed", audio ? "audio" : "video"); 3723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 3733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 3743831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 3763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 3773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 3783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 3793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 3813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 3823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 3833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 385c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else if (what == ACodec::kWhatError) { 386c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGE("Received error from %s decoder, aborting playback.", 387c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 388c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 389c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 408c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 409c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 410c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 417c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 418c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGV("reached %s EOS", audio ? "audio" : "video"); 419c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 420dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber LOGE("%s track encountered an error (%d)", 421c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 422c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 423c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 424c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 425c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 43143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 43243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 43343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 43443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 4353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 4363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 43743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 43843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 43943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 44043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 4413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber driver->notifyFrameStats( 4433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, mNumFramesDropped); 44443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 44543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 4463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (what == Renderer::kWhatFlushComplete) { 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("renderer %s flush completed.", audio ? "audio" : "video"); 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 4641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatReset"); 4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 4671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 4681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 4691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("postponing reset"); 4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 4731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = true; 4826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 4831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 4841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 4851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 4881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 4891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 4921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 49543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 49643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 49743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 49843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 49943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 50022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 50143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 50343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 50443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 50543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 50643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 50743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 50843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 50943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 51043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 51143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 51243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 51343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 51443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 515b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 516b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 517b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 518b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 519b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 520b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 521b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 522b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 523b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 524b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 525b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 526b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 527b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 528b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 5363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 5373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 5413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("both audio and video are flushed now."); 5453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mTimeDiscontinuityPending) { 5476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mRenderer->signalTimeDiscontinuity(); 5486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = false; 5496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 5503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 55122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 5523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 5533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 55522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 5563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 5573831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 5603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reset completed"); 5641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 5661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 5671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 5681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 5691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 57022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 5721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 5761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 5771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 5781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ++mScanSourcesGeneration; 5802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mScanSourcesPending = false; 5812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 5821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 5832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 5842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mSource != NULL) { 5852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource->stop(); 5862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource.clear(); 5872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 5881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 58943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 59043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 59143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 59243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 59343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 59443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 5951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 5981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 5991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 6031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 6041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 6051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 607f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6095bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 618f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 6213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber const char *mime; 6223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 6233fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime); 6243fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 6253fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6301173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 6311173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 63643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 63743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 63843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 63943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 64043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 64143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 64243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 64343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 647f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 65153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 65253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool dropAccessUnit; 6613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber do { 6623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 6635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 6643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == -EWOULDBLOCK) { 6653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return err; 6663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (err != OK) { 6673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == INFO_DISCONTINUITY) { 6683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int32_t type; 6693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 67053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 6713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool formatChange = 6726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (audio && 6736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT)) 6746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber || (!audio && 6756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT)); 67653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 6776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0; 6786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 6796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber LOGI("%s discontinuity (formatChange=%d, time=%d)", 6806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", formatChange, timeChange); 68132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 6833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 6843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 6853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 6863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 68732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (timeChange) { 6896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber sp<AMessage> extra; 6906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 6916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra != NULL) { 6926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs; 6936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra->findInt64( 6946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 6956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber LOGI("suppressing rendering of %s until %lld us", 6966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 6976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 6986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 6996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 7006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 7016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 7036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 7046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 70632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 70732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 7083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = 7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending || timeChange; 7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (formatChange || timeChange) { 7136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber flushDecoder(audio, formatChange); 7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber // This stream is unaffected by the discontinuity 7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 7186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingAudio = FLUSHED; 7196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingVideo = FLUSHED; 7216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber finishFlushIfPossible(); 7246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return -EWOULDBLOCK; 7266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 72732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 72832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 7303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 7313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 7353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 7363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 7373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 7393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 7403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 7413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 7423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 7433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 7443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 7453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 7463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 7531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("feeding %s input buffer at media time %.2f secs", 754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 764f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 76543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("renderBuffer %s", audio ? "audio" : "video"); 766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 77018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 77118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 77218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 77318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 77418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 77518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 77618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber LOGV("we're still flushing the %s decoder, sending its output buffer" 77718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 77818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 77918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 78018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 78118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 78218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 78832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 78932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 79032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 79132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 79232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 79332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 79432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 79532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 79632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 79732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 79832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber LOGV("dropping %s buffer at time %lld as requested.", 79932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 80032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 80132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 80232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 80332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 80432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 80532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 80632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 80732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 80832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 812f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 81343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 81743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 81943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 823a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber driver->notifyListener(msg, ext1, ext2); 824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 8276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) { 8286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber LOGI("flushDecoder %s without decoder present", 8296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video"); 8306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 8316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 8331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 83443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 8351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 8371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 8381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 8401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 8411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 8431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 8441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 8451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 8471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 8491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 8501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 8511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 8521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 8541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 8551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 8561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 8581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 8601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 8611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 8621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 8631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 8661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 868