NuPlayer.cpp revision 4110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652f
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" 30afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "GenericSource.h" 315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h" 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h> 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h> 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 424110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen#include <media/stagefright/SkipCutBuffer.h> 431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h" 463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 47f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber : mUIDValid(false), 533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC(false), 549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mAudioEOS(false), 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending(false), 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mResetPostponed(false), 633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs(-1ll), 643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs(-1ll), 653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs(0ll), 663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0ll), 674110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mNumFramesDropped(0ll), 684110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mSkipCutBuffer(NULL) { 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 71f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 724110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen delete mSkipCutBuffer; 734110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mSkipCutBuffer = NULL; 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 779b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 789b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 799b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 809b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 8143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 8243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 85f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->setObject("source", new StreamingSource(source)); 895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 92afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) { 93afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (!strncasecmp("http://", url, 7) 94afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber || !strncasecmp("https://", url, 8)) { 95afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber size_t len = strlen(url); 96afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 98afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (strstr(url,"m3u8")) { 101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return false; 106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1085bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 1095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 1105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<Source> source; 113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (IsHTTPLiveURL(url)) { 114afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new HTTPLiveSource(url, headers, mUIDValid, mUID); 115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } else if (!strncasecmp(url, "rtsp://", 7)) { 116afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new RTSPSource(url, headers, mUIDValid, mUID); 1172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } else { 118afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new GenericSource(url, headers, mUIDValid, mUID); 1192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 121afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 122afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->post(); 123afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 124afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 125afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 126afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 127afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 128afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<Source> source = new GenericSource(fd, offset, length); 129afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1331173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 1341173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 1351173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 1361173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 1371173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 141f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 147f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 15143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 152b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 15343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 15443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 15543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 156b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 15743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 15843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 16343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 16443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 16543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 16643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 16743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 16843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 16953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 17153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 17253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 17553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 17653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 17753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 18153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 18253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 18353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 18453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 18553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 18653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 18753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 18853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetDataSource"); 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 1985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2041173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetVideoNativeWindow"); 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 2091173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetAudioSink"); 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatStart"); 22943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = false; 2311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 2321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 23332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 23432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 2353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 2363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = 0; 2373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = 0; 2381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2395bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2414110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen sp<MetaData> meta = mSource->getFormat(true /* audio */); 2424110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (meta != NULL) { 2434110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen int32_t delay = 0; 2444110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (!meta->findInt32(kKeyEncoderDelay, &delay)) { 2454110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen delay = 0; 2464110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen } 2474110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen int32_t padding = 0; 2484110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (!meta->findInt32(kKeyEncoderPadding, &padding)) { 2494110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen padding = 0; 2504110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen } 2514110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen int32_t numchannels = 0; 2524110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (delay + padding) { 2534110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (meta->findInt32(kKeyChannelCount, &numchannels)) { 2544110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen size_t frameSize = numchannels * sizeof(int16_t); 2554110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (mSkipCutBuffer) { 2564110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen size_t prevbuffersize = mSkipCutBuffer->size(); 2574110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (prevbuffersize != 0) { 2584110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen ALOGW("Replacing SkipCutBuffer holding %d bytes", prevbuffersize); 2594110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen } 2604110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen delete mSkipCutBuffer; 2614110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen } 2624110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mSkipCutBuffer = new SkipCutBuffer(delay * frameSize, padding * frameSize); 2634110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen } 2644110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen } 2654110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen } 2664110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 2811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 2821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 2831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 2841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 2875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 28943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 29043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(false, &mVideoDecoder); 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 2945bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 297eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber status_t err; 298eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if ((err = mSource->feedMoreTSData()) != OK) { 2991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 3001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 3011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 302eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber 303eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (err == ERROR_END_OF_STREAM) { 304eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 305eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } else { 306eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 307eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } 3081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 3145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3345bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 335eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (mSource->feedMoreTSData() == OK) { 3361183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber msg->post(10000ll); 3375bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 340dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber int32_t err; 341dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber CHECK(codecRequest->findInt32("err", &err)); 342dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 343dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err == ERROR_END_OF_STREAM) { 3443856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 345dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 3463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS w/ error %d", 347dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber audio ? "audio" : "video", 348dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber err); 349dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 350dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 351dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mRenderer->queueEOS(audio, err); 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 3531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 35453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 3561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 3591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 3613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 3683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initiating %s decoder shutdown", 36953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 37153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 37353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 37453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 37553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 37653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 37753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 3812c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 38231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 38331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 38431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 3852c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 38631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 38731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 3882c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 3893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Audio output format changed to %d Hz, %d channels", 39031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 3912c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 39231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 393078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 394078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 395078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 396786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi CHANNEL_MASK_USE_CHANNEL_ORDER, 397078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 398078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber 8 /* bufferCount */), 399078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 40031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 4013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 40231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 40331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 40431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 40531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 40631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 40731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 40831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 40931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 41031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 41131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 41231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 41331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 41431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Video output format changed to %d x %d " 416cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 41731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 418cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropRight - cropLeft + 1), 419cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropBottom - cropTop + 1), 420cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 42131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 42231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 42331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 42431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 42531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 42631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 4273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 4283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s shutdown completed", audio ? "audio" : "video"); 4293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 4303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 4313831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 4333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 4343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 4353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 4363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 4383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 4393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 442c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else if (what == ACodec::kWhatError) { 44329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Received error from %s decoder, aborting playback.", 444c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 445c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 446c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (what == ACodec::kWhatDrainThisBuffer) { 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("Unhandled codec notification %d.", what); 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 465c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 466c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 467c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 474c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 4753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reached %s EOS", audio ? "audio" : "video"); 476c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 47729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("%s track encountered an error (%d)", 478c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 479c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 480c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 481c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 482c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 48843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 48943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 49043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 49143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 4923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 4933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 49443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 49543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 49643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 49743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 4983fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4993fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber driver->notifyFrameStats( 5003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, mNumFramesDropped); 50143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 5033fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (what == Renderer::kWhatFlushComplete) { 504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5093856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 5201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 5213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatReset"); 5221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 523b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber if (mRenderer != NULL) { 524b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // There's an edge case where the renderer owns all output 525b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // buffers and is paused, therefore the decoder will not read 526b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // more input data and will never encounter the matching 527b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // discontinuity. To avoid this, we resume the renderer. 528b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 529b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber if (mFlushingAudio == AWAITING_DISCONTINUITY 530b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY) { 531b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber mRenderer->resume(); 532b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber } 533b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber } 534b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 5351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 5361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 5371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 5381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 539ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber ALOGV("postponing reset mFlushingAudio=%d, mFlushingVideo=%d", 540ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber mFlushingAudio, mFlushingVideo); 5411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 5431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 5471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 5481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 5491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = true; 5526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 5551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 5581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 5591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 5621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 56643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 56743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 56843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 56943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 57143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 57243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 57343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 57443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 57543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 57643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 57743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 57843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 57943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 58043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 58143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 58243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 58343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 58443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 585b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 586b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 587b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 588b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 589b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 590b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 591b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 592b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 593b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 594b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 595b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 596b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 597b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 598b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 601f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 6063831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 6073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 6083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6103831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 6113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 6123831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("both audio and video are flushed now."); 6153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mTimeDiscontinuityPending) { 6176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mRenderer->signalTimeDiscontinuity(); 6186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = false; 6196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 6203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 62122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 6223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 6233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6243831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 62522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 6263831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 6273831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6283831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6293831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 6303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 6333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reset completed"); 6341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 6361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 6371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 6381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 6391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 64022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 6411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 6421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 6461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 6471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 6481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ++mScanSourcesGeneration; 6502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mScanSourcesPending = false; 6512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 6521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 6532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 6542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mSource != NULL) { 6552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource->stop(); 6562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource.clear(); 6572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 6581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 65943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 66043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 66143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 66243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 66343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 66443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 6651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 6681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 6691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 6731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 6741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 6751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6795bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 6913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber const char *mime; 6923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(meta->findCString(kKeyMIMEType, &mime)); 6933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime); 6943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 6953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 7011173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7045bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 705f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 70643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 70743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 70843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 70943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 71043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 71143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 71243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 71343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 717f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 72153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 72253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool dropAccessUnit; 7313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber do { 7323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 7335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 7343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == -EWOULDBLOCK) { 7353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return err; 7363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (err != OK) { 7373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == INFO_DISCONTINUITY) { 7383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int32_t type; 7393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 74053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 7413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool formatChange = 7426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (audio && 7436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT)) 7446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber || (!audio && 7456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT)); 74653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 7476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0; 7486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 749df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("%s discontinuity (formatChange=%d, time=%d)", 7506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", formatChange, timeChange); 75132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 7533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 7543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 7553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 7563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 75732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (timeChange) { 7596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber sp<AMessage> extra; 7606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 7616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra != NULL) { 7626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs; 7636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra->findInt64( 7646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 765df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("suppressing rendering of %s until %lld us", 7666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 7676e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 7696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 7706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 7716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 7736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 7746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 77632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 77732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 7783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = 7806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending || timeChange; 7816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (formatChange || timeChange) { 7836e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber flushDecoder(audio, formatChange); 7846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber // This stream is unaffected by the discontinuity 7866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 7886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingAudio = FLUSHED; 7896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingVideo = FLUSHED; 7916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber finishFlushIfPossible(); 7946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return -EWOULDBLOCK; 7966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 79732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 79832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7993fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 8003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 8013fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8043fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 8053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 8063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 8073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 8083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 8093fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 8103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 8113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 8123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 8133fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 8143fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 8153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 8163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8183856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 8233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("feeding %s input buffer at media time %.2f secs", 824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8282d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", accessUnit); 829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 834f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 8353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("renderBuffer %s", audio ? "audio" : "video"); 836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 84018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 84118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 84218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 84318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 84418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 84518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 8463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're still flushing the %s decoder, sending its output buffer" 84718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 84818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 84918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 85018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 85118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 85218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 8532d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 8542d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 85632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 85732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 85832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 85932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 86032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 86132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 86232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 86332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 86432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 86532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 8663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dropping %s buffer at time %lld as requested.", 86732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 86832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 86932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 87032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 87132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 87232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 87332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 87432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 87532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 87632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 8774110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen if (audio && mSkipCutBuffer) { 8784110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen mSkipCutBuffer->submit(buffer); 8794110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen } 8804110c101c3d0dd8dbc44c8d2d0edd3e2e7d6652fMarco Nelissen 881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 884f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 88543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 88943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 89143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 895a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber driver->notifyListener(msg, ext1, ext2); 896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 8996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) { 900df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("flushDecoder %s without decoder present", 9016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video"); 9026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 9036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 9051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 90643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 9071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 9091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 9101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 9121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 9131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 9151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 9161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 9171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 9191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 9211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 9221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 9231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 9241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 9261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 9271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 9281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 9301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 9321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 9331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 9341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 9351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 9381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 940