NuPlayer.cpp revision ea9d51bd710e6739077a3700f27a1c37767a2f6d
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 { 1633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 { 1763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 { 1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 { 1983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 2323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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) { 2883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 289dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 2903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 3093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 3123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 3333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 3583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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) { 3713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%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) { 4183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 4523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 { 4643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatReset"); 4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 466b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber if (mRenderer != NULL) { 467b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // There's an edge case where the renderer owns all output 468b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // buffers and is paused, therefore the decoder will not read 469b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // more input data and will never encounter the matching 470b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // discontinuity. To avoid this, we resume the renderer. 471b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 472b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber if (mFlushingAudio == AWAITING_DISCONTINUITY 473b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY) { 474b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber mRenderer->resume(); 475b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber } 476b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber } 477b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 4811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 482ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber ALOGV("postponing reset mFlushingAudio=%d, mFlushingVideo=%d", 483ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber mFlushingAudio, mFlushingVideo); 4841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 4861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 4901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = true; 4956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 4961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 4971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 4981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 5011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 5021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 5051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 5061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 50843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 50943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 51043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 51143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 51243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 51443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 51543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 51643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 51743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 51843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 51943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 52043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 52143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 52243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 52343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 52443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 52543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 52643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 52743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 528b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 529b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 530b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 531b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 532b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 533b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 534b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 535b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 536b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 537b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 538b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 539b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 540b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 541b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 5493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 5503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5513831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5533831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 5543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("both audio and video are flushed now."); 5583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mTimeDiscontinuityPending) { 5606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mRenderer->signalTimeDiscontinuity(); 5616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = false; 5626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 5633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 56422fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 5653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 5663831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5673831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 56822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 5693831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 5703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5723831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 5733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 5763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reset completed"); 5771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 5791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 5801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 5811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 5821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 58322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 5841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 5851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 5891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 5901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 5911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ++mScanSourcesGeneration; 5932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mScanSourcesPending = false; 5942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 5951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 5962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 5972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mSource != NULL) { 5982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource->stop(); 5992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource.clear(); 6002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 6011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 60243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 60343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 60543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 60643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 60743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 6081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 6111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 6121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 6161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 6171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 6181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 620f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6225bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 6343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber const char *mime; 6353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 6363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime); 6373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 6383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 6441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 64943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 65043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 65143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 65243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 65343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 65443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 65543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 65643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 660f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 66453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 66553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool dropAccessUnit; 6743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber do { 6753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 6765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 6773fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == -EWOULDBLOCK) { 6783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return err; 6793fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (err != OK) { 6803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == INFO_DISCONTINUITY) { 6813fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int32_t type; 6823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 68353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 6843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool formatChange = 6856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (audio && 6866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT)) 6876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber || (!audio && 6886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT)); 68953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 6906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0; 6916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 6926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber LOGI("%s discontinuity (formatChange=%d, time=%d)", 6936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", formatChange, timeChange); 69432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 6963fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 6973fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 6983fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 6993fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 70032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (timeChange) { 7026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber sp<AMessage> extra; 7036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 7046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra != NULL) { 7056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs; 7066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra->findInt64( 7076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 7086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber LOGI("suppressing rendering of %s until %lld us", 7096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 7106e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 7126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 7136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 7146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 7166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 7176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7183fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 71932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 72032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 7213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = 7236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending || timeChange; 7246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (formatChange || timeChange) { 7266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber flushDecoder(audio, formatChange); 7276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber // This stream is unaffected by the discontinuity 7296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7306e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 7316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingAudio = FLUSHED; 7326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingVideo = FLUSHED; 7346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber finishFlushIfPossible(); 7376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return -EWOULDBLOCK; 7396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 74032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 74132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 7433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 7443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 7483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 7493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 7503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 7523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 7533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 7543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 7553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 7563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 7573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 7583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 7593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 764f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 7663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("feeding %s input buffer at media time %.2f secs", 767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 777f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 7783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("renderBuffer %s", audio ? "audio" : "video"); 779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 78318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 78418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 78518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 78618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 78718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 78818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 7893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're still flushing the %s decoder, sending its output buffer" 79018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 79118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 79218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 79318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 79418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 79518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 80132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 80232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 80332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 80432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 80532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 80632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 80732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 80832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 80932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 81032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 8113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dropping %s buffer at time %lld as requested.", 81232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 81332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 81432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 81532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 81632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 81732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 81832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 81932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 82032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 82132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 825f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 82643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 83043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 83243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 836a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber driver->notifyListener(msg, ext1, ext2); 837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 8406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) { 8416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber LOGI("flushDecoder %s without decoder present", 8426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video"); 8436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 8446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 8461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 84743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 8481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 8501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 8511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 8531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 8541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 8561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 8571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 8581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 8601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 8621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 8631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 8641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 8651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 8671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 8681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 8691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 8711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 8731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 8741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 8751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 8761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 8791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 881