NuPlayer.cpp revision 3856b090cd04ba5dd4a59a12430ed724d5995909
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), 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mResetPostponed(false), 613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs(-1ll), 623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs(-1ll), 633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs(0ll), 643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0ll), 653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped(0ll) { 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 68f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 7643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 7743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 80f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 81f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->setObject("source", new StreamingSource(source)); 845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 875bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (!strncasecmp(url, "rtsp://", 7)) { 922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber msg->setObject( 932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber "source", new RTSPSource(url, headers, mUIDValid, mUID)); 942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } else { 952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber msg->setObject( 962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber "source", new HTTPLiveSource(url, headers, mUIDValid, mUID)); 972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 102f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) { 1031173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 1041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surface)); 1051173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->post(); 1061173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1071173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1081173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 1091173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 1101173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 1111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 1121173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 116f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 122f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 12643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 127b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 12843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 12943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 13043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 131b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 13243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 13343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 13843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 13943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 14043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 14143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 14243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 14343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 14453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 14653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 14753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 15053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 15153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 15253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 15653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 15753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 15853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 15953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 16053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 16153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 16253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 16353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 164f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetDataSource"); 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 1735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1791173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1813856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetVideoNativeWindow"); 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 1841173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1861173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetAudioSink"); 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatStart"); 20443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = false; 2061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 2071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 20832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 20932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 2103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 2113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = 0; 2123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = 0; 2131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 2291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 2301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 2311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 2321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 2331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 2365bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 23843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 23943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(false, &mVideoDecoder); 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 2435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 246eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber status_t err; 247eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if ((err = mSource->feedMoreTSData()) != OK) { 2481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 2491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 2501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 251eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber 252eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (err == ERROR_END_OF_STREAM) { 253eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 254eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } else { 255eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 256eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } 2571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 2635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 284eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (mSource->feedMoreTSData() == OK) { 2855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 2865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 289dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber int32_t err; 290dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber CHECK(codecRequest->findInt32("err", &err)); 291dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 292dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err == ERROR_END_OF_STREAM) { 2933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 294dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 2953856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS w/ error %d", 296dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber audio ? "audio" : "video", 297dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber err); 298dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 299dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 300dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mRenderer->queueEOS(audio, err); 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 3021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 30353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 3051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 3081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 3103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 3173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initiating %s decoder shutdown", 31853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 32353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 32453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 32553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 32653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3283831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 3302c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 33231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 3342c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 33531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 33631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 3372c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 3383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Audio output format changed to %d Hz, %d channels", 33931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 3402c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 34131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 342078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 343078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 344078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 345078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 346078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber 8 /* bufferCount */), 347078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 34831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 3493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 35031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 35131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 35231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 35331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 35431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 35531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 35631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 35731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 35831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 35931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 36031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 36131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 36231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Video output format changed to %d x %d " 364cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 36531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 366cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropRight - cropLeft + 1), 367cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropBottom - cropTop + 1), 368cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 36931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 37031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 37131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 37231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 37331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 37431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 3763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s shutdown completed", audio ? "audio" : "video"); 3773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 3783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 3793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 3813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 3823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 3833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 3843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 3863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 3873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 3883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 390c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else if (what == ACodec::kWhatError) { 391c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGE("Received error from %s decoder, aborting playback.", 392c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 393c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 394c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 413c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 414c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 415c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 422c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 4233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reached %s EOS", audio ? "audio" : "video"); 424c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 425dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber LOGE("%s track encountered an error (%d)", 426c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 427c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 428c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 429c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 430c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 43643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 43743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 43843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 43943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 4403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 4413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 44243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 44343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 44443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 44543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 4463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber driver->notifyFrameStats( 4483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, mNumFramesDropped); 44943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 45043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 4513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (what == Renderer::kWhatFlushComplete) { 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 4681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 4693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatReset"); 4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 4731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("postponing reset"); 4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 4821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 4871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 4881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 4911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 4921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 4951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 49843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 49943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 50043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 50143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 50443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 50543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 50643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 50743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 50843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 50943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 51043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 51143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 51243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 51343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 51443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 51543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 51643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 51743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 518b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 519b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 520b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 521b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 522b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 523b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 524b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 525b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 526b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 527b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 528b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 529b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 530b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 531b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 5393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 5403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 5443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5473856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("both audio and video are flushed now."); 5483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mRenderer->signalTimeDiscontinuity(); 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) { 5633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 = 6723fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber type == ATSParser::DISCONTINUITY_FORMATCHANGE; 67353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 6743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s discontinuity (formatChange=%d)", 6753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber audio ? "audio" : "video", formatChange); 67632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6773fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 6783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 6793fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 6803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 6813fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 68232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber sp<AMessage> extra; 6843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 6853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && extra != NULL) { 6863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t resumeAtMediaTimeUs; 6873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (extra->findInt64( 6883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 6893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber LOGI("suppressing rendering of %s until %lld us", 6903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 6913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 6933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 6943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber resumeAtMediaTimeUs; 6953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 6963fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 6973fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber resumeAtMediaTimeUs; 6983fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 69932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 70032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 7013fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7023fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber flushDecoder(audio, formatChange); 70332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 70432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 7063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 7073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 7113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 7123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 7133fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7143fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 7153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 7163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 7173fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 7183fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 7193fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 7203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 7213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 7223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 7293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("feeding %s input buffer at media time %.2f secs", 730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 740f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 7413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("renderBuffer %s", audio ? "audio" : "video"); 742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 74718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 74818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 74918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 75018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 75118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 7523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're still flushing the %s decoder, sending its output buffer" 75318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 75418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 75518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 75618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 75718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 75818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 76432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 76532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 76632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 76732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 76832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 76932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 77032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 77132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 77232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 77332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 7743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dropping %s buffer at time %lld as requested.", 77532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 77632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 77732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 77832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 77932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 78032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 78132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 78232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 78332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 78432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 788f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 78943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 79343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 79543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 79943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->sendEvent(msg, ext1, ext2); 800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 8031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 8041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 80543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 8061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 8081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 8091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 8111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 8121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 8141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 8151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 8161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 8181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 8201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 8211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 8221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 8231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 8251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 8261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 8271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 8291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 8311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 8321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 8331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 8341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 8371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 839