NuPlayer.cpp revision 6d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aab
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayer" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "HTTPLiveSource.h" 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDecoder.h" 2543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber#include "NuPlayerDriver.h" 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerRenderer.h" 275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "NuPlayerSource.h" 282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "RTSPSource.h" 295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "StreamingSource.h" 30afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber#include "GenericSource.h" 315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber#include "ATSParser.h" 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 34da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo#include "SoftwareRenderer.h" 35da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo 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> 448ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.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 53a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::Action : public RefBase { 54a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber Action() {} 55a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 56a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber virtual void execute(NuPlayer *player) = 0; 57a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 58a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate: 59a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Action); 60a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}; 61a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 62a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::SeekAction : public Action { 63a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber SeekAction(int64_t seekTimeUs) 64a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber : mSeekTimeUs(seekTimeUs) { 65a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 66a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 67a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber virtual void execute(NuPlayer *player) { 68a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber player->performSeek(mSeekTimeUs); 69a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 70a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 71a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate: 72a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber int64_t mSeekTimeUs; 73a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 74a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(SeekAction); 75a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}; 76a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 7757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huberstruct NuPlayer::SetSurfaceAction : public Action { 7857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber SetSurfaceAction(const sp<NativeWindowWrapper> &wrapper) 7957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber : mWrapper(wrapper) { 8057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 8157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 8257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber virtual void execute(NuPlayer *player) { 8357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber player->performSetSurface(mWrapper); 8457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 8557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 8657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huberprivate: 8757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber sp<NativeWindowWrapper> mWrapper; 8857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 8957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction); 9057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber}; 9157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct NuPlayer::ShutdownDecoderAction : public Action { 9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ShutdownDecoderAction(bool audio, bool video) 9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber : mAudio(audio), 9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mVideo(video) { 9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual void execute(NuPlayer *player) { 9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber player->performDecoderShutdown(mAudio, mVideo); 10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate: 10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mAudio; 10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mVideo; 10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ShutdownDecoderAction); 10714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}; 10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct NuPlayer::PostMessageAction : public Action { 11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber PostMessageAction(const sp<AMessage> &msg) 11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber : mMessage(msg) { 11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 11314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual void execute(NuPlayer *) { 11514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mMessage->post(); 11614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 11714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate: 11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> mMessage; 12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(PostMessageAction); 12214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}; 12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 124a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber// Use this if there's no state necessary to save in order to execute 125a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber// the action. 126a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::SimpleAction : public Action { 127a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber typedef void (NuPlayer::*ActionFunc)(); 128a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 129a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber SimpleAction(ActionFunc func) 130a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber : mFunc(func) { 131a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 132a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 133a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber virtual void execute(NuPlayer *player) { 134a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber (player->*mFunc)(); 135a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 136a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 137a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate: 138a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ActionFunc mFunc; 139a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 140a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(SimpleAction); 141a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}; 142a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 145f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 1469b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber : mUIDValid(false), 1479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mSourceFlags(0), 1483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC(false), 149da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo mNeedsSwRenderer(false), 1509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mAudioEOS(false), 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 1525bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 1531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 154b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber mPollDurationGeneration(0), 1556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending(false), 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 1571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 1583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs(-1ll), 1593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs(-1ll), 1603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs(0ll), 1613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0ll), 1620d268a3cae145afb2720c88ae38fb81550be5584James Dong mNumFramesDropped(0ll), 16357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW), 16457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mStarted(false) { 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 167f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 1719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 1729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 1739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 1749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 17543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 17643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) { 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 182b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 183b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 184240abcc4bf661a10ffca24859945796acc76ac6eAndreas Huber msg->setObject("source", new StreamingSource(notify, source)); 1855bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 1865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 188afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) { 189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (!strncasecmp("http://", url, 7) 190997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber || !strncasecmp("https://", url, 8) 191997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber || !strncasecmp("file://", url, 7)) { 192afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber size_t len = strlen(url); 193afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 194afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 196afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (strstr(url,"m3u8")) { 198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 201afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 202afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return false; 203afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 204afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 2059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync( 2061b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 2071b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 2081b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 2095bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 2107a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé size_t len = strlen(url); 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 212b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 213b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 214afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<Source> source; 215afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (IsHTTPLiveURL(url)) { 21681e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber source = new HTTPLiveSource(notify, httpService, url, headers); 217afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } else if (!strncasecmp(url, "rtsp://", 7)) { 2181b86fe063badb5f28c467ade39be0f4008688947Andreas Huber source = new RTSPSource( 2191b86fe063badb5f28c467ade39be0f4008688947Andreas Huber notify, httpService, url, headers, mUIDValid, mUID); 2207a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé } else if ((!strncasecmp(url, "http://", 7) 2217a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé || !strncasecmp(url, "https://", 8)) 2227a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) 2237a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé || strstr(url, ".sdp?"))) { 2241b86fe063badb5f28c467ade39be0f4008688947Andreas Huber source = new RTSPSource( 2251b86fe063badb5f28c467ade39be0f4008688947Andreas Huber notify, httpService, url, headers, mUIDValid, mUID, true); 2262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } else { 22781e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber source = new GenericSource(notify, httpService, url, headers); 2282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 2292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 230afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 231afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->post(); 232afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 233afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) { 235afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 236afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 237b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 238b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 239b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber sp<Source> source = new GenericSource(notify, fd, offset, length); 240afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::prepareAsync() { 2459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber (new AMessage(kWhatPrepare, id()))->post(); 2469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 2479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 24857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayer::setVideoSurfaceTextureAsync( 2498ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 2501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 25157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 2528ba01021b573889802e67e029225a96f0dfa471aAndy McFadden if (bufferProducer == NULL) { 25357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber msg->setObject("native-window", NULL); 25457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } else { 25557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber msg->setObject( 25657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber "native-window", 25757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber new NativeWindowWrapper( 2581a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian new Surface(bufferProducer))); 25957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 26057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 264f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 270f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 27443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 275b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 27643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 27743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 27843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 279b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 28043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 28143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 2831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 2841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 2851aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 28643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 28743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 28843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 28943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 29043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 29143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 29253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 2931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 29453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 29553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 2961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 2971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 29853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 29953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 30053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 3011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 3021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 3031aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 30453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 30553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 30653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 30753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 30853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 30953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 31053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 31153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetDataSource"); 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3205bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 3215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3235bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 324b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 325b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber looper()->registerHandler(mSource); 3269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(mDriver != NULL); 3289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 3299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (driver != NULL) { 3309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber driver->notifySetDataSourceCompleted(OK); 3319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 3329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 3339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 3349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case kWhatPrepare: 3369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 3379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mSource->prepareAsync(); 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 341dcb89b3b505522efde173c105a851c412f947178Chong Zhang case kWhatGetTrackInfo: 342dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 343dcb89b3b505522efde173c105a851c412f947178Chong Zhang uint32_t replyID; 344dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->senderAwaitsResponse(&replyID)); 345dcb89b3b505522efde173c105a851c412f947178Chong Zhang 346dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = INVALID_OPERATION; 347dcb89b3b505522efde173c105a851c412f947178Chong Zhang if (mSource != NULL) { 348dcb89b3b505522efde173c105a851c412f947178Chong Zhang Parcel* reply; 349dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findPointer("reply", (void**)&reply)); 350dcb89b3b505522efde173c105a851c412f947178Chong Zhang err = mSource->getTrackInfo(reply); 351dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 352dcb89b3b505522efde173c105a851c412f947178Chong Zhang 353dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> response = new AMessage; 354dcb89b3b505522efde173c105a851c412f947178Chong Zhang response->setInt32("err", err); 355dcb89b3b505522efde173c105a851c412f947178Chong Zhang 356dcb89b3b505522efde173c105a851c412f947178Chong Zhang response->postReply(replyID); 357dcb89b3b505522efde173c105a851c412f947178Chong Zhang break; 358dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 359dcb89b3b505522efde173c105a851c412f947178Chong Zhang 360dcb89b3b505522efde173c105a851c412f947178Chong Zhang case kWhatSelectTrack: 361dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 362dcb89b3b505522efde173c105a851c412f947178Chong Zhang uint32_t replyID; 363dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->senderAwaitsResponse(&replyID)); 364dcb89b3b505522efde173c105a851c412f947178Chong Zhang 365dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = INVALID_OPERATION; 366dcb89b3b505522efde173c105a851c412f947178Chong Zhang if (mSource != NULL) { 367dcb89b3b505522efde173c105a851c412f947178Chong Zhang size_t trackIndex; 368dcb89b3b505522efde173c105a851c412f947178Chong Zhang int32_t select; 369dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findSize("trackIndex", &trackIndex)); 370dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findInt32("select", &select)); 371dcb89b3b505522efde173c105a851c412f947178Chong Zhang err = mSource->selectTrack(trackIndex, select); 372dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 373dcb89b3b505522efde173c105a851c412f947178Chong Zhang 374dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> response = new AMessage; 375dcb89b3b505522efde173c105a851c412f947178Chong Zhang response->setInt32("err", err); 376dcb89b3b505522efde173c105a851c412f947178Chong Zhang 377dcb89b3b505522efde173c105a851c412f947178Chong Zhang response->postReply(replyID); 378dcb89b3b505522efde173c105a851c412f947178Chong Zhang break; 379dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 380dcb89b3b505522efde173c105a851c412f947178Chong Zhang 381b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber case kWhatPollDuration: 382b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber { 383b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int32_t generation; 384b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber CHECK(msg->findInt32("generation", &generation)); 385b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 386b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (generation != mPollDurationGeneration) { 387b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // stale 388b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber break; 389b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 390b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 391b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t durationUs; 392b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 393b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 394b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (driver != NULL) { 395b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber driver->notifyDuration(durationUs); 396b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 397b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 398b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 399b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->post(1000000ll); // poll again in a second. 400b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber break; 401b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 402b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 4031173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetVideoNativeWindow"); 406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mDeferredActions.push_back( 40814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber new ShutdownDecoderAction( 40914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber false /* audio */, true /* video */)); 41057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 4121173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mDeferredActions.push_back( 41557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber new SetSurfaceAction( 41657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()))); 41757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 41857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (obj != NULL) { 41957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber // If there is a new surface texture, instantiate decoders 42057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber // again if possible. 42157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mDeferredActions.push_back( 42257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber new SimpleAction(&NuPlayer::performScanSources)); 42357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 4240d268a3cae145afb2720c88ae38fb81550be5584James Dong 42557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber processDeferredActions(); 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetAudioSink"); 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4423856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatStart"); 44343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 4443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = false; 445da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo mNeedsSwRenderer = false; 4461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 4471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 44832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 44932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 4503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 4513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = 0; 4523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = 0; 45357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mStarted = true; 4541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4555bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 457d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber uint32_t flags = 0; 458d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 459d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber if (mSource->isRealTime()) { 460d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber flags |= Renderer::FLAG_REAL_TIME; 461d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } 462d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 465d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber new AMessage(kWhatRendererNotify, id()), 466d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber flags); 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 474f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 4791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 4801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 4845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 4853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 48643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 48743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 488b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber bool mHadAnySourcesBefore = 489b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber (mAudioDecoder != NULL) || (mVideoDecoder != NULL); 490b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 4915d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George if (mNativeWindow != NULL) { 4925d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George instantiateDecoder(false, &mVideoDecoder); 4935d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George } 494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 495f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 4965bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 499b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (!mHadAnySourcesBefore 500b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 501b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // This is the first time we've found anything playable. 502b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 5039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) { 504b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber schedulePollDuration(); 505b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 506b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 507b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 508eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber status_t err; 509eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if ((err = mSource->feedMoreTSData()) != OK) { 5101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 5111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 5121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 513eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber 514eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (err == ERROR_END_OF_STREAM) { 515eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 516eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } else { 517eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 518eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } 5191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 523fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber if ((mAudioDecoder == NULL && mAudioSink != NULL) 524fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber || (mVideoDecoder == NULL && mNativeWindow != NULL)) { 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 5265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> codecRequest; 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("codec-request", &codecRequest)); 538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 540f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(codecRequest->findInt32("what", &what)); 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == ACodec::kWhatFillThisBuffer) { 543f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio, codecRequest); 545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5465bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 547eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (mSource->feedMoreTSData() == OK) { 5481183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber msg->post(10000ll); 5495bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 551f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatEOS) { 552dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber int32_t err; 553dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber CHECK(codecRequest->findInt32("err", &err)); 554dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 555dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err == ERROR_END_OF_STREAM) { 5563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 557dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 5583856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS w/ error %d", 559dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber audio ? "audio" : "video", 560dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber err); 561dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 562dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 563dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mRenderer->queueEOS(audio, err); 564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (what == ACodec::kWhatFlushCompleted) { 5651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 56653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 5681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 5733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 578f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 5803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initiating %s decoder shutdown", 58153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 584f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 58653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 58753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 58853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 58953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 590f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5913831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 5932c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber } else if (what == ACodec::kWhatOutputFormatChanged) { 59431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 59531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 596516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber CHECK(codecRequest->findInt32( 597516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "channel-count", &numChannels)); 5982c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 59931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 60031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 6012c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 6023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Audio output format changed to %d Hz, %d channels", 60331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 6042c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 60531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 6061948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 6071948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent audio_output_flags_t flags; 6081948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent int64_t durationUs; 609516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // FIXME: we should handle the case where the video decoder 610516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // is created after we receive the format change indication. 611516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // Current code will just make that we select deep buffer 612516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // with video which should not be a problem as it should 6131948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // not prevent from keeping A/V sync. 6141948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent if (mVideoDecoder == NULL && 6151948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mSource->getDuration(&durationUs) == OK && 616516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber durationUs 617516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) { 6181948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER; 6191948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent } else { 6201948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags = AUDIO_OUTPUT_FLAG_NONE; 6211948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent } 6221948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 6239806555d3930be43e11106281dee354820ac1c88Andreas Huber int32_t channelMask; 6249806555d3930be43e11106281dee354820ac1c88Andreas Huber if (!codecRequest->findInt32("channel-mask", &channelMask)) { 6259806555d3930be43e11106281dee354820ac1c88Andreas Huber channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER; 6269806555d3930be43e11106281dee354820ac1c88Andreas Huber } 6279806555d3930be43e11106281dee354820ac1c88Andreas Huber 628078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 629078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 630078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 6319806555d3930be43e11106281dee354820ac1c88Andreas Huber (audio_channel_mask_t)channelMask, 632078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 6331948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 8 /* bufferCount */, 6341948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent NULL, 6351948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent NULL, 6361948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags), 637078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 63831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 6393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 64031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 64131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 64231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 64331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 64431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 64531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("width", &width)); 64631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findInt32("height", &height)); 64731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 64831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 64931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK(codecRequest->findRect( 65031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 65131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 65231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 653516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber int32_t displayWidth = cropRight - cropLeft + 1; 654516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber int32_t displayHeight = cropBottom - cropTop + 1; 655516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 6563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Video output format changed to %d x %d " 657cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 65831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 659516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber displayWidth, 660516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber displayHeight, 661cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 66231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 663516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber sp<AMessage> videoInputFormat = 664516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber mSource->getFormat(false /* audio */); 665516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 666516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // Take into account sample aspect ratio if necessary: 667516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber int32_t sarWidth, sarHeight; 668516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (videoInputFormat->findInt32("sar-width", &sarWidth) 669516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber && videoInputFormat->findInt32( 670516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "sar-height", &sarHeight)) { 671516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGV("Sample aspect ratio %d : %d", 672516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber sarWidth, sarHeight); 673516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 674516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber displayWidth = (displayWidth * sarWidth) / sarHeight; 675516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 676516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGV("display dimensions %d x %d", 677516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber displayWidth, displayHeight); 678516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber } 679516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 68031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 681516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber MEDIA_SET_VIDEO_SIZE, displayWidth, displayHeight); 682da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo 683da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo if (mNeedsSwRenderer && mNativeWindow != NULL) { 684da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo int32_t colorFormat; 685da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo CHECK(codecRequest->findInt32("color-format", &colorFormat)); 686da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo 687da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo sp<MetaData> meta = new MetaData; 688da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo meta->setInt32(kKeyWidth, width); 689da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo meta->setInt32(kKeyHeight, height); 690da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo meta->setRect(kKeyCropRect, cropLeft, cropTop, cropRight, cropBottom); 691da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo meta->setInt32(kKeyColorFormat, colorFormat); 692da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo 693da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo mRenderer->setSoftRenderer( 694da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo new SoftwareRenderer(mNativeWindow->getNativeWindow(), meta)); 695da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo } 69631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 6973831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else if (what == ACodec::kWhatShutdownCompleted) { 6983856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s shutdown completed", audio ? "audio" : "video"); 6993831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 7003831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 7013831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 7023831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 7033831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 7043831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 7053831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 7063831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 7073831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 7083831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 7093831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 7103831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 7113831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 712c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else if (what == ACodec::kWhatError) { 71329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Received error from %s decoder, aborting playback.", 714c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 715c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 716c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (what == ACodec::kWhatDrainThisBuffer) { 718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber renderBuffer(audio, codecRequest); 719da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo } else if (what == ACodec::kWhatComponentAllocated) { 720da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo if (!audio) { 721da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo AString name; 722da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo CHECK(codecRequest->findString("componentName", &name)); 723da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo mNeedsSwRenderer = name.startsWith("OMX.google."); 724da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo } 725da38df5f080eb62a06b22c5bada4357cf756255eMartin Storsjo } else if (what != ACodec::kWhatComponentConfigured 726a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber && what != ACodec::kWhatBuffersAllocated) { 727a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("Unhandled codec notification %d '%c%c%c%c'.", 728a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber what, 729a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber what >> 24, 730a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber (what >> 16) & 0xff, 731a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber (what >> 8) & 0xff, 732a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber what & 0xff); 733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 747c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 748c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 749c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 756c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 7573856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reached %s EOS", audio ? "audio" : "video"); 758c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 75929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("%s track encountered an error (%d)", 760c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 761c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 762c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 763c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 764c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 768f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 77043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 77143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 77243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 77343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 7743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 7753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 77643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 77743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 77843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 77943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 7803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7813fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber driver->notifyFrameStats( 7823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, mNumFramesDropped); 78343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 78443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 7853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (what == Renderer::kWhatFlushComplete) { 786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7893856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 790f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong } else if (what == Renderer::kWhatVideoRenderingStart) { 791f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0); 792cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar } else if (what == Renderer::kWhatMediaRenderingStart) { 793cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar ALOGV("media rendering started"); 794cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_STARTED, 0, 0); 795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8041aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 8051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 8063856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatReset"); 8071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 808a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_back( 80914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber new ShutdownDecoderAction( 81014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber true /* audio */, true /* video */)); 811b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 812a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_back( 813a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber new SimpleAction(&NuPlayer::performReset)); 8141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 815a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber processDeferredActions(); 8161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 8171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 8181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 81943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 82043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 82143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 82243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 82343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 824a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("kWhatSeek seekTimeUs=%lld us", seekTimeUs); 82543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 826a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_back( 827a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber new SimpleAction(&NuPlayer::performDecoderFlush)); 82843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 829a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_back(new SeekAction(seekTimeUs)); 83043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 831a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber processDeferredActions(); 83243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 83343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 83443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 835b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 836b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 837b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 838fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson mSource->pause(); 839b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 840b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 841b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 842b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 843b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 844b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 845b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 846fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson mSource->resume(); 847b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 848b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 849b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 850b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 851b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber case kWhatSourceNotify: 852b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber { 8539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber onSourceNotify(msg); 854b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber break; 855b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber } 856b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 862f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8633831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 8643831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 8653831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 8663831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 8673831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 8683831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 8693831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 8703831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 8713831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 8723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("both audio and video are flushed now."); 8733831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 8746e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mTimeDiscontinuityPending) { 8756e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mRenderer->signalTimeDiscontinuity(); 8766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = false; 8776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 8783831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 87922fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 8803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 8813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 8823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 88322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 8843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 8853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 8863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 8873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 8883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 890a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber processDeferredActions(); 8911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 8921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 8941aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 8951aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 8971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 8991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 9001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 9011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 9021aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9055bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 910840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<AMessage> format = mSource->getFormat(audio); 911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 912840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (format == NULL) { 913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 917840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber AString mime; 918840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber CHECK(format->findString("mime", &mime)); 919840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str()); 9203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 9213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9261173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 9271173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(*decoder); 929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 930840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber (*decoder)->configure(format); 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 93953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 94053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 943f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool dropAccessUnit; 9493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber do { 9503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 9515bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 9523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == -EWOULDBLOCK) { 9533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return err; 9543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (err != OK) { 9553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == INFO_DISCONTINUITY) { 9563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int32_t type; 9573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 95853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 9593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool formatChange = 9606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (audio && 9616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT)) 9626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber || (!audio && 9636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT)); 96453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 9656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0; 9666e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 967df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("%s discontinuity (formatChange=%d, time=%d)", 9686e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", formatChange, timeChange); 96932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 9703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 9713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 9723fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 9733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 9743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 97532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 9766e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (timeChange) { 9776e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber sp<AMessage> extra; 9786e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 9796e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra != NULL) { 9806e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs; 9816e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra->findInt64( 9826e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 983df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("suppressing rendering of %s until %lld us", 9846e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 9856e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9866e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 9876e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 9886e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 9896e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 9906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 9916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 9926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 9933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 99432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 99532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 9963fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 9976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = 9986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending || timeChange; 9996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 10006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (formatChange || timeChange) { 1001a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mFlushingAudio == NONE && mFlushingVideo == NONE) { 1002a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // And we'll resume scanning sources once we're done 1003a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // flushing. 1004a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_front( 1005a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber new SimpleAction( 1006a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber &NuPlayer::performScanSources)); 1007a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1008a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 10096d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih sp<AMessage> newFormat = mSource->getFormat(audio); 10106d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih sp<Decoder> &decoder = audio ? mAudioDecoder : mVideoDecoder; 10116d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih if (formatChange && !decoder->supportsSeamlessFormatChange(newFormat)) { 10126d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih flushDecoder(audio, /* needShutdown = */ true); 10136d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih } else { 10146d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih flushDecoder(audio, /* needShutdown = */ false); 10156d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih err = OK; 10166d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih } 10176e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 10186e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber // This stream is unaffected by the discontinuity 10196e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 10206e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 10216e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingAudio = FLUSHED; 10226e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 10236e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingVideo = FLUSHED; 10246e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 10256e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 10266e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber finishFlushIfPossible(); 10276e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 10286e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return -EWOULDBLOCK; 10296e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 103032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 103132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 10323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 10333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 10343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 10383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 10393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 10403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 10413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 10423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 10433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 10443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 10453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 10463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 10473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 10483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 10493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 1050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 1052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 1054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 1055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 10563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("feeding %s input buffer at media time %.2f secs", 1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", accessUnit); 1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 1063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1067f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 10683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("renderBuffer %s", audio ? "audio" : "video"); 1069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 1071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 1072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 107318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 107418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 107518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 107618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 107718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 107818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 10793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're still flushing the %s decoder, sending its output buffer" 108018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 108118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 108218ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 108318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 108418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 108518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 10862d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 10872d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 108932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 109032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 109132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 109232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 109332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 109432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 109532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 109632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 109732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 109832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 10993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dropping %s buffer at time %lld as requested.", 110032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 110132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 110232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 110332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 110432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 110532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 110632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 110732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 110832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 110932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 1110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 1111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1113dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) { 111443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 1115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 1116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 111843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 1119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 112043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 1121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 1122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1124dcb89b3b505522efde173c105a851c412f947178Chong Zhang driver->notifyListener(msg, ext1, ext2, in); 1125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 112814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ALOGV("[%s] flushDecoder needShutdown=%d", 112914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber audio ? "audio" : "video", needShutdown); 113014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11316e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) { 1132df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("flushDecoder %s without decoder present", 11336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video"); 11346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 11356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 11361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 11371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 113843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 11391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 11411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 11421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 11441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 11451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 11471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 11481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 11491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 11511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 11531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 11541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 11551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 11561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 11571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 11581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 11591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 11601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 11621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 11641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 11651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 11661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 11671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 11681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 11691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 11701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 1171840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<AMessage> NuPlayer::Source::getFormat(bool audio) { 1172840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<MetaData> meta = getFormatMeta(audio); 1173840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 1174840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (meta == NULL) { 1175840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return NULL; 1176840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 1177840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 1178840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<AMessage> msg = new AMessage; 1179840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 1180840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if(convertMetaDataToMessage(meta, &msg) == OK) { 1181840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return msg; 1182840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 1183840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return NULL; 1184840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber} 1185840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 11860d268a3cae145afb2720c88ae38fb81550be5584James Dongstatus_t NuPlayer::setVideoScalingMode(int32_t mode) { 11870d268a3cae145afb2720c88ae38fb81550be5584James Dong mVideoScalingMode = mode; 118857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (mNativeWindow != NULL) { 11890d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = native_window_set_scaling_mode( 11900d268a3cae145afb2720c88ae38fb81550be5584James Dong mNativeWindow->getNativeWindow().get(), mVideoScalingMode); 11910d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 11920d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to set scaling mode (%d): %s", 11930d268a3cae145afb2720c88ae38fb81550be5584James Dong -ret, strerror(-ret)); 11940d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 11950d268a3cae145afb2720c88ae38fb81550be5584James Dong } 11960d268a3cae145afb2720c88ae38fb81550be5584James Dong } 11970d268a3cae145afb2720c88ae38fb81550be5584James Dong return OK; 11980d268a3cae145afb2720c88ae38fb81550be5584James Dong} 11990d268a3cae145afb2720c88ae38fb81550be5584James Dong 1200dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::getTrackInfo(Parcel* reply) const { 1201dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, id()); 1202dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->setPointer("reply", reply); 1203dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1204dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> response; 1205dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = msg->postAndAwaitResponse(&response); 1206dcb89b3b505522efde173c105a851c412f947178Chong Zhang return err; 1207dcb89b3b505522efde173c105a851c412f947178Chong Zhang} 1208dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1209dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::selectTrack(size_t trackIndex, bool select) { 1210dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> msg = new AMessage(kWhatSelectTrack, id()); 1211dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->setSize("trackIndex", trackIndex); 1212dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->setInt32("select", select); 1213dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1214dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> response; 1215dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = msg->postAndAwaitResponse(&response); 1216dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1217dcb89b3b505522efde173c105a851c412f947178Chong Zhang return err; 1218dcb89b3b505522efde173c105a851c412f947178Chong Zhang} 1219dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1220b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::schedulePollDuration() { 1221b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber sp<AMessage> msg = new AMessage(kWhatPollDuration, id()); 1222b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->setInt32("generation", mPollDurationGeneration); 1223b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->post(); 1224b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber} 1225b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 1226b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::cancelPollDuration() { 1227b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber ++mPollDurationGeneration; 1228b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber} 1229b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 1230a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::processDeferredActions() { 1231a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber while (!mDeferredActions.empty()) { 1232a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // We won't execute any deferred actions until we're no longer in 1233a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // an intermediate state, i.e. one more more decoders are currently 1234a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // flushing or shutting down. 1235a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1236a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mRenderer != NULL) { 1237a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // There's an edge case where the renderer owns all output 1238a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // buffers and is paused, therefore the decoder will not read 1239a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // more input data and will never encounter the matching 1240a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // discontinuity. To avoid this, we resume the renderer. 1241a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1242a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mFlushingAudio == AWAITING_DISCONTINUITY 1243a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY) { 1244a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mRenderer->resume(); 1245a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1246a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1247a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1248a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 1249a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // We're currently flushing, postpone the reset until that's 1250a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // completed. 1251a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1252a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d", 1253a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mFlushingAudio, mFlushingVideo); 1254a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1255a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber break; 1256a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1257a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1258a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber sp<Action> action = *mDeferredActions.begin(); 1259a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.erase(mDeferredActions.begin()); 1260a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1261a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber action->execute(this); 1262a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1263a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1264a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1265a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performSeek(int64_t seekTimeUs) { 1266a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)", 1267a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber seekTimeUs, 1268a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber seekTimeUs / 1E6); 1269a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1270a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mSource->seekTo(seekTimeUs); 1271a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1272a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mDriver != NULL) { 1273a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 1274a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (driver != NULL) { 1275a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber driver->notifyPosition(seekTimeUs); 1276a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber driver->notifySeekComplete(); 1277a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1278a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1279a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1280a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // everything's flushed, continue playback. 1281a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1282a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1283a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performDecoderFlush() { 1284a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("performDecoderFlush"); 1285a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1286da9740e63a835e610519bd235be9137d74b6d409Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 1287a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber return; 1288a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1289a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1290a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mTimeDiscontinuityPending = true; 1291a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1292a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mAudioDecoder != NULL) { 1293a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber flushDecoder(true /* audio */, false /* needShutdown */); 1294a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1295a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1296a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mVideoDecoder != NULL) { 1297a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber flushDecoder(false /* audio */, false /* needShutdown */); 1298a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1299a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1300a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 130114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid NuPlayer::performDecoderShutdown(bool audio, bool video) { 130214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ALOGV("performDecoderShutdown audio=%d, video=%d", audio, video); 1303a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 130414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if ((!audio || mAudioDecoder == NULL) 130514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber && (!video || mVideoDecoder == NULL)) { 1306a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber return; 1307a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1308a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1309a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mTimeDiscontinuityPending = true; 1310a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 131114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (mFlushingAudio == NONE && (!audio || mAudioDecoder == NULL)) { 131214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFlushingAudio = FLUSHED; 131314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 131414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 131514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (mFlushingVideo == NONE && (!video || mVideoDecoder == NULL)) { 131614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFlushingVideo = FLUSHED; 131714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 131814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 131914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (audio && mAudioDecoder != NULL) { 1320a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 1321a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1322a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 132314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (video && mVideoDecoder != NULL) { 1324a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 1325a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1326a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1327a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1328a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performReset() { 1329a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("performReset"); 1330a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1331a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber CHECK(mAudioDecoder == NULL); 1332a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber CHECK(mVideoDecoder == NULL); 1333a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1334a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber cancelPollDuration(); 1335a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1336a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ++mScanSourcesGeneration; 1337a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mScanSourcesPending = false; 1338a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1339a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mRenderer.clear(); 1340a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1341a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mSource != NULL) { 1342a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mSource->stop(); 1343b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 1344b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber looper()->unregisterHandler(mSource->id()); 1345b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 1346a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mSource.clear(); 1347a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1348a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1349a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mDriver != NULL) { 1350a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 1351a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (driver != NULL) { 1352a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber driver->notifyResetComplete(); 1353a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1354a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 135557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 135657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mStarted = false; 1357a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1358a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1359a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performScanSources() { 1360a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("performScanSources"); 1361a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 136257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (!mStarted) { 136357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber return; 136457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 136557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1366a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 1367a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber postScanSources(); 1368a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1369a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1370a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 137157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayer::performSetSurface(const sp<NativeWindowWrapper> &wrapper) { 137257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber ALOGV("performSetSurface"); 137357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 137457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mNativeWindow = wrapper; 137557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 137657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber // XXX - ignore error from setVideoScalingMode for now 137757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber setVideoScalingMode(mVideoScalingMode); 137857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 137957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (mDriver != NULL) { 138057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 138157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (driver != NULL) { 138257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber driver->notifySetSurfaceComplete(); 138357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 138457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 138557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber} 138657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 13879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::onSourceNotify(const sp<AMessage> &msg) { 13889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber int32_t what; 13899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(msg->findInt32("what", &what)); 13909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 13919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (what) { 13929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case Source::kWhatPrepared: 13939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 1394b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mSource == NULL) { 1395b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // This is a stale notification from a source that was 1396b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // asynchronously preparing when the client called reset(). 1397b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We handled the reset, the source is gone. 1398b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 1399b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 1400b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 1401ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber int32_t err; 1402ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber CHECK(msg->findInt32("err", &err)); 1403ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 14049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 14059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (driver != NULL) { 1406ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber driver->notifyPrepareCompleted(err); 14079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1408997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber 1409997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber int64_t durationUs; 1410997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 1411997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 1412997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber if (driver != NULL) { 1413997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber driver->notifyDuration(durationUs); 1414997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber } 1415997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber } 14169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 14179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 14189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case Source::kWhatFlagsChanged: 14209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 14219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber uint32_t flags; 14229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 14239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14244b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang sp<NuPlayerDriver> driver = mDriver.promote(); 14254b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang if (driver != NULL) { 14264b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang driver->notifyFlagsChanged(flags); 14274b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang } 14284b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang 14299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 14309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber && (!(flags & Source::FLAG_DYNAMIC_DURATION))) { 14319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber cancelPollDuration(); 14329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 14339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber && (flags & Source::FLAG_DYNAMIC_DURATION) 14349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 14359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber schedulePollDuration(); 14369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 14379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mSourceFlags = flags; 14399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 14409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 14419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case Source::kWhatVideoSizeChanged: 14439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 14449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber int32_t width, height; 14459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(msg->findInt32("width", &width)); 14469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(msg->findInt32("height", &height)); 14479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notifyListener(MEDIA_SET_VIDEO_SIZE, width, height); 14499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 14509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 14519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1452b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson case Source::kWhatBufferingStart: 1453b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson { 1454b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0); 1455b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson break; 1456b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 1457b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 1458b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson case Source::kWhatBufferingEnd: 1459b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson { 1460b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0); 1461b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson break; 1462b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 1463b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 1464dcb89b3b505522efde173c105a851c412f947178Chong Zhang case Source::kWhatSubtitleData: 1465dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 1466dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<ABuffer> buffer; 1467dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findBuffer("buffer", &buffer)); 1468dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1469dcb89b3b505522efde173c105a851c412f947178Chong Zhang int32_t trackIndex; 1470dcb89b3b505522efde173c105a851c412f947178Chong Zhang int64_t timeUs, durationUs; 1471dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex)); 1472dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 1473dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); 1474dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1475dcb89b3b505522efde173c105a851c412f947178Chong Zhang Parcel in; 1476dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt32(trackIndex); 1477dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt64(timeUs); 1478dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt64(durationUs); 1479dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt32(buffer->size()); 1480dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt32(buffer->size()); 1481dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.write(buffer->data(), buffer->size()); 1482dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1483dcb89b3b505522efde173c105a851c412f947178Chong Zhang notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); 1484dcb89b3b505522efde173c105a851c412f947178Chong Zhang break; 1485dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 1486dcb89b3b505522efde173c105a851c412f947178Chong Zhang 148714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber case Source::kWhatQueueDecoderShutdown: 148814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber { 148914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t audio, video; 149014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(msg->findInt32("audio", &audio)); 149114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(msg->findInt32("video", &video)); 149214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 149314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> reply; 149414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(msg->findMessage("reply", &reply)); 149514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 149614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber queueDecoderShutdown(audio, video, reply); 149714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber break; 149814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 149914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 15009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 15019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber TRESPASS(); 15029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 15039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 15049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1505b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber//////////////////////////////////////////////////////////////////////////////// 1506b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 15079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::Source::notifyFlagsChanged(uint32_t flags) { 15089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<AMessage> notify = dupNotify(); 15099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("what", kWhatFlagsChanged); 15109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("flags", flags); 15119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->post(); 15129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 15139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 15149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::Source::notifyVideoSizeChanged(int32_t width, int32_t height) { 15159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<AMessage> notify = dupNotify(); 15169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("what", kWhatVideoSizeChanged); 15179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("width", width); 15189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("height", height); 15199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->post(); 15209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 15219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1522ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Hubervoid NuPlayer::Source::notifyPrepared(status_t err) { 15239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<AMessage> notify = dupNotify(); 15249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("what", kWhatPrepared); 1525ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notify->setInt32("err", err); 15269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->post(); 15279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 15289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 152984333e0475bc911adc16417f4ca327c975cf6c36Andreas Hubervoid NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) { 1530b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber TRESPASS(); 1531b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber} 1532b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 153314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid NuPlayer::queueDecoderShutdown( 153414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool audio, bool video, const sp<AMessage> &reply) { 153514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video); 153614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 153714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mDeferredActions.push_back( 153814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber new ShutdownDecoderAction(audio, video)); 153914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 154014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mDeferredActions.push_back( 154114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber new SimpleAction(&NuPlayer::performScanSources)); 154214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 154314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mDeferredActions.push_back(new PostMessageAction(reply)); 154414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 154514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber processDeferredActions(); 154614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 154714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1548f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 1549