NuPlayer.cpp revision dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28
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 343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber#include <media/stagefright/foundation/hexdump.h> 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 37f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include <media/stagefright/MediaDefs.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaErrors.h> 40f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MetaData.h> 418ba01021b573889802e67e029225a96f0dfa471aAndy McFadden#include <gui/IGraphicBufferProducer.h> 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber#include "avc_utils.h" 443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 45840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include "ESDS.h" 46840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber#include <media/stagefright/Utils.h> 47840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 48f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::Action : public RefBase { 51a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber Action() {} 52a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 53a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber virtual void execute(NuPlayer *player) = 0; 54a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 55a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate: 56a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(Action); 57a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}; 58a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 59a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::SeekAction : public Action { 60a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber SeekAction(int64_t seekTimeUs) 61a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber : mSeekTimeUs(seekTimeUs) { 62a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 63a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 64a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber virtual void execute(NuPlayer *player) { 65a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber player->performSeek(mSeekTimeUs); 66a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 67a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 68a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate: 69a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber int64_t mSeekTimeUs; 70a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 71a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(SeekAction); 72a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}; 73a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 7457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huberstruct NuPlayer::SetSurfaceAction : public Action { 7557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber SetSurfaceAction(const sp<NativeWindowWrapper> &wrapper) 7657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber : mWrapper(wrapper) { 7757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 7857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 7957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber virtual void execute(NuPlayer *player) { 8057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber player->performSetSurface(mWrapper); 8157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 8257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 8357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huberprivate: 8457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber sp<NativeWindowWrapper> mWrapper; 8557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 8657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction); 8757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber}; 8857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct NuPlayer::ShutdownDecoderAction : public Action { 9014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ShutdownDecoderAction(bool audio, bool video) 9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber : mAudio(audio), 9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mVideo(video) { 9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual void execute(NuPlayer *player) { 9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber player->performDecoderShutdown(mAudio, mVideo); 9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate: 10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mAudio; 10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mVideo; 10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ShutdownDecoderAction); 10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}; 10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct NuPlayer::PostMessageAction : public Action { 10714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber PostMessageAction(const sp<AMessage> &msg) 10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber : mMessage(msg) { 10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber virtual void execute(NuPlayer *) { 11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mMessage->post(); 11314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate: 11614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> mMessage; 11714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(PostMessageAction); 11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}; 12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 121a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber// Use this if there's no state necessary to save in order to execute 122a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber// the action. 123a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberstruct NuPlayer::SimpleAction : public Action { 124a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber typedef void (NuPlayer::*ActionFunc)(); 125a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 126a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber SimpleAction(ActionFunc func) 127a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber : mFunc(func) { 128a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 129a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 130a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber virtual void execute(NuPlayer *player) { 131a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber (player->*mFunc)(); 132a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 133a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 134a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huberprivate: 135a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ActionFunc mFunc; 136a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 137a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(SimpleAction); 138a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber}; 139a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 142f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::NuPlayer() 1439b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber : mUIDValid(false), 1449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mSourceFlags(0), 1453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC(false), 1469b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mAudioEOS(false), 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS(false), 1485bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending(false), 1491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesGeneration(0), 150b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber mPollDurationGeneration(0), 1516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending(false), 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio(NONE), 1531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo(NONE), 1543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs(-1ll), 1553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs(-1ll), 1563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs(0ll), 1573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0ll), 1580d268a3cae145afb2720c88ae38fb81550be5584James Dong mNumFramesDropped(0ll), 15957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW), 16057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mStarted(false) { 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 163f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayer::~NuPlayer() { 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1669b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Hubervoid NuPlayer::setUID(uid_t uid) { 1679b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUIDValid = true; 1689b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mUID = uid; 1699b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 1709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 17143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 17243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDriver = driver; 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) { 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 178b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 179b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 180240abcc4bf661a10ffca24859945796acc76ac6eAndreas Huber msg->setObject("source", new StreamingSource(notify, source)); 1815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber msg->post(); 1825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber} 1835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 184afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huberstatic bool IsHTTPLiveURL(const char *url) { 185afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (!strncasecmp("http://", url, 7) 186997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber || !strncasecmp("https://", url, 8) 187997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber || !strncasecmp("file://", url, 7)) { 188afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber size_t len = strlen(url); 189afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 190afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 191afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 192afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 193afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (strstr(url,"m3u8")) { 194afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return true; 195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 196afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } 197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return false; 199afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 200afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 2019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync( 2021b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 2031b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 2041b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 2055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 2067a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé size_t len = strlen(url); 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 208b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 209b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 210afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<Source> source; 211afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber if (IsHTTPLiveURL(url)) { 21281e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber source = new HTTPLiveSource(notify, httpService, url, headers); 213afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber } else if (!strncasecmp(url, "rtsp://", 7)) { 2141b86fe063badb5f28c467ade39be0f4008688947Andreas Huber source = new RTSPSource( 2151b86fe063badb5f28c467ade39be0f4008688947Andreas Huber notify, httpService, url, headers, mUIDValid, mUID); 2167a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé } else if ((!strncasecmp(url, "http://", 7) 2177a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé || !strncasecmp(url, "https://", 8)) 2187a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) 2197a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé || strstr(url, ".sdp?"))) { 2201b86fe063badb5f28c467ade39be0f4008688947Andreas Huber source = new RTSPSource( 2211b86fe063badb5f28c467ade39be0f4008688947Andreas Huber notify, httpService, url, headers, mUIDValid, mUID, true); 2222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } else { 22381e68448f3361eaf8618930471fdc3c21bdf5cbcAndreas Huber source = new GenericSource(notify, httpService, url, headers); 2242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber } 2252bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 226afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 227afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->post(); 228afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber} 229afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) { 231afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 232afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 233b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 234b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 235b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber sp<Source> source = new GenericSource(notify, fd, offset, length); 236afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber msg->setObject("source", source); 237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::prepareAsync() { 2419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber (new AMessage(kWhatPrepare, id()))->post(); 2429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 2439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 24457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayer::setVideoSurfaceTextureAsync( 2458ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 2461173118eace0e9e347cb007f0da817cee87579edGlenn Kasten sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 24757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 2488ba01021b573889802e67e029225a96f0dfa471aAndy McFadden if (bufferProducer == NULL) { 24957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber msg->setObject("native-window", NULL); 25057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } else { 25157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber msg->setObject( 25257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber "native-window", 25357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber new NativeWindowWrapper( 2541a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian new Surface(bufferProducer))); 25557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 25657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 260f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 261f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setObject("sink", sink); 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 266f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::start() { 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (new AMessage(kWhatStart, id()))->post(); 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 27043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::pause() { 271b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatPause, id()))->post(); 27243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 27343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 27443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::resume() { 275b408222bd9479c291874b607acae1425d6154fe7Andreas Huber (new AMessage(kWhatResume, id()))->post(); 27643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 27743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::resetAsync() { 2791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (new AMessage(kWhatReset, id()))->post(); 2801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 2811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 28243c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 28343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<AMessage> msg = new AMessage(kWhatSeek, id()); 28443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->setInt64("seekTimeUs", seekTimeUs); 28543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber msg->post(); 28643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 28743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 28853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber// static 2891aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huberbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 29053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber switch (state) { 29153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber case FLUSHING_DECODER: 2921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 2931aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = false; 29453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 29553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 29653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 2971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case FLUSHING_DECODER_SHUTDOWN: 2981aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown != NULL) { 2991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber *needShutdown = true; 30053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 30153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return true; 30253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 30353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber default: 30453df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber return false; 30553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 30653df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber} 30753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 308f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetDataSource: 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 3123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetDataSource"); 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mSource == NULL); 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3165bc087c573c70c84c6a39946457590b42d392a33Andreas Huber sp<RefBase> obj; 3175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber CHECK(msg->findObject("source", &obj)); 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3195bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource = static_cast<Source *>(obj.get()); 320b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 321b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber looper()->registerHandler(mSource); 3229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(mDriver != NULL); 3249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 3259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (driver != NULL) { 3269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber driver->notifySetDataSourceCompleted(OK); 3279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 3289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 3299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 3309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case kWhatPrepare: 3329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 3339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mSource->prepareAsync(); 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337dcb89b3b505522efde173c105a851c412f947178Chong Zhang case kWhatGetTrackInfo: 338dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 339dcb89b3b505522efde173c105a851c412f947178Chong Zhang uint32_t replyID; 340dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->senderAwaitsResponse(&replyID)); 341dcb89b3b505522efde173c105a851c412f947178Chong Zhang 342dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = INVALID_OPERATION; 343dcb89b3b505522efde173c105a851c412f947178Chong Zhang if (mSource != NULL) { 344dcb89b3b505522efde173c105a851c412f947178Chong Zhang Parcel* reply; 345dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findPointer("reply", (void**)&reply)); 346dcb89b3b505522efde173c105a851c412f947178Chong Zhang err = mSource->getTrackInfo(reply); 347dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 348dcb89b3b505522efde173c105a851c412f947178Chong Zhang 349dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> response = new AMessage; 350dcb89b3b505522efde173c105a851c412f947178Chong Zhang response->setInt32("err", err); 351dcb89b3b505522efde173c105a851c412f947178Chong Zhang 352dcb89b3b505522efde173c105a851c412f947178Chong Zhang response->postReply(replyID); 353dcb89b3b505522efde173c105a851c412f947178Chong Zhang break; 354dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 355dcb89b3b505522efde173c105a851c412f947178Chong Zhang 356dcb89b3b505522efde173c105a851c412f947178Chong Zhang case kWhatSelectTrack: 357dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 358dcb89b3b505522efde173c105a851c412f947178Chong Zhang uint32_t replyID; 359dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->senderAwaitsResponse(&replyID)); 360dcb89b3b505522efde173c105a851c412f947178Chong Zhang 361dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = INVALID_OPERATION; 362dcb89b3b505522efde173c105a851c412f947178Chong Zhang if (mSource != NULL) { 363dcb89b3b505522efde173c105a851c412f947178Chong Zhang size_t trackIndex; 364dcb89b3b505522efde173c105a851c412f947178Chong Zhang int32_t select; 365dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findSize("trackIndex", &trackIndex)); 366dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findInt32("select", &select)); 367dcb89b3b505522efde173c105a851c412f947178Chong Zhang err = mSource->selectTrack(trackIndex, select); 368dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 369dcb89b3b505522efde173c105a851c412f947178Chong Zhang 370dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> response = new AMessage; 371dcb89b3b505522efde173c105a851c412f947178Chong Zhang response->setInt32("err", err); 372dcb89b3b505522efde173c105a851c412f947178Chong Zhang 373dcb89b3b505522efde173c105a851c412f947178Chong Zhang response->postReply(replyID); 374dcb89b3b505522efde173c105a851c412f947178Chong Zhang break; 375dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 376dcb89b3b505522efde173c105a851c412f947178Chong Zhang 377b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber case kWhatPollDuration: 378b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber { 379b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int32_t generation; 380b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber CHECK(msg->findInt32("generation", &generation)); 381b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 382b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (generation != mPollDurationGeneration) { 383b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // stale 384b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber break; 385b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 386b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 387b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber int64_t durationUs; 388b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 389b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 390b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (driver != NULL) { 391b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber driver->notifyDuration(durationUs); 392b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 393b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 394b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 395b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->post(1000000ll); // poll again in a second. 396b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber break; 397b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 398b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 3991173118eace0e9e347cb007f0da817cee87579edGlenn Kasten case kWhatSetVideoNativeWindow: 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetVideoNativeWindow"); 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 40357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mDeferredActions.push_back( 40414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber new ShutdownDecoderAction( 40514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber false /* audio */, true /* video */)); 40657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 4081173118eace0e9e347cb007f0da817cee87579edGlenn Kasten CHECK(msg->findObject("native-window", &obj)); 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mDeferredActions.push_back( 41157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber new SetSurfaceAction( 41257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()))); 41357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 41457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (obj != NULL) { 41557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber // If there is a new surface texture, instantiate decoders 41657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber // again if possible. 41757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mDeferredActions.push_back( 41857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber new SimpleAction(&NuPlayer::performScanSources)); 41957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 4200d268a3cae145afb2720c88ae38fb81550be5584James Dong 42157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber processDeferredActions(); 422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatSetAudioSink: 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatSetAudioSink"); 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<RefBase> obj; 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findObject("sink", &obj)); 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatStart: 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatStart"); 43943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 4403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoIsAVC = false; 4411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mAudioEOS = false; 4421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mVideoEOS = false; 44332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 44432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 4453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 4463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = 0; 4473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = 0; 44857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mStarted = true; 4491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4505bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mSource->start(); 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 452d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber uint32_t flags = 0; 453d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 454d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber if (mSource->isRealTime()) { 455d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber flags |= Renderer::FLAG_REAL_TIME; 456d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber } 457d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer = new Renderer( 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioSink, 460d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber new AMessage(kWhatRendererNotify, id()), 461d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber flags); 462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber looper()->registerHandler(mRenderer); 464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber postScanSources(); 466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 469f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatScanSources: 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber int32_t generation; 4721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(msg->findInt32("generation", &generation)); 4731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (generation != mScanSourcesGeneration) { 4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Drop obsolete msg. 4751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 4761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4785bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = false; 4795bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 4803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 48143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mAudioDecoder != NULL, mVideoDecoder != NULL); 48243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 483b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber bool mHadAnySourcesBefore = 484b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber (mAudioDecoder != NULL) || (mVideoDecoder != NULL); 485b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 4865d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George if (mNativeWindow != NULL) { 4875d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George instantiateDecoder(false, &mVideoDecoder); 4885d246efa220a7c7b22e490576c488b3853c664ddHaynes Mathew George } 489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mAudioSink != NULL) { 4915bc087c573c70c84c6a39946457590b42d392a33Andreas Huber instantiateDecoder(true, &mAudioDecoder); 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 494b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber if (!mHadAnySourcesBefore 495b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 496b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber // This is the first time we've found anything playable. 497b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 4989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) { 499b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber schedulePollDuration(); 500b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 501b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber } 502b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 503eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber status_t err; 504eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if ((err = mSource->feedMoreTSData()) != OK) { 5051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 5061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // We're not currently decoding anything (no audio or 5071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // video tracks found) and we just ran out of input data. 508eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber 509eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (err == ERROR_END_OF_STREAM) { 510eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 511eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } else { 512eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 513eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber } 5141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 518fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber if ((mAudioDecoder == NULL && mAudioSink != NULL) 519fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber || (mVideoDecoder == NULL && mNativeWindow != NULL)) { 520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(100000ll); 5215bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mScanSourcesPending = true; 522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatVideoNotify: 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatAudioNotify: 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool audio = msg->what() == kWhatAudioNotify; 530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 5321cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar CHECK(msg->findInt32("what", &what)); 533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5341cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar if (what == Decoder::kWhatFillThisBuffer) { 535f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = feedDecoderInputData( 5361cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar audio, msg); 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber if (err == -EWOULDBLOCK) { 539eac68baf095aeef54865c28b6888924dc6295cbdAndreas Huber if (mSource->feedMoreTSData() == OK) { 5401183a4ab06b9fe01fe39a4b8728bfc71789361fcAndreas Huber msg->post(10000ll); 5415bc087c573c70c84c6a39946457590b42d392a33Andreas Huber } 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5431cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar } else if (what == Decoder::kWhatEOS) { 544dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber int32_t err; 5451cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar CHECK(msg->findInt32("err", &err)); 546dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 547dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err == ERROR_END_OF_STREAM) { 5483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 549dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 5503856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("got %s decoder EOS w/ error %d", 551dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber audio ? "audio" : "video", 552dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber err); 553dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 554dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 555dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mRenderer->queueEOS(audio, err); 5561cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar } else if (what == Decoder::kWhatFlushCompleted) { 5571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber bool needShutdown; 55853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 5601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 561f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingAudio = FLUSHED; 562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingVideo = FLUSHED; 5653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mVideoLateByUs = 0; 567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (needShutdown) { 5723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initiating %s decoder shutdown", 57353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber audio ? "audio" : "video"); 574f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57553df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if (audio) { 57853df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingAudio = SHUTTING_DOWN_DECODER; 57953df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } else { 58053df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber mFlushingVideo = SHUTTING_DOWN_DECODER; 58153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber } 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 5843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 5851cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar } else if (what == Decoder::kWhatOutputFormatChanged) { 5861cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar sp<AMessage> format; 5871cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar CHECK(msg->findMessage("format", &format)); 5881cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar 58931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (audio) { 59031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t numChannels; 5911cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar CHECK(format->findInt32( 592516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "channel-count", &numChannels)); 5932c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 59431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t sampleRate; 5951cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar CHECK(format->findInt32("sample-rate", &sampleRate)); 5962c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 5973856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Audio output format changed to %d Hz, %d channels", 59831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber sampleRate, numChannels); 5992c2814b900a61fa07ddfff860b143fbbe9c740e9Andreas Huber 60031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->close(); 6011948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 6021948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent audio_output_flags_t flags; 6031948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent int64_t durationUs; 604516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // FIXME: we should handle the case where the video decoder 605516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // is created after we receive the format change indication. 606516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // Current code will just make that we select deep buffer 607516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // with video which should not be a problem as it should 6081948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent // not prevent from keeping A/V sync. 6091948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent if (mVideoDecoder == NULL && 6101948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent mSource->getDuration(&durationUs) == OK && 611516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber durationUs 612516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) { 6131948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER; 6141948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent } else { 6151948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags = AUDIO_OUTPUT_FLAG_NONE; 6161948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent } 6171948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 6189806555d3930be43e11106281dee354820ac1c88Andreas Huber int32_t channelMask; 6191cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar if (!format->findInt32("channel-mask", &channelMask)) { 6209806555d3930be43e11106281dee354820ac1c88Andreas Huber channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER; 6219806555d3930be43e11106281dee354820ac1c88Andreas Huber } 6229806555d3930be43e11106281dee354820ac1c88Andreas Huber 623078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber CHECK_EQ(mAudioSink->open( 624078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber sampleRate, 625078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber numChannels, 6269806555d3930be43e11106281dee354820ac1c88Andreas Huber (audio_channel_mask_t)channelMask, 627078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber AUDIO_FORMAT_PCM_16_BIT, 6281948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent 8 /* bufferCount */, 6291948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent NULL, 6301948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent NULL, 6311948eb3ea6eee336e8cdab9b0c693f93f5f19993Eric Laurent flags), 632078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber (status_t)OK); 63331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mAudioSink->start(); 6343831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 63531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mRenderer->signalAudioSinkChanged(); 63631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else { 63731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber // video 63831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 63931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t width, height; 6401cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar CHECK(format->findInt32("width", &width)); 6411cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar CHECK(format->findInt32("height", &height)); 64231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 64331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber int32_t cropLeft, cropTop, cropRight, cropBottom; 6441cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar CHECK(format->findRect( 64531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber "crop", 64631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber &cropLeft, &cropTop, &cropRight, &cropBottom)); 64731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 648516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber int32_t displayWidth = cropRight - cropLeft + 1; 649516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber int32_t displayHeight = cropBottom - cropTop + 1; 650516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 6513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Video output format changed to %d x %d " 652cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(crop: %d x %d @ (%d, %d))", 65331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber width, height, 654516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber displayWidth, 655516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber displayHeight, 656cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber cropLeft, cropTop); 65731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 658516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber sp<AMessage> videoInputFormat = 659516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber mSource->getFormat(false /* audio */); 660516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 661516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber // Take into account sample aspect ratio if necessary: 662516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber int32_t sarWidth, sarHeight; 663516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (videoInputFormat->findInt32("sar-width", &sarWidth) 664516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber && videoInputFormat->findInt32( 665516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "sar-height", &sarHeight)) { 666516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGV("Sample aspect ratio %d : %d", 667516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber sarWidth, sarHeight); 668516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 669516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber displayWidth = (displayWidth * sarWidth) / sarHeight; 670516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 671516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGV("display dimensions %d x %d", 672516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber displayWidth, displayHeight); 673516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber } 674516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber 67531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notifyListener( 676516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber MEDIA_SET_VIDEO_SIZE, displayWidth, displayHeight); 67731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 6781cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar } else if (what == Decoder::kWhatShutdownCompleted) { 6793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("%s shutdown completed", audio ? "audio" : "video"); 6803831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (audio) { 6813831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder.clear(); 6823831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6833831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 6843831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = SHUT_DOWN; 6853831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } else { 6863831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder.clear(); 6873831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6883831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 6893831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = SHUT_DOWN; 6903831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 6913831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 6923831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber finishFlushIfPossible(); 6931cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar } else if (what == Decoder::kWhatError) { 69429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Received error from %s decoder, aborting playback.", 695c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video"); 696c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 697c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mRenderer->queueEOS(audio, UNKNOWN_ERROR); 6981cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar } else if (what == Decoder::kWhatDrainThisBuffer) { 6991cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar renderBuffer(audio, msg); 7001cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar } else { 7011cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar ALOGV("Unhandled decoder notification %d '%c%c%c%c'.", 702a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber what, 703a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber what >> 24, 704a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber (what >> 16) & 0xff, 705a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber (what >> 8) & 0xff, 706a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber what & 0xff); 707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatRendererNotify: 713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t what; 715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("what", &what)); 716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (what == Renderer::kWhatEOS) { 718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 721c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber int32_t finalResult; 722c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK(msg->findInt32("finalResult", &finalResult)); 723c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (audio) { 725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mAudioEOS = true; 726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mVideoEOS = true; 728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 730c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (finalResult == ERROR_END_OF_STREAM) { 7313856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reached %s EOS", audio ? "audio" : "video"); 732c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } else { 73329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("%s track encountered an error (%d)", 734c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber audio ? "audio" : "video", finalResult); 735c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 736c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber notifyListener( 737c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 738c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if ((mAudioEOS || mAudioDecoder == NULL) 741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && (mVideoEOS || mVideoDecoder == NULL)) { 742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 74443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else if (what == Renderer::kWhatPosition) { 74543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t positionUs; 74643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("positionUs", &positionUs)); 74743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 7483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 7493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 75043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver != NULL) { 75143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 75243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver != NULL) { 75343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber driver->notifyPosition(positionUs); 7543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber driver->notifyFrameStats( 7563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, mNumFramesDropped); 75743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 75843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 7593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (what == Renderer::kWhatFlushComplete) { 760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t audio; 761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("audio", &audio)); 762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7633856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 764f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong } else if (what == Renderer::kWhatVideoRenderingStart) { 765f57b4ea3e409537b1d5f9aaea93d356b1cebbc6aJames Dong notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0); 766cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar } else if (what == Renderer::kWhatMediaRenderingStart) { 767cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar ALOGV("media rendering started"); 768cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_STARTED, 0, 0); 769f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 770f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 771f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 772f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatMoreDataQueued: 774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 7781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber case kWhatReset: 7791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber { 7803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("kWhatReset"); 7811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 782a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_back( 78314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber new ShutdownDecoderAction( 78414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber true /* audio */, true /* video */)); 785b58ce9f5e8d0696f9571a94ba5fc05f4500f663fAndreas Huber 786a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_back( 787a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber new SimpleAction(&NuPlayer::performReset)); 7881aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 789a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber processDeferredActions(); 7901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber break; 7911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 7921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 79343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case kWhatSeek: 79443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 79543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs; 79643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 79743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 798a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("kWhatSeek seekTimeUs=%lld us", seekTimeUs); 79943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 800a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_back( 801a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber new SimpleAction(&NuPlayer::performDecoderFlush)); 80243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 803a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_back(new SeekAction(seekTimeUs)); 80443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 805a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber processDeferredActions(); 80643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 80743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 80843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 809b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatPause: 810b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 811b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 812fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson mSource->pause(); 813b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->pause(); 814b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 815b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 816b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 817b408222bd9479c291874b607acae1425d6154fe7Andreas Huber case kWhatResume: 818b408222bd9479c291874b607acae1425d6154fe7Andreas Huber { 819b408222bd9479c291874b607acae1425d6154fe7Andreas Huber CHECK(mRenderer != NULL); 820fba60daf77cc74a13ae3bf4b0e9925dd2ee4470cRoger Jönsson mSource->resume(); 821b408222bd9479c291874b607acae1425d6154fe7Andreas Huber mRenderer->resume(); 822b408222bd9479c291874b607acae1425d6154fe7Andreas Huber break; 823b408222bd9479c291874b607acae1425d6154fe7Andreas Huber } 824b408222bd9479c291874b607acae1425d6154fe7Andreas Huber 825b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber case kWhatSourceNotify: 826b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber { 8279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber onSourceNotify(msg); 828b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber break; 829b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber } 830b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8373831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Hubervoid NuPlayer::finishFlushIfPossible() { 8383831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 8393831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 8403831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 8413831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 8423831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 8433831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber return; 8443831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 8453831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 8463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("both audio and video are flushed now."); 8473831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 8486e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (mTimeDiscontinuityPending) { 8496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mRenderer->signalTimeDiscontinuity(); 8506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = false; 8516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 8523831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 85322fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mAudioDecoder != NULL) { 8543831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mAudioDecoder->signalResume(); 8553831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 8563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 85722fc52f6f72f39e33c3970d0291de3569118aa5cAndreas Huber if (mVideoDecoder != NULL) { 8583831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mVideoDecoder->signalResume(); 8593831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber } 8603831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 8613831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingAudio = NONE; 8623831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber mFlushingVideo = NONE; 863f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 864a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber processDeferredActions(); 8651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 8661aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8671aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::postScanSources() { 8681aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mScanSourcesPending) { 8691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber return; 870f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 8711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 8731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->setInt32("generation", mScanSourcesGeneration); 8741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber msg->post(); 8751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 8761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mScanSourcesPending = true; 877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 878f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8795bc087c573c70c84c6a39946457590b42d392a33Andreas Huberstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 880f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (*decoder != NULL) { 881f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 882f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 883f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 884840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<AMessage> format = mSource->getFormat(audio); 885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 886840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (format == NULL) { 887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return -EWOULDBLOCK; 888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 8903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 891840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber AString mime; 892840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber CHECK(format->findString("mime", &mime)); 893840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str()); 8943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 8953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = 897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 898f933441648ef6a71dee783d733aac17b9508b452Andreas Huber id()); 899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten *decoder = audio ? new Decoder(notify) : 9011173118eace0e9e347cb007f0da817cee87579edGlenn Kasten new Decoder(notify, mNativeWindow); 9021cd139824b2e6832f239cd27d8962d3239053c02Lajos Molnar (*decoder)->init(); 903840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber (*decoder)->configure(format); 904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 907f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 908f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 911f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 91253df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber if ((audio && IsFlushingState(mFlushingAudio)) 91353df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber || (!audio && IsFlushingState(mFlushingVideo))) { 914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->setInt32("err", INFO_DISCONTINUITY); 915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<ABuffer> accessUnit; 920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool dropAccessUnit; 9223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber do { 9233fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 9245bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 9253fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == -EWOULDBLOCK) { 9263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return err; 9273fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else if (err != OK) { 9283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (err == INFO_DISCONTINUITY) { 9293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int32_t type; 9303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 93153df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 9323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber bool formatChange = 9336e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (audio && 9346e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT)) 9356e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber || (!audio && 9366e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT)); 93753df1a460bcfdd129ca2bc416dee2009e35c042eAndreas Huber 9386e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0; 9396e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 940df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("%s discontinuity (formatChange=%d, time=%d)", 9416e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", formatChange, timeChange); 94232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 9433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (audio) { 9443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = -1; 9453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } else { 9463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = -1; 9473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 94832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 9496e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (timeChange) { 9506e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber sp<AMessage> extra; 9516e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (accessUnit->meta()->findMessage("extra", &extra) 9526e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber && extra != NULL) { 9536e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber int64_t resumeAtMediaTimeUs; 9546e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (extra->findInt64( 9556e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 956df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("suppressing rendering of %s until %lld us", 9576e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video", resumeAtMediaTimeUs); 9586e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9596e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 9606e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingAudioUntilMediaTimeUs = 9616e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 9626e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 9636e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mSkipRenderingVideoUntilMediaTimeUs = 9646e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber resumeAtMediaTimeUs; 9656e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 9663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 96732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 96832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 9693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 9706e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending = 9716e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mTimeDiscontinuityPending || timeChange; 9726e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9736e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (formatChange || timeChange) { 974a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mFlushingAudio == NONE && mFlushingVideo == NONE) { 975a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // And we'll resume scanning sources once we're done 976a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // flushing. 977a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.push_front( 978a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber new SimpleAction( 979a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber &NuPlayer::performScanSources)); 980a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 981a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 9826d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih sp<AMessage> newFormat = mSource->getFormat(audio); 9836d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih sp<Decoder> &decoder = audio ? mAudioDecoder : mVideoDecoder; 9846d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih if (formatChange && !decoder->supportsSeamlessFormatChange(newFormat)) { 9856d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih flushDecoder(audio, /* needShutdown = */ true); 9866d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih } else { 9876d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih flushDecoder(audio, /* needShutdown = */ false); 9886d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih err = OK; 9896d0a94ead4f6e62b8ca9b2b1d775ffcd0a7a7aabRobert Shih } 9906e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 9916e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber // This stream is unaffected by the discontinuity 9926e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9936e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if (audio) { 9946e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingAudio = FLUSHED; 9956e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } else { 9966e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber mFlushingVideo = FLUSHED; 9976e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 9986e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 9996e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber finishFlushIfPossible(); 10006e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 10016e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber return -EWOULDBLOCK; 10026e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 100332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 100432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 10053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->setInt32("err", err); 10063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber reply->post(); 10073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 1008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio) { 10113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesTotal; 10123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 10133fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 10143fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = false; 10153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber if (!audio 10163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoLateByUs > 100000ll 10173fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && mVideoIsAVC 10183fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber && !IsAVCReferenceFrame(accessUnit)) { 10193fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber dropAccessUnit = true; 10203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ++mNumFramesDropped; 10213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } 10223fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber } while (dropAccessUnit); 1023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t mediaTimeUs; 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 10293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("feeding %s input buffer at media time %.2f secs", 1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber audio ? "audio" : "video", 1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mediaTimeUs / 1E6); 1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10342d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", accessUnit); 1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber reply->post(); 1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1040f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 10413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block // ALOGV("renderBuffer %s", audio ? "audio" : "video"); 1042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> reply; 1044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findMessage("reply", &reply)); 1045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 104618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 104718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // We're currently attempting to flush the decoder, in order 104818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // to complete this, the decoder wants all its buffers back, 104918ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // so we don't want any output buffers it sent us (from before 105018ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber // we initiated the flush) to be stuck in the renderer's queue. 105118ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 10523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("we're still flushing the %s decoder, sending its output buffer" 105318ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber " right back.", audio ? "audio" : "video"); 105418ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 105518ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber reply->post(); 105618ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber return; 105718ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber } 105818ac5407da14dad9731f40ffc9a56bee73830019Andreas Huber 10592d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 10602d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 106232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t &skipUntilMediaTimeUs = 106332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio 106432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber ? mSkipRenderingAudioUntilMediaTimeUs 106532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber : mSkipRenderingVideoUntilMediaTimeUs; 106632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 106732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (skipUntilMediaTimeUs >= 0) { 106832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber int64_t mediaTimeUs; 106932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 107032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 107132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber if (mediaTimeUs < skipUntilMediaTimeUs) { 10723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("dropping %s buffer at time %lld as requested.", 107332f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber audio ? "audio" : "video", 107432f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber mediaTimeUs); 107532f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 107632f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber reply->post(); 107732f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber return; 107832f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 107932f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 108032f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber skipUntilMediaTimeUs = -1; 108132f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber } 108232f3cefa373cd55e63deda36ca9d07c7fe22eaafAndreas Huber 1083f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mRenderer->queueBuffer(audio, buffer, reply); 1084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1086dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayer::notifyListener(int msg, int ext1, int ext2, const Parcel *in) { 108743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDriver == NULL) { 1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 1092f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (driver == NULL) { 1094f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 1095f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1096f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1097dcb89b3b505522efde173c105a851c412f947178Chong Zhang driver->notifyListener(msg, ext1, ext2, in); 1098f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1099f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Hubervoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 110114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ALOGV("[%s] flushDecoder needShutdown=%d", 110214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber audio ? "audio" : "video", needShutdown); 110314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 11046e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) { 1105df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block ALOGI("flushDecoder %s without decoder present", 11066e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber audio ? "audio" : "video"); 11076e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber } 11086e3d311b6631b12aac2879d1b08c3534aece78b1Andreas Huber 11091aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber // Make sure we don't continue to scan sources until we finish flushing. 11101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ++mScanSourcesGeneration; 111143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mScanSourcesPending = false; 11121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11131aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 11141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mRenderer->flush(audio); 11151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber FlushStatus newStatus = 11171aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 11181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (audio) { 11201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingAudio == NONE 11211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingAudio == AWAITING_DISCONTINUITY); 11221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = newStatus; 11241aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingVideo == NONE) { 11261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = (mVideoDecoder != NULL) 11271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 11281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 11291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 11301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } else { 11311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mFlushingVideo == NONE 11321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY); 11331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingVideo = newStatus; 11351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 11361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber if (mFlushingAudio == NONE) { 11371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mFlushingAudio = (mAudioDecoder != NULL) 11381aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber ? AWAITING_DISCONTINUITY 11391aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : FLUSHED; 11401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 11411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 11421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 11431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 1144840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Hubersp<AMessage> NuPlayer::Source::getFormat(bool audio) { 1145840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<MetaData> meta = getFormatMeta(audio); 1146840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 1147840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if (meta == NULL) { 1148840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return NULL; 1149840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 1150840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 1151840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber sp<AMessage> msg = new AMessage; 1152840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 1153840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber if(convertMetaDataToMessage(meta, &msg) == OK) { 1154840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return msg; 1155840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber } 1156840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber return NULL; 1157840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber} 1158840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 11590d268a3cae145afb2720c88ae38fb81550be5584James Dongstatus_t NuPlayer::setVideoScalingMode(int32_t mode) { 11600d268a3cae145afb2720c88ae38fb81550be5584James Dong mVideoScalingMode = mode; 116157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (mNativeWindow != NULL) { 11620d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = native_window_set_scaling_mode( 11630d268a3cae145afb2720c88ae38fb81550be5584James Dong mNativeWindow->getNativeWindow().get(), mVideoScalingMode); 11640d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 11650d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to set scaling mode (%d): %s", 11660d268a3cae145afb2720c88ae38fb81550be5584James Dong -ret, strerror(-ret)); 11670d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 11680d268a3cae145afb2720c88ae38fb81550be5584James Dong } 11690d268a3cae145afb2720c88ae38fb81550be5584James Dong } 11700d268a3cae145afb2720c88ae38fb81550be5584James Dong return OK; 11710d268a3cae145afb2720c88ae38fb81550be5584James Dong} 11720d268a3cae145afb2720c88ae38fb81550be5584James Dong 1173dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::getTrackInfo(Parcel* reply) const { 1174dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> msg = new AMessage(kWhatGetTrackInfo, id()); 1175dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->setPointer("reply", reply); 1176dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1177dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> response; 1178dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = msg->postAndAwaitResponse(&response); 1179dcb89b3b505522efde173c105a851c412f947178Chong Zhang return err; 1180dcb89b3b505522efde173c105a851c412f947178Chong Zhang} 1181dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1182dcb89b3b505522efde173c105a851c412f947178Chong Zhangstatus_t NuPlayer::selectTrack(size_t trackIndex, bool select) { 1183dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> msg = new AMessage(kWhatSelectTrack, id()); 1184dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->setSize("trackIndex", trackIndex); 1185dcb89b3b505522efde173c105a851c412f947178Chong Zhang msg->setInt32("select", select); 1186dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1187dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<AMessage> response; 1188dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t err = msg->postAndAwaitResponse(&response); 1189dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1190dcb89b3b505522efde173c105a851c412f947178Chong Zhang return err; 1191dcb89b3b505522efde173c105a851c412f947178Chong Zhang} 1192dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1193b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::schedulePollDuration() { 1194b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber sp<AMessage> msg = new AMessage(kWhatPollDuration, id()); 1195b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->setInt32("generation", mPollDurationGeneration); 1196b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber msg->post(); 1197b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber} 1198b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 1199b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Hubervoid NuPlayer::cancelPollDuration() { 1200b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber ++mPollDurationGeneration; 1201b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber} 1202b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 1203a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::processDeferredActions() { 1204a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber while (!mDeferredActions.empty()) { 1205a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // We won't execute any deferred actions until we're no longer in 1206a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // an intermediate state, i.e. one more more decoders are currently 1207a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // flushing or shutting down. 1208a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1209a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mRenderer != NULL) { 1210a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // There's an edge case where the renderer owns all output 1211a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // buffers and is paused, therefore the decoder will not read 1212a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // more input data and will never encounter the matching 1213a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // discontinuity. To avoid this, we resume the renderer. 1214a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1215a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mFlushingAudio == AWAITING_DISCONTINUITY 1216a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber || mFlushingVideo == AWAITING_DISCONTINUITY) { 1217a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mRenderer->resume(); 1218a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1219a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1220a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1221a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 1222a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // We're currently flushing, postpone the reset until that's 1223a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // completed. 1224a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1225a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d", 1226a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mFlushingAudio, mFlushingVideo); 1227a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1228a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber break; 1229a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1230a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1231a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber sp<Action> action = *mDeferredActions.begin(); 1232a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mDeferredActions.erase(mDeferredActions.begin()); 1233a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1234a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber action->execute(this); 1235a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1236a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1237a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1238a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performSeek(int64_t seekTimeUs) { 1239a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)", 1240a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber seekTimeUs, 1241a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber seekTimeUs / 1E6); 1242a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1243a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mSource->seekTo(seekTimeUs); 1244a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1245a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mDriver != NULL) { 1246a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 1247a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (driver != NULL) { 1248a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber driver->notifyPosition(seekTimeUs); 1249a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber driver->notifySeekComplete(); 1250a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1251a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1252a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1253a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber // everything's flushed, continue playback. 1254a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1255a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1256a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performDecoderFlush() { 1257a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("performDecoderFlush"); 1258a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1259da9740e63a835e610519bd235be9137d74b6d409Andreas Huber if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 1260a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber return; 1261a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1262a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1263a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mTimeDiscontinuityPending = true; 1264a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1265a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mAudioDecoder != NULL) { 1266a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber flushDecoder(true /* audio */, false /* needShutdown */); 1267a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1268a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1269a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mVideoDecoder != NULL) { 1270a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber flushDecoder(false /* audio */, false /* needShutdown */); 1271a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1272a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1273a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 127414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid NuPlayer::performDecoderShutdown(bool audio, bool video) { 127514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ALOGV("performDecoderShutdown audio=%d, video=%d", audio, video); 1276a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 127714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if ((!audio || mAudioDecoder == NULL) 127814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber && (!video || mVideoDecoder == NULL)) { 1279a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber return; 1280a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1281a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1282a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mTimeDiscontinuityPending = true; 1283a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 128414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (mFlushingAudio == NONE && (!audio || mAudioDecoder == NULL)) { 128514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFlushingAudio = FLUSHED; 128614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 128714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 128814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (mFlushingVideo == NONE && (!video || mVideoDecoder == NULL)) { 128914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mFlushingVideo = FLUSHED; 129014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 129114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 129214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (audio && mAudioDecoder != NULL) { 1293a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber flushDecoder(true /* audio */, true /* needShutdown */); 1294a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1295a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 129614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber if (video && mVideoDecoder != NULL) { 1297a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber flushDecoder(false /* audio */, true /* needShutdown */); 1298a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1299a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1300a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1301a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performReset() { 1302a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("performReset"); 1303a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1304a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber CHECK(mAudioDecoder == NULL); 1305a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber CHECK(mVideoDecoder == NULL); 1306a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1307a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber cancelPollDuration(); 1308a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1309a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ++mScanSourcesGeneration; 1310a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mScanSourcesPending = false; 1311a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1312a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mRenderer.clear(); 1313a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1314a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mSource != NULL) { 1315a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mSource->stop(); 1316b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 1317b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber looper()->unregisterHandler(mSource->id()); 1318b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 1319a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber mSource.clear(); 1320a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1321a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1322a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mDriver != NULL) { 1323a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 1324a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (driver != NULL) { 1325a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber driver->notifyResetComplete(); 1326a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1327a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 132857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 132957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mStarted = false; 1330a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1331a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 1332a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Hubervoid NuPlayer::performScanSources() { 1333a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber ALOGV("performScanSources"); 1334a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 133557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (!mStarted) { 133657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber return; 133757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 133857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1339a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 1340a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber postScanSources(); 1341a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber } 1342a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber} 1343a1f8ab0ad670c30e57f3f072df13df66fe4f4910Andreas Huber 134457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayer::performSetSurface(const sp<NativeWindowWrapper> &wrapper) { 134557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber ALOGV("performSetSurface"); 134657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 134757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mNativeWindow = wrapper; 134857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 134957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber // XXX - ignore error from setVideoScalingMode for now 135057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber setVideoScalingMode(mVideoScalingMode); 135157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 135257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (mDriver != NULL) { 135357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 135457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (driver != NULL) { 135557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber driver->notifySetSurfaceComplete(); 135657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 135757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 135857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber} 135957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 13609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::onSourceNotify(const sp<AMessage> &msg) { 13619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber int32_t what; 13629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(msg->findInt32("what", &what)); 13639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 13649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (what) { 13659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case Source::kWhatPrepared: 13669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 1367b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mSource == NULL) { 1368b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // This is a stale notification from a source that was 1369b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // asynchronously preparing when the client called reset(). 1370b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We handled the reset, the source is gone. 1371b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 1372b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 1373b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 1374ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber int32_t err; 1375ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber CHECK(msg->findInt32("err", &err)); 1376ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 13779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<NuPlayerDriver> driver = mDriver.promote(); 13789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (driver != NULL) { 1379dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // notify duration first, so that it's definitely set when 1380dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // the app received the "prepare complete" callback. 1381dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen int64_t durationUs; 1382dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen if (mSource->getDuration(&durationUs) == OK) { 1383997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber driver->notifyDuration(durationUs); 1384997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber } 1385dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen driver->notifyPrepareCompleted(err); 1386997594088164cfb33c1cb8c376884346fbf1e7aeAndreas Huber } 1387dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen 13889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 13899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 13909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 13919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case Source::kWhatFlagsChanged: 13929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 13939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber uint32_t flags; 13949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 13959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 13964b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang sp<NuPlayerDriver> driver = mDriver.promote(); 13974b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang if (driver != NULL) { 13984b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang driver->notifyFlagsChanged(flags); 13994b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang } 14004b7069dac546ad21cf62ca6132d50ea41857d08eChong Zhang 14019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 14029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber && (!(flags & Source::FLAG_DYNAMIC_DURATION))) { 14039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber cancelPollDuration(); 14049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 14059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber && (flags & Source::FLAG_DYNAMIC_DURATION) 14069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 14079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber schedulePollDuration(); 14089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 14099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mSourceFlags = flags; 14119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 14129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 14139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case Source::kWhatVideoSizeChanged: 14159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 14169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber int32_t width, height; 14179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(msg->findInt32("width", &width)); 14189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK(msg->findInt32("height", &height)); 14199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notifyListener(MEDIA_SET_VIDEO_SIZE, width, height); 14219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 14229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 14239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1424b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson case Source::kWhatBufferingStart: 1425b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson { 1426b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0); 1427b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson break; 1428b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 1429b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 1430b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson case Source::kWhatBufferingEnd: 1431b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson { 1432b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0); 1433b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson break; 1434b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson } 1435b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 1436dcb89b3b505522efde173c105a851c412f947178Chong Zhang case Source::kWhatSubtitleData: 1437dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 1438dcb89b3b505522efde173c105a851c412f947178Chong Zhang sp<ABuffer> buffer; 1439dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(msg->findBuffer("buffer", &buffer)); 1440dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1441dcb89b3b505522efde173c105a851c412f947178Chong Zhang int32_t trackIndex; 1442dcb89b3b505522efde173c105a851c412f947178Chong Zhang int64_t timeUs, durationUs; 1443dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt32("trackIndex", &trackIndex)); 1444dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 1445dcb89b3b505522efde173c105a851c412f947178Chong Zhang CHECK(buffer->meta()->findInt64("durationUs", &durationUs)); 1446dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1447dcb89b3b505522efde173c105a851c412f947178Chong Zhang Parcel in; 1448dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt32(trackIndex); 1449dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt64(timeUs); 1450dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt64(durationUs); 1451dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt32(buffer->size()); 1452dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.writeInt32(buffer->size()); 1453dcb89b3b505522efde173c105a851c412f947178Chong Zhang in.write(buffer->data(), buffer->size()); 1454dcb89b3b505522efde173c105a851c412f947178Chong Zhang 1455dcb89b3b505522efde173c105a851c412f947178Chong Zhang notifyListener(MEDIA_SUBTITLE_DATA, 0, 0, &in); 1456dcb89b3b505522efde173c105a851c412f947178Chong Zhang break; 1457dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 1458dcb89b3b505522efde173c105a851c412f947178Chong Zhang 145914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber case Source::kWhatQueueDecoderShutdown: 146014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber { 146114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int32_t audio, video; 146214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(msg->findInt32("audio", &audio)); 146314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(msg->findInt32("video", &video)); 146414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 146514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> reply; 146614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK(msg->findMessage("reply", &reply)); 146714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 146814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber queueDecoderShutdown(audio, video, reply); 146914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber break; 147014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber } 147114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 14729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 14739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber TRESPASS(); 14749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 14759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 14769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1477b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber//////////////////////////////////////////////////////////////////////////////// 1478b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 14799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::Source::notifyFlagsChanged(uint32_t flags) { 14809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<AMessage> notify = dupNotify(); 14819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("what", kWhatFlagsChanged); 14829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("flags", flags); 14839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->post(); 14849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 14859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayer::Source::notifyVideoSizeChanged(int32_t width, int32_t height) { 14879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<AMessage> notify = dupNotify(); 14889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("what", kWhatVideoSizeChanged); 14899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("width", width); 14909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("height", height); 14919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->post(); 14929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 14939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1494ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Hubervoid NuPlayer::Source::notifyPrepared(status_t err) { 14959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber sp<AMessage> notify = dupNotify(); 14969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->setInt32("what", kWhatPrepared); 1497ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notify->setInt32("err", err); 14989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber notify->post(); 14999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 15009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 150184333e0475bc911adc16417f4ca327c975cf6c36Andreas Hubervoid NuPlayer::Source::onMessageReceived(const sp<AMessage> & /* msg */) { 1502b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber TRESPASS(); 1503b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber} 1504b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber 150514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubervoid NuPlayer::queueDecoderShutdown( 150614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool audio, bool video, const sp<AMessage> &reply) { 150714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ALOGI("queueDecoderShutdown audio=%d, video=%d", audio, video); 150814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 150914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mDeferredActions.push_back( 151014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber new ShutdownDecoderAction(audio, video)); 151114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 151214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mDeferredActions.push_back( 151314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber new SimpleAction(&NuPlayer::performScanSources)); 151414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 151514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber mDeferredActions.push_back(new PostMessageAction(reply)); 151614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 151714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber processDeferredActions(); 151814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber} 151914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 1521