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), 62b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber mPollDurationGeneration(0), 636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending(false), 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress(false), 673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mResetPostponed(false), 683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs(-1ll), 693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs(-1ll), 703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs(0ll), 713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0ll), 720d268a3cae145afb2720c88ae38fb81550be5584James Dong mNumFramesDropped(0ll), 730d268a3cae145afb2720c88ae38fb81550be5584James Dong mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW) { 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 75f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 76f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 799b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 809b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 819b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 829b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 839b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 8443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 8543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 86f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 88f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setDataSource(const sp<IStreamSource> &source) { 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 91840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber char prop[PROPERTY_VALUE_MAX]; 92840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (property_get("media.stagefright.use-mp4source", prop, NULL) 93840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber && (!strcmp(prop, "1") || !strcasecmp(prop, "true"))) { 94840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber msg->setObject("source", new MP4Source(source)); 95840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } else { 96840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber msg->setObject("source", new StreamingSource(source)); 97840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 98840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 995bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 1005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) { 103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (!strncasecmp("http://", url, 7) 104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber || !strncasecmp("https://", url, 8)) { 105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber size_t len = strlen(url); 106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (strstr(url,"m3u8")) { 111afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 112afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 113afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 114afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 115afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return false; 116afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 117afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1185bc087c573c70c84c6a39946457590b42d392a33Andreas Hubervoid NuPlayer::setDataSource( 1195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 1205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 122afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<Source> source; 123afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (IsHTTPLiveURL(url)) { 124afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new HTTPLiveSource(url, headers, mUIDValid, mUID); 125afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } else if (!strncasecmp(url, "rtsp://", 7)) { 126afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new RTSPSource(url, headers, mUIDValid, mUID); 1272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } else { 128afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber source = new GenericSource(url, headers, mUIDValid, mUID); 1292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 1302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 131afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 132afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->post(); 133afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 134afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 135afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Hubervoid NuPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 136afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 137afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 138afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<Source> source = new GenericSource(fd, offset, length); 139afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1431173118eace0e9e347cb007f0da817cee87579edGlenn Kastenvoid NuPlayer::setVideoSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture) { 1441173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 1451173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<SurfaceTextureClient> surfaceTextureClient(surfaceTexture != NULL ? 1461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new SurfaceTextureClient(surfaceTexture) : NULL); 1471173118eace0e9e347cb007f0da817cee87579edGlenn Kasten msg->setObject("native-window", new NativeWindowWrapper(surfaceTextureClient)); 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 151f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 157f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 16143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 162b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 16343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 16443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 16543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 166b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 16743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 16843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 1701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 1711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 1721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 17343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 17443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 17543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 17643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 17743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 17843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 17953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 1801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 18153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 18253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 1831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 18553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 18653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 18753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 1881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 1891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 1901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 19153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 19253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 19353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 19453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 19553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 19653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 19753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 19853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 199f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2033856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetDataSource"); 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 2085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2105bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 214b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber case kWhatPollDuration: 215b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber { 216b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int32_t generation; 217b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber CHECK(msg->findInt32("generation", &generation)); 218b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 219b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (generation != mPollDurationGeneration) { 220b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // stale 221b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber break; 222b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 223b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 224b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t durationUs; 225b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 226b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 227b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (driver != NULL) { 228b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber driver->notifyDuration(durationUs); 229b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 230b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 231b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 232b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->post(1000000ll); // poll again in a second. 233b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber break; 234b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 235b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 2361173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetVideoNativeWindow"); 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 2411173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2431173118eace0e9e347cb007f0da817cee87579edGlenn Kasten mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 2440d268a3cae145afb2720c88ae38fb81550be5584James Dong 2450d268a3cae145afb2720c88ae38fb81550be5584James Dong // XXX - ignore error from setVideoScalingMode for now 2460d268a3cae145afb2720c88ae38fb81550be5584James Dong setVideoScalingMode(mVideoScalingMode); 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetAudioSink"); 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatStart"); 26443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = false; 2661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 2671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 26832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 26932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 2703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 2713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = 0; 2723fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = 0; 2731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2745bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(kWhatRendererNotify, id())); 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 2881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 2891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 2901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 2911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 2921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 2931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2955bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 2965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 29843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 29943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 300b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber bool mHadAnySourcesBefore = 301b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber (mAudioDecoder != NULL) || (mVideoDecoder != NULL); 302b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 3035d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George if (mNativeWindow != NULL) { 3045d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George instantiateDecoder(false, &mVideoDecoder); 3055d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George } 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 3085bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 311b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (!mHadAnySourcesBefore 312b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 313b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // This is the first time we've found anything playable. 314b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 315b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber uint32_t flags = mSource->flags(); 316b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 317b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (flags & Source::FLAG_DYNAMIC_DURATION) { 318b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber schedulePollDuration(); 319b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 320b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 321b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 322eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber status_t err; 323eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if ((err = mSource->feedMoreTSData()) != OK) { 3241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 3251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 3261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 327eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber 328eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (err == ERROR_END_OF_STREAM) { 329eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 330eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } else { 331eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 332eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } 3331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber if ((mAudioDecoder == NULL && mAudioSink != NULL) 338fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber || (mVideoDecoder == NULL && mNativeWindow != NULL)) { 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 3405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3605bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 361eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (mSource->feedMoreTSData() == OK) { 3621183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber msg->post(10000ll); 3635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 366dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber int32_t err; 367dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber CHECK(codecRequest->findInt32("err", &err)); 368dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 369dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err == ERROR_END_OF_STREAM) { 3703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 371dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 3723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS w/ error %d", 373dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber audio ? "audio" : "video", 374dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber err); 375dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 376dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 377dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mRenderer->queueEOS(audio, err); 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 3791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 38053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 3821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 3851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 3873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3913856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 3943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initiating %s decoder shutdown", 39553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 39953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 40053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 40153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 40253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 40353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4063831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 4072c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 40831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 40931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 41031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("channel-count", &numChannels)); 4112c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 41231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 41331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 4142c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 4153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Audio output format changed to %d Hz, %d channels", 41631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 4172c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 41831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 4191948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 4201948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent audio_output_flags_t flags; 4211948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent int64_t durationUs; 4221948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // FIXME: we should handle the case where the video decoder is created after 4231948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // we receive the format change indication. Current code will just make that 4241948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // we select deep buffer with video which should not be a problem as it should 4251948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // not prevent from keeping A/V sync. 4261948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent if (mVideoDecoder == NULL && 4271948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mSource->getDuration(&durationUs) == OK && 4281948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent durationUs > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) { 4291948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER; 4301948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent } else { 4311948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags = AUDIO_OUTPUT_FLAG_NONE; 4321948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent } 4331948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 4349806555d3930be43e11106281dee354820ac1c88Andreas Huber int32_t channelMask; 4359806555d3930be43e11106281dee354820ac1c88Andreas Huber if (!codecRequest->findInt32("channel-mask", &channelMask)) { 4369806555d3930be43e11106281dee354820ac1c88Andreas Huber channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER; 4379806555d3930be43e11106281dee354820ac1c88Andreas Huber } 4389806555d3930be43e11106281dee354820ac1c88Andreas Huber 439078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 440078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 441078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 4429806555d3930be43e11106281dee354820ac1c88Andreas Huber (audio_channel_mask_t)channelMask, 443078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 4441948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 8 /* bufferCount */, 4451948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent NULL, 4461948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent NULL, 4471948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags), 448078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 44931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 4503831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 45131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 45231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 45331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 45431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 45531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 45631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 45731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 45831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 45931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 46031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 46131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 46231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 46331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Video output format changed to %d x %d " 465cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 46631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 467cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropRight - cropLeft + 1), 468cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber (cropBottom - cropTop + 1), 469cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 47031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 47131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 47231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber MEDIA_SET_VIDEO_SIZE, 47331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropRight - cropLeft + 1, 47431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber cropBottom - cropTop + 1); 47531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 4763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 4773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s shutdown completed", audio ? "audio" : "video"); 4783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 4793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 4803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 4823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 4833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 4843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 4853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 4873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 4883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 4893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 4903831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 491c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else if (what == ACodec::kWhatError) { 49229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Received error from %s decoder, aborting playback.", 493c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 494c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 495c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (what == ACodec::kWhatDrainThisBuffer) { 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("Unhandled codec notification %d.", what); 500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 514c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 515c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 516c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 523c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 5243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reached %s EOS", audio ? "audio" : "video"); 525c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 52629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("%s track encountered an error (%d)", 527c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 528c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 529c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 530c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 531c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 53743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 53843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 53943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 54043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 5423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 54343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 54443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 54543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 54643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 5473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber driver->notifyFrameStats( 5493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, mNumFramesDropped); 55043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 55143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 5523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (what == Renderer::kWhatFlushComplete) { 553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(what, (int32_t)Renderer::kWhatFlushComplete); 554f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 555f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 559f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong } else if (what == Renderer::kWhatVideoRenderingStart) { 560f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0); 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 5723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatReset"); 5731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 574b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber cancelPollDuration(); 575b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 576b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber if (mRenderer != NULL) { 577b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // There's an edge case where the renderer owns all output 578b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // buffers and is paused, therefore the decoder will not read 579b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // more input data and will never encounter the matching 580b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber // discontinuity. To avoid this, we resume the renderer. 581b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 582b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber if (mFlushingAudio == AWAITING_DISCONTINUITY 583b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY) { 584b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber mRenderer->resume(); 585b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber } 586b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber } 587b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 5881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 5891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're currently flushing, postpone the reset until that's 5901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // completed. 5911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 592ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber ALOGV("postponing reset mFlushingAudio=%d, mFlushingVideo=%d", 593ea9d51bd710e6739077a3700f27a1c37767a2f6dAndreas Huber mFlushingAudio, mFlushingVideo); 5941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = true; 5961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 5971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 5991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 6001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 6011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 6021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = true; 6056e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 6061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder != NULL) { 6071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 6081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mVideoDecoder != NULL) { 6111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 6121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 6151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 6161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 61843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 61943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 62043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 62143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 62243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 6233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSeek seekTimeUs=%lld us (%.2f secs)", 62443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber seekTimeUs, seekTimeUs / 1E6); 62543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 62643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mSource->seekTo(seekTimeUs); 62743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 62843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 62943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 63043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 63143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifySeekComplete(); 63243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 63343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 63443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 63543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 63643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 63743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 638b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 639b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 640b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 641b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 642b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 643b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 644b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 645b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 646b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 647b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 648b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 649b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 650b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 651b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 6593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 6603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 6613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6623831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 6643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 6653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6663831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6673856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("both audio and video are flushed now."); 6683831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6696e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mTimeDiscontinuityPending) { 6706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mRenderer->signalTimeDiscontinuity(); 6716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = false; 6726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 6733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 67422fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 6753831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 6763831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6773831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 67822fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 6793831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 6803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 6833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mResetInProgress) { 6863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reset completed"); 6871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 6891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber finishReset(); 6901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else if (mResetPostponed) { 6911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 6921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetPostponed = false; 69322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber } else if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 6941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 6951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 6961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 6981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::finishReset() { 6991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mAudioDecoder == NULL); 7001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mVideoDecoder == NULL); 7011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber ++mScanSourcesGeneration; 7032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mScanSourcesPending = false; 7042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 7051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer.clear(); 7062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 7072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber if (mSource != NULL) { 7082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource->stop(); 7092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber mSource.clear(); 7102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 7111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 71243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 71343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 71443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 71543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyResetComplete(); 71643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 71743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 7181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 7191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 7211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 7221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 7241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 7261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 7271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 7281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 7291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7325bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 737840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<AMessage> format = mSource->getFormat(audio); 738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 739840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (format == NULL) { 740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 744840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber AString mime; 745840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber CHECK(format->findString("mime", &mime)); 746840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str()); 7473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 7483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 7541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 757840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber (*decoder)->configure(format); 758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 75943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t durationUs; 76043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 76143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 76243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 76343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyDuration(durationUs); 76443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 76543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 76643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 770f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 77453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 77553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool dropAccessUnit; 7843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber do { 7853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 7865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 7873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == -EWOULDBLOCK) { 7883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return err; 7893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (err != OK) { 7903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == INFO_DISCONTINUITY) { 7913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int32_t type; 7923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 79353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 7943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool formatChange = 7956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (audio && 7966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT)) 7976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber || (!audio && 7986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT)); 79953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 8006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0; 8016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 802df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("%s discontinuity (formatChange=%d, time=%d)", 8036e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", formatChange, timeChange); 80432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 8053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 8063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 8073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 8083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 8093fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 81032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 8116e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (timeChange) { 8126e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber sp<AMessage> extra; 8136e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 8146e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra != NULL) { 8156e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs; 8166e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra->findInt64( 8176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 818df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("suppressing rendering of %s until %lld us", 8196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 8206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 8226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 8236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 8246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 8256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 8266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 8276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 8283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 82932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 83032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 8313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 8326e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = 8336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending || timeChange; 8346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (formatChange || timeChange) { 8366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber flushDecoder(audio, formatChange); 8376e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 8386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber // This stream is unaffected by the discontinuity 8396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8406e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 8416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingAudio = FLUSHED; 8426e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 8436e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingVideo = FLUSHED; 8446e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 8456e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8466e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber finishFlushIfPossible(); 8476e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 8486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return -EWOULDBLOCK; 8496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 85032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 85132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 8523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 8533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 8543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 8583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 8593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 8603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 8613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 8623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 8633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 8643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 8653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 8663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 8673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 8683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 8693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 8763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("feeding %s input buffer at media time %.2f secs", 877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 879f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8812d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", accessUnit); 882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 884f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 887f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 8883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("renderBuffer %s", audio ? "audio" : "video"); 889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 89318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 89418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 89518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 89618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 89718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 89818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 8993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're still flushing the %s decoder, sending its output buffer" 90018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 90118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 90218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 90318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 90418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 90518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 9062d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 9072d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 90932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 91032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 91132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 91232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 91332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 91432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 91532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 91632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 91732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 91832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 9193856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dropping %s buffer at time %lld as requested.", 92032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 92132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 92232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 92332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 92432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 92532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 92632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 92732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 92832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 92932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 933f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 93443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 93843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 94043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 944a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber driver->notifyListener(msg, ext1, ext2); 945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 9486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) { 949df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("flushDecoder %s without decoder present", 9506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video"); 9516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 9526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 9541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 95543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 9561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 9581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 9591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 9611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 9621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 9641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 9651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 9661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 9681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 9701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 9711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 9721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 9731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 9751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 9761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 9771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 9791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 9811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 9821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 9831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 9841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 9861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 9871aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 988840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<AMessage> NuPlayer::Source::getFormat(bool audio) { 989840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<MetaData> meta = getFormatMeta(audio); 990840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 991840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (meta == NULL) { 992840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return NULL; 993840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 994840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 995840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<AMessage> msg = new AMessage; 996840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 997840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if(convertMetaDataToMessage(meta, &msg) == OK) { 998840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return msg; 999840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 1000840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return NULL; 1001840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber} 1002840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 10030d268a3cae145afb2720c88ae38fb81550be5584James Dongstatus_t NuPlayer::setVideoScalingMode(int32_t mode) { 10040d268a3cae145afb2720c88ae38fb81550be5584James Dong mVideoScalingMode = mode; 1005376074ed1c3c368aeb336954a07632cd806288e2James Dong if (mNativeWindow != NULL 1006376074ed1c3c368aeb336954a07632cd806288e2James Dong && mNativeWindow->getNativeWindow() != NULL) { 10070d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = native_window_set_scaling_mode( 10080d268a3cae145afb2720c88ae38fb81550be5584James Dong mNativeWindow->getNativeWindow().get(), mVideoScalingMode); 10090d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 10100d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to set scaling mode (%d): %s", 10110d268a3cae145afb2720c88ae38fb81550be5584James Dong -ret, strerror(-ret)); 10120d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 10130d268a3cae145afb2720c88ae38fb81550be5584James Dong } 10140d268a3cae145afb2720c88ae38fb81550be5584James Dong } 10150d268a3cae145afb2720c88ae38fb81550be5584James Dong return OK; 10160d268a3cae145afb2720c88ae38fb81550be5584James Dong} 10170d268a3cae145afb2720c88ae38fb81550be5584James Dong 1018b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::schedulePollDuration() { 1019b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber sp<AMessage> msg = new AMessage(kWhatPollDuration, id()); 1020b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->setInt32("generation", mPollDurationGeneration); 1021b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->post(); 1022b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber} 1023b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 1024b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::cancelPollDuration() { 1025b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber ++mPollDurationGeneration; 1026b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber} 1027b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 1029