NuPlayer.cpp revision fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayer" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h" 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h" 2543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber#include "NuPlayerDriver.h" 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h" 275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h" 282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "RTSPSource.h" 295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h" 30afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "GenericSource.h" 31840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include "mp4/MP4Source.h" 325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h" 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <cutils/properties.h> // for property_get 363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h> 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 38f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h> 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h> 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <gui/ISurfaceTexture.h> 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h" 473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 48840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include "ESDS.h" 49840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/Utils.h> 50840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 51f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 55f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 569b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber : mUIDValid(false), 573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC(false), 589b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mAudioEOS(false), 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending(false), 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mResetPostponed(false), 673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs(-1ll), 683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs(-1ll), 693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs(0ll), 703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0ll), 718b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mNumFramesDropped(0ll) { 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 779b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 789b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 799b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 809b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 819b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 8243c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 8343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 84f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 85f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 86f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 89840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber char prop[PROPERTY_VALUE_MAX]; 90840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (property_get("media.stagefright.use-mp4source", prop, NULL) 91840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber && (!strcmp(prop, "1") || !strcasecmp(prop, "true"))) { 92840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber msg->setObject("source", new MP4Source(source)); 93840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } else { 94840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber msg->setObject("source", new StreamingSource(source)); 95840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 96840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) { 101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (!strncasecmp("http://", url, 7) 102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber || !strncasecmp("https://", url, 8)) { 103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber size_t len = strlen(url); 104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (strstr(url,"m3u8")) { 109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 111afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return false; 114afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1165bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 1175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 1185bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 120afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<Source> source; 121afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (IsHTTPLiveURL(url)) { 122afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new HTTPLiveSource(url, headers, mUIDValid, mUID); 123afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } else if (!strncasecmp(url, "rtsp://", 7)) { 124afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new RTSPSource(url, headers, mUIDValid, mUID); 1252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } else { 126afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new GenericSource(url, headers, mUIDValid, mUID); 1272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 129afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 130afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->post(); 131afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 132afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 133afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 134afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 135afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 136afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<Source> source = new GenericSource(fd, offset, length); 137afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1411173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 1421173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 1431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 1441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 1451173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 149f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 155f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 15943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 160b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 16143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 16243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 16343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 164b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 16543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 16643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 17143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 17243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 17343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 17443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 17543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 17643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 17753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 17953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 18053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 18353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 18453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 18553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 18953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 19053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 19153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 19253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 19353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 19453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 19553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 19653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 197f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetDataSource"); 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 2065bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2121173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetVideoNativeWindow"); 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 2171173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2191173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetAudioSink"); 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatStart"); 23743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = false; 2391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 2401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 24132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 24232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 2433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 2443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = 0; 2453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = 0; 2461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2475bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 2621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 2631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 2641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 2651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 2661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2685bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 2695bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 27143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 27243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2735d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George if (mNativeWindow != NULL) { 2745d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George instantiateDecoder(false, &mVideoDecoder); 2755d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George } 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 2785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 281eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber status_t err; 282eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if ((err = mSource->feedMoreTSData()) != OK) { 2831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 2841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 2851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 286eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber 287eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (err == ERROR_END_OF_STREAM) { 288eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 289eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } else { 290eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 291eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } 2921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 296fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber if ((mAudioDecoder == NULL && mAudioSink != NULL) 297fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber || (mVideoDecoder == NULL && mNativeWindow != NULL)) { 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 2995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 320eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (mSource->feedMoreTSData() == OK) { 3211183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber msg->post(10000ll); 3225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 325dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber int32_t err; 326dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber CHECK(codecRequest->findInt32("err", &err)); 327dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 328dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err == ERROR_END_OF_STREAM) { 3293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 330dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 3313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS w/ error %d", 332dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber audio ? "audio" : "video", 333dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber err); 334dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 335dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 336dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mRenderer->queueEOS(audio, err); 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 3381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 33953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 3411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 3441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 3463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 3533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initiating %s decoder shutdown", 35453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 35953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 36053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 36153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 36253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 3653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 3662c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 36731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 36831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 36931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 3702c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 37131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 37231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 3732c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 3743856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Audio output format changed to %d Hz, %d channels", 37531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 3762c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 37731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 3781948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 3791948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent audio_output_flags_t flags; 3801948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent int64_t durationUs; 3811948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // FIXME: we should handle the case where the video decoder is created after 3821948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // we receive the format change indication. Current code will just make that 3831948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // we select deep buffer with video which should not be a problem as it should 3841948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // not prevent from keeping A/V sync. 3851948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent if (mVideoDecoder == NULL && 3861948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mSource->getDuration(&durationUs) == OK && 3871948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent durationUs > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) { 3881948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER; 3891948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent } else { 3901948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags = AUDIO_OUTPUT_FLAG_NONE; 3911948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent } 3921948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 3939806555d3930be43e11106281dee354820ac1c88Andreas Huber int32_t channelMask; 3949806555d3930be43e11106281dee354820ac1c88Andreas Huber if (!codecRequest->findInt32("channel-mask", &channelMask)) { 3959806555d3930be43e11106281dee354820ac1c88Andreas Huber channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER; 3969806555d3930be43e11106281dee354820ac1c88Andreas Huber } 3979806555d3930be43e11106281dee354820ac1c88Andreas Huber 398078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 399078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 400078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 4019806555d3930be43e11106281dee354820ac1c88Andreas Huber (audio_channel_mask_t)channelMask, 402078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 4031948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 8 /* bufferCount */, 4041948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent NULL, 4051948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent NULL, 4061948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags), 407078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 40831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 4093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 41031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 41131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 41231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 41331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 41431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 41531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 41631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 41731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 41831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 41931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 42031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 42131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 42231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Video output format changed to %d x %d " 424cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 42531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 426cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropRight - cropLeft + 1), 427cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropBottom - cropTop + 1), 428cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 42931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 43031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 43131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 43231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 43331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 43431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 4353831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 4363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s shutdown completed", audio ? "audio" : "video"); 4373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 4383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 4393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 4413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 4423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 4433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 4443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 4463831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 4473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4483831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4493831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 450c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else if (what == ACodec::kWhatError) { 45129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Received error from %s decoder, aborting playback.", 452c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 453c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 454c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (what == ACodec::kWhatDrainThisBuffer) { 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("Unhandled codec notification %d.", what); 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 465f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 473c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 474c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 475c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 482c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 4833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reached %s EOS", audio ? "audio" : "video"); 484c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 48529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("%s track encountered an error (%d)", 486c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 487c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 488c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 489c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 490c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 49643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 49743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 49843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 49943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 5013fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 50343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 50443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 50543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 5063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber driver->notifyFrameStats( 5083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, mNumFramesDropped); 50943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 51043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 5113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (what == Renderer::kWhatFlushComplete) { 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 518f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong } else if (what == Renderer::kWhatVideoRenderingStart) { 519f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0); 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 5301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 5313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatReset"); 5321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 533b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber if (mRenderer != NULL) { 534b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // There's an edge case where the renderer owns all output 535b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // buffers and is paused, therefore the decoder will not read 536b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // more input data and will never encounter the matching 537b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // discontinuity. To avoid this, we resume the renderer. 538b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 539b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber if (mFlushingAudio == AWAITING_DISCONTINUITY 540b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY) { 541b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber mRenderer->resume(); 542b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber } 543b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber } 544b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 5451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 5471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 5481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 549ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber ALOGV("postponing reset mFlushingAudio=%d, mFlushingVideo=%d", 550ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber mFlushingAudio, mFlushingVideo); 5511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 5571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 5581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 5591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = true; 5626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 5641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 5651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 5681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 5691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 5721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 5731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 57543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 57643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 57743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 57843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 57943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 58143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 58243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 58343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 58443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 58543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 58643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 58743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 58843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 58943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 59043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 59143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 59243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 59343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 59443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 595b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 596b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 597b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 598b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 599b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 600b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 601b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 602b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 603b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 604b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 605b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 606b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 607b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 608b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 609f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 614f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6153831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 6163831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 6173831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 6183831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6193831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6203831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 6213831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 6223831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6233831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("both audio and video are flushed now."); 6253831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mTimeDiscontinuityPending) { 6276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mRenderer->signalTimeDiscontinuity(); 6286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = false; 6296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 6303831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 63122fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 6323831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 6333831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 63522fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 6363831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 6373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 6403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 6433856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reset completed"); 6441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 6461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 6471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 6481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 6491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 65022fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 6511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 6521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 6561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 6571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 6581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6592bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ++mScanSourcesGeneration; 6602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mScanSourcesPending = false; 6612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 6621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 6632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 6642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mSource != NULL) { 6652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource->stop(); 6662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource.clear(); 6672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 6681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 66943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 67043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 67143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 67243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 67343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 67443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 6751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 6781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 6791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 6831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 6841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 6851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6895bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 694840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<AMessage> format = mSource->getFormat(audio); 695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 696840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (format == NULL) { 697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 701840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber AString mime; 702840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber CHECK(format->findString("mime", &mime)); 703840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str()); 7043fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 7053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7101173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 7111173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 714840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber (*decoder)->configure(format); 715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 71643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 71743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 71843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 71943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 72043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 72143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 72243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 72343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 727f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 73153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 73253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool dropAccessUnit; 7413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber do { 7423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 7435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 7443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == -EWOULDBLOCK) { 7453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return err; 7463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (err != OK) { 7473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == INFO_DISCONTINUITY) { 7483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int32_t type; 7493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 75053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 7513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool formatChange = 7526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (audio && 7536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT)) 7546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber || (!audio && 7556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT)); 75653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 7576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0; 7586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 759df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("%s discontinuity (formatChange=%d, time=%d)", 7606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", formatChange, timeChange); 76132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 7633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 7643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 7653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 7663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 76732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 7686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (timeChange) { 7696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber sp<AMessage> extra; 7706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 7716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra != NULL) { 7726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs; 7736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra->findInt64( 7746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 775df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("suppressing rendering of %s until %lld us", 7766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 7776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 7796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 7806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 7816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 7836e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 7846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 7853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 78632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 78732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 7883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = 7906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending || timeChange; 7916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (formatChange || timeChange) { 7936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber flushDecoder(audio, formatChange); 7946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 7956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber // This stream is unaffected by the discontinuity 7966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 7976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 7986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingAudio = FLUSHED; 7996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 8006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingVideo = FLUSHED; 8016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 8026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber finishFlushIfPossible(); 8046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return -EWOULDBLOCK; 8066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 80732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 80832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 8093fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 8103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 8113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8143fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 8153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 8163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 8173fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 8183fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 8193fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 8203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 8213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 8223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 8233fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 8243fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 8253fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 8263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8283856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 8333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("feeding %s input buffer at media time %.2f secs", 834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8382d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", accessUnit); 839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 844f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 8453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("renderBuffer %s", audio ? "audio" : "video"); 846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 85018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 85118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 85218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 85318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 85418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 85518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 8563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're still flushing the %s decoder, sending its output buffer" 85718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 85818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 85918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 86018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 86118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 86218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 8632d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 8642d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 86632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 86732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 86832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 86932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 87032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 87132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 87232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 87332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 87432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 87532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 8763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dropping %s buffer at time %lld as requested.", 87732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 87832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 87932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 88032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 88132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 88232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 88332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 88432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 88532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 88632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 890f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 89143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 89543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 89743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 901a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber driver->notifyListener(msg, ext1, ext2); 902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 9056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) { 906df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("flushDecoder %s without decoder present", 9076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video"); 9086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 9096e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 9111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 91243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 9131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 9151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 9161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 9181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 9191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 9211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 9221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 9231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 9251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 9271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 9281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 9291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 9301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 9321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 9331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 9341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 9361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 9381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 9391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 9401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 9411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 9441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 945840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<AMessage> NuPlayer::Source::getFormat(bool audio) { 946840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<MetaData> meta = getFormatMeta(audio); 947840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 948840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (meta == NULL) { 949840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return NULL; 950840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 951840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 952840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<AMessage> msg = new AMessage; 953840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 954840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if(convertMetaDataToMessage(meta, &msg) == OK) { 955840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return msg; 956840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 957840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return NULL; 958840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber} 959840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 961