NuPlayer.cpp revision 078cfcf7cce9185ec7559910d08b0bc02bfc88a3
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() 479b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber : mUIDValid(false), 489b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mAudioEOS(false), 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 505bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed(false) { 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 619b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 629b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 639b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 649b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 659b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 6643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 6743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 70f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->setObject("source", new StreamingSource(source)); 745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 755bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 775bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 795bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 819b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber msg->setObject("source", new HTTPLiveSource(url, headers, mUIDValid, mUID)); 82f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 83f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 85f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setVideoSurface(const sp<Surface> &surface) { 861173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 871173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surface)); 881173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->post(); 891173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 901173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 911173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 921173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 931173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 941173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 951173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 99f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 105f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 110b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 11143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 11243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 11343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 114b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 11543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 11643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 12143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 12243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 12543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 12643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 12753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 12953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 13053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 13353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 13453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 13553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 13953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 14053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 14153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 14253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 14353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 14453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 14553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 14653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 147f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetDataSource"); 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 1565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1621173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1641173118eace0e9e347cb007f0da817cee87579edGlenn Kasten LOGV("kWhatSetVideoNativeWindow"); 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 1671173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1691173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 1751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatSetAudioSink"); 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 18643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("kWhatStart"); 18743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 1891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 19032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 19132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 1921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 1935bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 2081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 2091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 2101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 2111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 2121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2145bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 2155bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 21643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber LOGV("scanning sources haveAudio=%d, haveVideo=%d", 21743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 21843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(false, &mVideoDecoder); 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 2225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (!mSource->feedMoreTSData()) { 2261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 2271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 2281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 2291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 2301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 2365bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2565bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 2575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (mSource->feedMoreTSData()) { 2585bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 2595bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueEOS(audio, ERROR_END_OF_STREAM); 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 2641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 26553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 2671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 2701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("decoder %s flush completed", audio ? "audio" : "video"); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 2771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("initiating %s decoder shutdown", 27853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 28353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 28453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 28553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 28653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 2893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 2902c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 29131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 29231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 29331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 2942c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 29531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 29631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 2972c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 29831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Audio output format changed to %d Hz, %d channels", 29931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 3002c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 30131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 302078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 303078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 304078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 305078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 306078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber 8 /* bufferCount */), 307078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 30831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 3093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 31031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 31131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 31231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 31331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 31431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 31531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 31631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 31731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 31831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 31931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 32031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 32131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 32231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 32331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber LOGV("Video output format changed to %d x %d " 324cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 32531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 326cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropRight - cropLeft + 1), 327cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropBottom - cropTop + 1), 328cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 32931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 33031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 33131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 33231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 33331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 33431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 3361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s shutdown completed", audio ? "audio" : "video"); 3373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 3383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 3393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 3413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 3423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 3433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 3443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 3463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 3473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 3483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 350c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else if (what == ACodec::kWhatError) { 351c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGE("Received error from %s decoder, aborting playback.", 352c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 353c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 354c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 373c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 374c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 375c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 382c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 383c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGV("reached %s EOS", audio ? "audio" : "video"); 384c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 385c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber LOGE("%s track encountered an error (0x%08x)", 386c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 387c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 388c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 389c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 390c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 39643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 39743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 39843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 39943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 40043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 40143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 40243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 40343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 40443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 40543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("renderer %s flush completed.", audio ? "audio" : "video"); 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 4231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 4241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("kWhatReset"); 4251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 4271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 4281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 4291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("postponing reset"); 4311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 4331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 4371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 4381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 4421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 4431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 4461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 4471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 4501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 45343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 45443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 45543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 45643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 45743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 45822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber LOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 45943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 46043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 46143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 46243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 46343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 46443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 46543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 46643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 46743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 46843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 46943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 47043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 47143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 47243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 473b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 474b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 475b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 476b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 477b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 478b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 479b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 480b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 481b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 482b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 483b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 484b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 485b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 486b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4933831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 4943831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 4953831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 4963831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4973831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4983831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 4993831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 5003831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("both audio and video are flushed now."); 5033831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5043831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mRenderer->signalTimeDiscontinuity(); 5053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 50622fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 5073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 5083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 51022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 5113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 5123831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 5133831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5143831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 5153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 5181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("reset completed"); 5191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 5211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 5221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 5231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 5241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 52522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 5261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 5271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 5311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 5321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 5331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 5351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mSource.clear(); 5361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 53743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 53843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 53943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 54043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 54143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 54243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 5431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 5471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 5511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 5521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5575bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<MetaData> meta = mSource->getFormat(audio); 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (meta == NULL) { 565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5721173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 5731173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber (*decoder)->configure(meta); 577f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 57943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 58043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 58143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 58243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 58343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 58443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 58543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 587f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 588f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 589f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 592f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 59453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 595f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 596f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 597f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 599f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 600f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 6015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 602f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 603f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == -EWOULDBLOCK) { 604f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 605f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (err != OK) { 606f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err == INFO_DISCONTINUITY) { 6075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber int32_t type; 6085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 6095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 6105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber bool formatChange = 6115bc087c573c70c84c6a39946457590b42d392a33Andreas Huber type == ATSParser::DISCONTINUITY_FORMATCHANGE; 61253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 6131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("%s discontinuity (formatChange=%d)", 61453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video", formatChange); 61553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 61632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (audio) { 61732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 61832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } else { 61932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 62032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 62132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 62232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber sp<AMessage> extra; 62332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 62432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber && extra != NULL) { 62532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t resumeAtMediaTimeUs; 62632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (extra->findInt64( 62732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 62832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber LOGI("suppressing rendering of %s until %lld us", 62932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 63032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 63132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (audio) { 63232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = 63332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber resumeAtMediaTimeUs; 63432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } else { 63532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = 63632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber resumeAtMediaTimeUs; 63732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 63832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 63932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 64032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 6411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(audio, formatChange); 642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", err); 645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 64943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 6541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber LOGV("feeding %s input buffer at media time %.2f secs", 655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setObject("buffer", accessUnit); 660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 664f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 665f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 66643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber // LOGV("renderBuffer %s", audio ? "audio" : "video"); 667f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 668f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 67118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 67218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 67318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 67418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 67518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 67618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 67718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber LOGV("we're still flushing the %s decoder, sending its output buffer" 67818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 67918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 68018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 68118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 68218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 68318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("buffer", &obj)); 686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get()); 688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 68932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 69032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 69132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 69232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 69332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 69432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 69532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 69632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 69732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 69832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 69932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber LOGV("dropping %s buffer at time %lld as requested.", 70032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 70132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 70232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 70332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 70432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 70532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 70632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 70732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 70832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 70932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 713f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 71443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 71843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 72043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 72443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->sendEvent(msg, ext1, ext2); 725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 7281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 7291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 73043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 7311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 7331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 7341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 7361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 7371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 7391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 7401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 7411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 7431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 7451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 7461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 7471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 7481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 7491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 7501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 7511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 7521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 7541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 7561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 7571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 7581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 7591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 7601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 7611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 7621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 764