NuPlayer.cpp revision 32f3cefa373cd55e63deda36ca9d07c7fe22eaaf
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayer" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h" 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h" 2543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber#include "NuPlayerDriver.h" 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h" 275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h" 285bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h" 295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h" 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <surfaceflinger/Surface.h> 401173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 42f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber : mAudioEOS(false), 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed(false) { 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 6143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 64f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 675bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->setObject("source", new StreamingSource(source)); 685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 705bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 715bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 757314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber uint32_t flags = 0; 767314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 777314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (headers) { 787314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber ssize_t index = headers->indexOfKey(String8("x-hide-urls-from-log")); 797314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 807314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber if (index >= 0) { 817314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber flags |= HTTPLiveSource::kFlagIncognito; 827314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 837314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber } 847314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 857314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber msg->setObject("source", new HTTPLiveSource(url, flags)); 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 89f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) { 901173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 911173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surface)); 921173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->post(); 931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 951173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 961173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 971173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 981173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 103f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 114b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 11543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 11643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 11743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 118b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 11943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 12643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 12743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 12843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 12943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 13043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 13153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 13353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 13453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 13753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 13853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 13953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 14353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 14453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 14553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 14653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 14753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 14853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 14953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 15053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 151f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetDataSource"); 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 1605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1661173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1681173118eace0e9e347cb007f0da817cee87579edGlenn Kasten LOGV("kWhatSetVideoNativeWindow"); 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 1711173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetAudioSink"); 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 19043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("kWhatStart"); 19143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 1931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 19432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 19532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 1961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 1975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 2121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 2131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 2141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 2151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 2161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 2195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 22043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("scanning sources haveAudio=%d, haveVideo=%d", 22143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 22243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(false, &mVideoDecoder); 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 2265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (!mSource->feedMoreTSData()) { 2301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 2311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 2321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 2331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 2341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 2405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 2615bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mSource->feedMoreTSData()) { 2625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 2635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueEOS(audio, ERROR_END_OF_STREAM); 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 2681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 26953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 2711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 2741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("decoder %s flush completed", audio ? "audio" : "video"); 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 2811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("initiating %s decoder shutdown", 28253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 28753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 28853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 28953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 29053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 2933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 2942c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 29531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 29631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 29731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 2982c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 29931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 30031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 3012c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 30231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Audio output format changed to %d Hz, %d channels", 30331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 3042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 30531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 30631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK); 30731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 3083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 30931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 31231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 31531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 31731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 31831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 31931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 32031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 32131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 32231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Video output format changed to %d x %d " 32331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "(crop: %d, %d, %d, %d)", 32431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 32531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropLeft, cropTop, cropRight, cropBottom); 32631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 32731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 32831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 32931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 33031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 3331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s shutdown completed", audio ? "audio" : "video"); 3343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 3353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 3363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 3383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 3393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 3403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 3413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 3433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 3443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 3453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reached %s EOS", audio ? "audio" : "video"); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 37743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 37843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 37943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 38043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 38143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 38243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 38343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 38443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 38543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 38643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("renderer %s flush completed.", audio ? "audio" : "video"); 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 4041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 4051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatReset"); 4061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 4081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 4091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 4101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("postponing reset"); 4121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 4141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 4181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 4231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 4241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 4271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 4281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 4311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 43443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 43543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 43643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 43743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 43843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 43922fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 44043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 44143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 44243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 44343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 44443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 44543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 44643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 44743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 44843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 44943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 45043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 45143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 45243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 45343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 454b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 455b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 456b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 457b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 458b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 459b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 460b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 461b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 462b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 463b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 464b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 465b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 466b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 467b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4743831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 4753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 4763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 4803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("both audio and video are flushed now."); 4843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mRenderer->signalTimeDiscontinuity(); 4863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 48722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 4883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 4893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4903831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 49122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 4923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 4933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4943831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4953831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 4963831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 4991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reset completed"); 5001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 5021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 5031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 5041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 5051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 50622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 5071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 5081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 5121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 5131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 5141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 5161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mSource.clear(); 5171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 51843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 51943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 52043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 52143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 52243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 52343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 5241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 5271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 5281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 5321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 5331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 5341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5385bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 549f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 5541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 55943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 56043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 56143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 56243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 56343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 56443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 56643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 57553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 579f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 581f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 5825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == -EWOULDBLOCK) { 585f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (err != OK) { 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == INFO_DISCONTINUITY) { 5885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber int32_t type; 5895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 5905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 5915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber bool formatChange = 5925bc087c573c70c84c6a39946457590b42d392a33Andreas Huber type == ATSParser::DISCONTINUITY_FORMATCHANGE; 59353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 5941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s discontinuity (formatChange=%d)", 59553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video", formatChange); 59653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 59732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (audio) { 59832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 59932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } else { 60032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 60132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 60232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 60332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber sp<AMessage> extra; 60432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 60532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber && extra != NULL) { 60632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t resumeAtMediaTimeUs; 60732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (extra->findInt64( 60832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 60932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber LOGI("suppressing rendering of %s until %lld us", 61032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 61132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 61232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (audio) { 61332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = 61432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber resumeAtMediaTimeUs; 61532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } else { 61632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = 61732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber resumeAtMediaTimeUs; 61832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 61932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 62032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 62132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(audio, formatChange); 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", err); 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 63043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 6351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("feeding %s input buffer at media time %.2f secs", 636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 646f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 64743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("renderBuffer %s", audio ? "audio" : "video"); 648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 65732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 65832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 65932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 66032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 66132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 66232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 66332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 66432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 66532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 66632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 66732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber LOGV("dropping %s buffer at time %lld as requested.", 66832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 66932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 67032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 67132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 67232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 67332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 67432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 67532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 67632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 67732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 681f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 68243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 68643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 68843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 689f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 69243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->sendEvent(msg, ext1, ext2); 693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 694f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 6961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 6971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 69843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 6991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 7011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 7021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 7041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 7051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 7071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 7081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 7091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 7111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 7131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 7141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 7151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 7161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 7171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 7181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 7191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 7201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 7221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 7241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 7251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 7261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 7271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 7281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 7291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 7301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 732