NuPlayer.cpp revision 46d13e3606b87d71379287672b54b50d0d9aa5cc
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2010 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "NuPlayer" 19010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#include <utils/Log.h> 204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh#include "NuPlayer.h" 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn#include "HTTPLiveSource.h" 243abd75ba3a981850cac43a401d0014a836559cb0Kenny Root#include "NuPlayerDecoder.h" 254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski#include "NuPlayerDriver.h" 264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski#include "NuPlayerRenderer.h" 2791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn#include "NuPlayerSource.h" 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "RTSPSource.h" 296f357d3284a833cc50a990e14b39f389b8972254Jeff Brown#include "StreamingSource.h" 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "GenericSource.h" 314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski#include "mp4/MP4Source.h" 324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "ATSParser.h" 340068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 359ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski#include <cutils/properties.h> // for property_get 36010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#include <media/stagefright/foundation/hexdump.h> 37cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn#include <media/stagefright/foundation/ABuffer.h> 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/foundation/ADebug.h> 394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski#include <media/stagefright/foundation/AMessage.h> 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <media/stagefright/ACodec.h> 41010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#include <media/stagefright/MediaDefs.h> 42e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn#include <media/stagefright/MediaErrors.h> 43cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn#include <media/stagefright/MetaData.h> 447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn#include <gui/IGraphicBufferProducer.h> 45713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 46713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato#include "avc_utils.h" 47713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 4806f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski#include "ESDS.h" 4921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski#include <media/stagefright/Utils.h> 50e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 51e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornnamespace android { 5261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 538a9b22056b13477f59df934928c00c58b5871c95Joe Onoratostruct NuPlayer::Action : public RefBase { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Action() {} 55bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski 564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski virtual void execute(NuPlayer *player) = 0; 5732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 58d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornprivate: 5932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani DISALLOW_EVIL_CONSTRUCTORS(Action); 60e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani}; 61cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 6220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinskistruct NuPlayer::SeekAction : public Action { 6332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani SeekAction(int64_t seekTimeUs) 640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn : mSeekTimeUs(seekTimeUs) { 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void execute(NuPlayer *player) { 68515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski player->performSeek(mSeekTimeUs); 69515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 70515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 71515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiprivate: 72515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski int64_t mSeekTimeUs; 73713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 74e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn DISALLOW_EVIL_CONSTRUCTORS(SeekAction); 75010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstruct NuPlayer::SetSurfaceAction : public Action { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SetSurfaceAction(const sp<NativeWindowWrapper> &wrapper) 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mWrapper(wrapper) { 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 8268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan virtual void execute(NuPlayer *player) { 8368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan player->performSetSurface(mWrapper); 84c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 85c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 86010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiprivate: 87010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski sp<NativeWindowWrapper> mWrapper; 88010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 89010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski DISALLOW_EVIL_CONSTRUCTORS(SetSurfaceAction); 90010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski}; 91010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 92010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski// Use this if there's no state necessary to save in order to execute 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// the action. 94010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskistruct NuPlayer::SimpleAction : public Action { 95010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski typedef void (NuPlayer::*ActionFunc)(); 96010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 97010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SimpleAction(ActionFunc func) 98010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski : mFunc(func) { 99010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 100010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 101010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski virtual void execute(NuPlayer *player) { 102010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski (player->*mFunc)(); 103010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 104010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 105010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiprivate: 106010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski ActionFunc mFunc; 1073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 1084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski DISALLOW_EVIL_CONSTRUCTORS(SimpleAction); 1094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski}; 1104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 111010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski//////////////////////////////////////////////////////////////////////////////// 112a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 11361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam LesinskiNuPlayer::NuPlayer() 1144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski : mUIDValid(false), 1154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mSourceFlags(0), 1164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mVideoIsAVC(false), 1174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mAudioEOS(false), 1184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mVideoEOS(false), 1194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mScanSourcesPending(false), 1204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mScanSourcesGeneration(0), 1214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mPollDurationGeneration(0), 1224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mTimeDiscontinuityPending(false), 123a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mFlushingAudio(NONE), 124a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mFlushingVideo(NONE), 125a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mSkipRenderingAudioUntilMediaTimeUs(-1ll), 126a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mSkipRenderingVideoUntilMediaTimeUs(-1ll), 127a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mVideoLateByUs(0ll), 128a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mNumFramesTotal(0ll), 129010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mNumFramesDropped(0ll), 13056d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski mVideoScalingMode(NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW), 13156d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski mStarted(false) { 13256d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski} 13356d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski 13456d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam LesinskiNuPlayer::~NuPlayer() { 13556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski} 13661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 13761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskivoid NuPlayer::setUID(uid_t uid) { 13861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUIDValid = true; 13961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUID = uid; 14061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski} 14161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskivoid NuPlayer::setDriver(const wp<NuPlayerDriver> &driver) { 1434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mDriver = driver; 1444b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski} 1454b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 146010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::setDataSourceAsync(const sp<IStreamSource> &source) { 1474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 1484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 1504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski char prop[PROPERTY_VALUE_MAX]; 1524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (property_get("media.stagefright.use-mp4source", prop, NULL) 1534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski && (!strcmp(prop, "1") || !strcasecmp(prop, "true"))) { 1544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski msg->setObject("source", new MP4Source(notify, source)); 1559f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } else { 15661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski msg->setObject("source", new StreamingSource(notify, source)); 1579f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 15861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 159a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski msg->post(); 160a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski} 16161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 16261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskistatic bool IsHTTPLiveURL(const char *url) { 163a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if (!strncasecmp("http://", url, 7) 16461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski || !strncasecmp("https://", url, 8)) { 16561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski size_t len = strlen(url); 16661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski if (len >= 5 && !strcasecmp(".m3u8", &url[len - 5])) { 16761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski return true; 16861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 16961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 17061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski if (strstr(url,"m3u8")) { 17161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski return true; 1724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 17361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 1744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return false; 1764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski} 17768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 17868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharanvoid NuPlayer::setDataSourceAsync( 17968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan const char *url, const KeyedVector<String8, String8> *headers) { 18068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 18168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan size_t len = strlen(url); 18268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 18368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 18468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 18568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan sp<Source> source; 18668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan if (IsHTTPLiveURL(url)) { 18768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan source = new HTTPLiveSource(notify, url, headers, mUIDValid, mUID); 18868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } else if (!strncasecmp(url, "rtsp://", 7)) { 18968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan source = new RTSPSource(notify, url, headers, mUIDValid, mUID); 19068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } else if ((!strncasecmp(url, "http://", 7) 19168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan || !strncasecmp(url, "https://", 8)) 19268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan && ((len >= 4 && !strcasecmp(".sdp", &url[len - 4])) 19368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan || strstr(url, ".sdp?"))) { 19468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan source = new RTSPSource(notify, url, headers, mUIDValid, mUID, true); 19568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } else { 19668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan source = new GenericSource(notify, url, headers, mUIDValid, mUID); 19768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 19868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 19968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan msg->setObject("source", source); 20068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan msg->post(); 20168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan} 20268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 20368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharanvoid NuPlayer::setDataSourceAsync(int fd, int64_t offset, int64_t length) { 2040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 2054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski sp<AMessage> notify = new AMessage(kWhatSourceNotify, id()); 20720b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski 20820b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski sp<Source> source = new GenericSource(notify, fd, offset, length); 20920b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski msg->setObject("source", source); 21020b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski msg->post(); 2114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski} 2124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 21368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharanvoid NuPlayer::prepareAsync() { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (new AMessage(kWhatPrepare, id()))->post(); 21568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan} 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::setVideoSurfaceTextureAsync( 218f37447bad3773b62176baa837908daf6edb44273Amith Yamasani const sp<IGraphicBufferProducer> &bufferProducer) { 219f37447bad3773b62176baa837908daf6edb44273Amith Yamasani sp<AMessage> msg = new AMessage(kWhatSetVideoNativeWindow, id()); 220f37447bad3773b62176baa837908daf6edb44273Amith Yamasani 221e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski if (bufferProducer == NULL) { 2226832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski msg->setObject("native-window", NULL); 2232c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } else { 2242c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown msg->setObject( 2252c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown "native-window", 2262c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown new NativeWindowWrapper( 2272c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown new SurfaceTextureClient(bufferProducer))); 2282c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 2292c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 230010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski msg->post(); 231010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski} 232010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 233c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackbornvoid NuPlayer::setAudioSink(const sp<MediaPlayerBase::AudioSink> &sink) { 2342c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown sp<AMessage> msg = new AMessage(kWhatSetAudioSink, id()); 2352c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown msg->setObject("sink", sink); 23655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn msg->post(); 2378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato} 2384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 239010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::start() { 24055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn (new AMessage(kWhatStart, id()))->post(); 2416b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn} 24255280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 24320b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinskivoid NuPlayer::pause() { 24420b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski (new AMessage(kWhatPause, id()))->post(); 24520b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski} 24655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 24755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackbornvoid NuPlayer::resume() { 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (new AMessage(kWhatResume, id()))->post(); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::resetAsync() { 25291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn (new AMessage(kWhatReset, id()))->post(); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::seekToAsync(int64_t seekTimeUs) { 256cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn sp<AMessage> msg = new AMessage(kWhatSeek, id()); 257cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn msg->setInt64("seekTimeUs", seekTimeUs); 258cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn msg->post(); 259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn} 2608ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn// static 262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornbool NuPlayer::IsFlushingState(FlushStatus state, bool *needShutdown) { 263cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn switch (state) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLUSHING_DECODER: 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needShutdown != NULL) { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *needShutdown = false; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case FLUSHING_DECODER_SHUTDOWN: 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needShutdown != NULL) { 2720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn *needShutdown = true; 2734b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return true; 2754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski default: 2774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return false; 2784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski} 2804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2812f1993ec460166413e7887f151630f6708077c0fDianne Hackbornvoid NuPlayer::onMessageReceived(const sp<AMessage> &msg) { 2822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn switch (msg->what()) { 283b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski case kWhatSetDataSource: 284b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski { 285b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski ALOGV("kWhatSetDataSource"); 286b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski 287b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski CHECK(mSource == NULL); 288b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski 289b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski sp<RefBase> obj; 290b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski CHECK(msg->findObject("source", &obj)); 291b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski 2922f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mSource = static_cast<Source *>(obj.get()); 2932f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2942f1993ec460166413e7887f151630f6708077c0fDianne Hackborn looper()->registerHandler(mSource); 2952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn CHECK(mDriver != NULL); 2972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 2982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn if (driver != NULL) { 2992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn driver->notifySetDataSourceCompleted(OK); 30061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn break; 3022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3032f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3042f1993ec460166413e7887f151630f6708077c0fDianne Hackborn case kWhatPrepare: 3052f1993ec460166413e7887f151630f6708077c0fDianne Hackborn { 3062f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mSource->prepareAsync(); 3072f1993ec460166413e7887f151630f6708077c0fDianne Hackborn break; 3082f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3092f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn case kWhatPollDuration: 3111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn { 3121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn int32_t generation; 3131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn CHECK(msg->findInt32("generation", &generation)); 3141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 3151e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn if (generation != mPollDurationGeneration) { 3161e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn // stale 3171e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn break; 3181e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3191e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 3201e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn int64_t durationUs; 3211e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 322a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 3232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn if (driver != NULL) { 324a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn driver->notifyDuration(durationUs); 3252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 328a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn msg->post(1000000ll); // poll again in a second. 3292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn break; 330a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn } 3312f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3322f1993ec460166413e7887f151630f6708077c0fDianne Hackborn case kWhatSetVideoNativeWindow: 3332f1993ec460166413e7887f151630f6708077c0fDianne Hackborn { 3342f1993ec460166413e7887f151630f6708077c0fDianne Hackborn ALOGV("kWhatSetVideoNativeWindow"); 3352f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDeferredActions.push_back( 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SimpleAction(&NuPlayer::performDecoderShutdown)); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3398a9b22056b13477f59df934928c00c58b5871c95Joe Onorato sp<RefBase> obj; 3408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato CHECK(msg->findObject("native-window", &obj)); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 342010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mDeferredActions.push_back( 3434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski new SetSurfaceAction( 3444b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski static_cast<NativeWindowWrapper *>(obj.get()))); 3454b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj != NULL) { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there is a new surface texture, instantiate decoders 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // again if possible. 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDeferredActions.push_back( 3500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn new SimpleAction(&NuPlayer::performScanSources)); 3510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn processDeferredActions(); 3540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn break; 3550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 357010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski case kWhatSetAudioSink: 3584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski { 3594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski ALOGV("kWhatSetAudioSink"); 3604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 3610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn sp<RefBase> obj; 3620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn CHECK(msg->findObject("sink", &obj)); 3630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mAudioSink = static_cast<MediaPlayerBase::AudioSink *>(obj.get()); 3650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn break; 3660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn case kWhatStart: 3690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn { 3700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn ALOGV("kWhatStart"); 3714870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn 3724870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn mVideoIsAVC = false; 3734870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn mAudioEOS = false; 3744870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn mVideoEOS = false; 3754870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn mSkipRenderingAudioUntilMediaTimeUs = -1; 3764870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn mSkipRenderingVideoUntilMediaTimeUs = -1; 377ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn mVideoLateByUs = 0; 378ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn mNumFramesTotal = 0; 379ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn mNumFramesDropped = 0; 380ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn mStarted = true; 381ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 382ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn mSource->start(); 383ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 384ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn mRenderer = new Renderer( 385ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn mAudioSink, 386ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn new AMessage(kWhatRendererNotify, id())); 387ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 388ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn looper()->registerHandler(mRenderer); 389ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 390ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn postScanSources(); 391099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn break; 392099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 393099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 394099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn case kWhatScanSources: 395099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn { 396099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn int32_t generation; 397099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn CHECK(msg->findInt32("generation", &generation)); 398fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn if (generation != mScanSourcesGeneration) { 399fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn // Drop obsolete msg. 400fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn break; 401fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 402fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 403fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mScanSourcesPending = false; 404fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 405fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn ALOGV("scanning sources haveAudio=%d, haveVideo=%d", 406fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mAudioDecoder != NULL, mVideoDecoder != NULL); 407fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 408fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn bool mHadAnySourcesBefore = 409fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn (mAudioDecoder != NULL) || (mVideoDecoder != NULL); 410fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 411fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn if (mNativeWindow != NULL) { 412fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn instantiateDecoder(false, &mVideoDecoder); 413fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 414fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 415fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn if (mAudioSink != NULL) { 416fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn instantiateDecoder(true, &mAudioDecoder); 417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 418fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn if (!mHadAnySourcesBefore 420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn // This is the first time we've found anything playable. 422fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 423fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn if (mSourceFlags & Source::FLAG_DYNAMIC_DURATION) { 424fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn schedulePollDuration(); 425fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 4261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4271e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 4281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn status_t err; 4291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if ((err = mSource->feedMoreTSData()) != OK) { 4301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if (mAudioDecoder == NULL && mVideoDecoder == NULL) { 4311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn // We're not currently decoding anything (no audio or 4321e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn // video tracks found) and we just ran out of input data. 4331e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 4341e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn if (err == ERROR_END_OF_STREAM) { 4351e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 4361e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } else { 4371e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 4381e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4391e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 440a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn break; 4413d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn } 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mAudioDecoder == NULL && mAudioSink != NULL) 444e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn || (mVideoDecoder == NULL && mNativeWindow != NULL)) { 44540c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn msg->post(100000ll); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScanSourcesPending = true; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 449cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case kWhatVideoNotify: 452cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case kWhatAudioNotify: 453cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool audio = msg->what() == kWhatAudioNotify; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AMessage> codecRequest; 457a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn CHECK(msg->findMessage("codec-request", &codecRequest)); 458a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn 4597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int32_t what; 4607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn CHECK(codecRequest->findInt32("what", &what)); 461a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn 462a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn if (what == ACodec::kWhatFillThisBuffer) { 4637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn status_t err = feedDecoderInputData( 4647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn audio, codecRequest); 4657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 466cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (err == -EWOULDBLOCK) { 467cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (mSource->feedMoreTSData() == OK) { 468e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn msg->post(10000ll); 469e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 470e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 471cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else if (what == ACodec::kWhatEOS) { 472e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn int32_t err; 473e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn CHECK(codecRequest->findInt32("err", &err)); 474e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 475e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn if (err == ERROR_END_OF_STREAM) { 476cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn ALOGV("got %s decoder EOS", audio ? "audio" : "video"); 477cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else { 4787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn ALOGV("got %s decoder EOS w/ error %d", 4797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn audio ? "audio" : "video", 480cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn err); 4817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mRenderer->queueEOS(audio, err); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (what == ACodec::kWhatFlushCompleted) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool needShutdown; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn if (audio) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK(IsFlushingState(mFlushingAudio, &needShutdown)); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlushingAudio = FLUSHED; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK(IsFlushingState(mFlushingVideo, &needShutdown)); 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlushingVideo = FLUSHED; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4949adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mVideoLateByUs = 0; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGV("decoder %s flush completed", audio ? "audio" : "video"); 498a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 499a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (needShutdown) { 500a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn ALOGV("initiating %s decoder shutdown", 501a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn audio ? "audio" : "video"); 502a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 503a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn (audio ? mAudioDecoder : mVideoDecoder)->initiateShutdown(); 504a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 505a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (audio) { 506a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mFlushingAudio = SHUTTING_DOWN_DECODER; 507a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } else { 508a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mFlushingVideo = SHUTTING_DOWN_DECODER; 509a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 510a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 511a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finishFlushIfPossible(); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (what == ACodec::kWhatOutputFormatChanged) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (audio) { 5156b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int32_t numChannels; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK(codecRequest->findInt32( 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "channel-count", &numChannels)); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t sampleRate; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5226b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn ALOGV("Audio output format changed to %d Hz, %d channels", 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sampleRate, numChannels); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAudioSink->close(); 526e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project audio_output_flags_t flags; 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int64_t durationUs; 529e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown // FIXME: we should handle the case where the video decoder 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is created after we receive the format change indication. 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Current code will just make that we select deep buffer 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // with video which should not be a problem as it should 533617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // not prevent from keeping A/V sync. 534617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mVideoDecoder == NULL && 535617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mSource->getDuration(&durationUs) == OK && 536617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn durationUs 537617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn > AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US) { 538617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn flags = AUDIO_OUTPUT_FLAG_DEEP_BUFFER; 539617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 540e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown flags = AUDIO_OUTPUT_FLAG_NONE; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 543e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown int32_t channelMask; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!codecRequest->findInt32("channel-mask", &channelMask)) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channelMask = CHANNEL_MASK_USE_CHANNEL_ORDER; 546617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 547280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn 548280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn CHECK_EQ(mAudioSink->open( 549280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn sampleRate, 550280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn numChannels, 551280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn (audio_channel_mask_t)channelMask, 552280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn AUDIO_FORMAT_PCM_16_BIT, 553280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn 8 /* bufferCount */, 554e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown NULL, 555617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn NULL, 556617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn flags), 557e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown (status_t)OK); 558617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mAudioSink->start(); 559617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 560e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn mRenderer->signalAudioSinkChanged(); 5611e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } else { 5621e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn // video 5631e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 5641e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn int32_t width, height; 5651e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn CHECK(codecRequest->findInt32("width", &width)); 5661e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn CHECK(codecRequest->findInt32("height", &height)); 5671e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 5682ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn int32_t cropLeft, cropTop, cropRight, cropBottom; 569e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn CHECK(codecRequest->findRect( 570e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn "crop", 5712ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn &cropLeft, &cropTop, &cropRight, &cropBottom)); 572e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 573e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn int32_t displayWidth = cropRight - cropLeft + 1; 574e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn int32_t displayHeight = cropBottom - cropTop + 1; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ALOGV("Video output format changed to %d x %d " 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "(crop: %d x %d @ (%d, %d))", 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project width, height, 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayWidth, 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project displayHeight, 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cropLeft, cropTop); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<AMessage> videoInputFormat = 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSource->getFormat(false /* audio */); 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Take into account sample aspect ratio if necessary: 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t sarWidth, sarHeight; 588105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (videoInputFormat->findInt32("sar-width", &sarWidth) 589e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville && videoInputFormat->findInt32( 590627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn "sar-height", &sarHeight)) { 591627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn ALOGV("Sample aspect ratio %d : %d", 592e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville sarWidth, sarHeight); 593627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 594627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn displayWidth = (displayWidth * sarWidth) / sarHeight; 595627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 596627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn ALOGV("display dimensions %d x %d", 597627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn displayWidth, displayHeight); 598627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 599627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 600627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn notifyListener( 601627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn MEDIA_SET_VIDEO_SIZE, displayWidth, displayHeight); 60232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 603f37447bad3773b62176baa837908daf6edb44273Amith Yamasani } else if (what == ACodec::kWhatShutdownCompleted) { 60432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani ALOGV("%s shutdown completed", audio ? "audio" : "video"); 605e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (audio) { 60632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mAudioDecoder.clear(); 607e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 60832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani CHECK_EQ((int)mFlushingAudio, (int)SHUTTING_DOWN_DECODER); 60932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani mFlushingAudio = SHUT_DOWN; 61032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } else { 61158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mVideoDecoder.clear(); 612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 613105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project CHECK_EQ((int)mFlushingVideo, (int)SHUTTING_DOWN_DECODER); 61458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mFlushingVideo = SHUT_DOWN; 615105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 616105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project finishFlushIfPossible(); 61858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } else if (what == ACodec::kWhatError) { 619105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project ALOGE("Received error from %s decoder, aborting playback.", 620105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project audio ? "audio" : "video"); 62158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 622105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mRenderer->queueEOS(audio, UNKNOWN_ERROR); 623105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } else if (what == ACodec::kWhatDrainThisBuffer) { 624d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood renderBuffer(audio, codecRequest); 625244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } else if (what != ACodec::kWhatComponentAllocated 626244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani && what != ACodec::kWhatComponentConfigured 627244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani && what != ACodec::kWhatBuffersAllocated) { 628244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani ALOGV("Unhandled codec notification %d '%c%c%c%c'.", 629244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani what, 630244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani what >> 24, 631244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani (what >> 16) & 0xff, 632244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani (what >> 8) & 0xff, 633244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani what & 0xff); 634244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 635244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 636244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani break; 637244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 638244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 639244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani case kWhatRendererNotify: 640244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani { 641244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani int32_t what; 642244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani CHECK(msg->findInt32("what", &what)); 643244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (what == Renderer::kWhatEOS) { 645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani int32_t audio; 646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani CHECK(msg->findInt32("audio", &audio)); 647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani int32_t finalResult; 649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani CHECK(msg->findInt32("finalResult", &finalResult)); 650244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 651244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (audio) { 652244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioEOS = true; 65310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } else { 65410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mVideoEOS = true; 65510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 65610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 65710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn if (finalResult == ERROR_END_OF_STREAM) { 65810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn ALOGV("reached %s EOS", audio ? "audio" : "video"); 65910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } else { 66010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn ALOGE("%s track encountered an error (%d)", 66110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn audio ? "audio" : "video", finalResult); 66210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 66310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn notifyListener( 66410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, finalResult); 66510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 66610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 6676d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk if ((mAudioEOS || mAudioDecoder == NULL) 668abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn && (mVideoEOS || mVideoDecoder == NULL)) { 669abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn notifyListener(MEDIA_PLAYBACK_COMPLETE, 0, 0); 6706d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 671abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } else if (what == Renderer::kWhatPosition) { 672abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn int64_t positionUs; 673abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn CHECK(msg->findInt64("positionUs", &positionUs)); 6746d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 675abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn CHECK(msg->findInt64("videoLateByUs", &mVideoLateByUs)); 676abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 6776d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk if (mDriver != NULL) { 6786d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk sp<NuPlayerDriver> driver = mDriver.promote(); 6796d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk if (driver != NULL) { 6806d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk driver->notifyPosition(positionUs); 6816d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 6826d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk driver->notifyFrameStats( 6836d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mNumFramesTotal, mNumFramesDropped); 6846d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6856d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6866d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } else if (what == Renderer::kWhatFlushComplete) { 6876d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk int32_t audio; 6886d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk CHECK(msg->findInt32("audio", &audio)); 6896d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 6906d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk ALOGV("renderer %s flush completed.", audio ? "audio" : "video"); 6916d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } else if (what == Renderer::kWhatVideoRenderingStart) { 6926d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk notifyListener(MEDIA_INFO, MEDIA_INFO_RENDERING_START, 0); 6936d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6946d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk break; 6956d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6966d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 6976d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk case kWhatMoreDataQueued: 6986d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk { 6996d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk break; 7006d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7016d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk case kWhatReset: 7036d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk { 7046d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk ALOGV("kWhatReset"); 7056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 706abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn mDeferredActions.push_back( 707abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn new SimpleAction(&NuPlayer::performDecoderShutdown)); 708abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 709e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski mDeferredActions.push_back( 710e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski new SimpleAction(&NuPlayer::performReset)); 711e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 712e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski processDeferredActions(); 713e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski break; 714e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 7150c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn 716a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski case kWhatSeek: 71706f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski { 71806f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski int64_t seekTimeUs; 71906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski CHECK(msg->findInt64("seekTimeUs", &seekTimeUs)); 7209f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski 7219f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski ALOGV("kWhatSeek seekTimeUs=%lld us", seekTimeUs); 722a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 7230c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn mDeferredActions.push_back( 7240c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn new SimpleAction(&NuPlayer::performDecoderFlush)); 725e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 726e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski mDeferredActions.push_back(new SeekAction(seekTimeUs)); 72758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 728d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood processDeferredActions(); 729d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood break; 73058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 731d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 732d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood case kWhatPause: 733d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood { 73458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn CHECK(mRenderer != NULL); 735d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mSource->pause(); 736d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mRenderer->pause(); 73758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn break; 73858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 73958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 74058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn case kWhatResume: 74158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn { 74258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn CHECK(mRenderer != NULL); 74358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mSource->resume(); 74458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mRenderer->resume(); 745d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood break; 746d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 747d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 748ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn case kWhatSourceNotify: 749ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn { 750ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn onSourceNotify(msg); 751ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn break; 752ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 753ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn 754ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn default: 7553251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn TRESPASS(); 7563251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn break; 7573251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7583251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn} 7593251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 7603251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackbornvoid NuPlayer::finishFlushIfPossible() { 7613251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn if (mFlushingAudio != FLUSHED && mFlushingAudio != SHUT_DOWN) { 7623251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn return; 7633251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7643251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 7653251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn if (mFlushingVideo != FLUSHED && mFlushingVideo != SHUT_DOWN) { 7663251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn return; 7673251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7683251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 769105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project ALOGV("both audio and video are flushed now."); 770105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 771105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mTimeDiscontinuityPending) { 772105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mRenderer->signalTimeDiscontinuity(); 773105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mTimeDiscontinuityPending = false; 774105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 775105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 776105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mAudioDecoder != NULL) { 777105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mAudioDecoder->signalResume(); 778105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 779105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 780105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mVideoDecoder != NULL) { 781105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mVideoDecoder->signalResume(); 7826ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly } 7836ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 784105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFlushingAudio = NONE; 785105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFlushingVideo = NONE; 7866ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 787105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project processDeferredActions(); 788105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project} 7896ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 7906ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pellyvoid NuPlayer::postScanSources() { 791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mScanSourcesPending) { 792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project return; 7936ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly } 794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project sp<AMessage> msg = new AMessage(kWhatScanSources, id()); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg->setInt32("generation", mScanSourcesGeneration); 7975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt msg->post(); 7985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 7995347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mScanSourcesPending = true; 8005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt} 8015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwaltstatus_t NuPlayer::instantiateDecoder(bool audio, sp<Decoder> *decoder) { 8035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (*decoder != NULL) { 8045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return OK; 8055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt sp<AMessage> format = mSource->getFormat(audio); 8085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (format == NULL) { 8105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return -EWOULDBLOCK; 8117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (!audio) { 8147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn AString mime; 8157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn CHECK(format->findString("mime", &mime)); 8167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mVideoIsAVC = !strcasecmp(MEDIA_MIMETYPE_VIDEO_AVC, mime.c_str()); 8177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sp<AMessage> notify = 8207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn new AMessage(audio ? kWhatAudioNotify : kWhatVideoNotify, 8217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn id()); 8227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn *decoder = audio ? new Decoder(notify) : 8247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn new Decoder(notify, mNativeWindow); 8256ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly looper()->registerHandler(*decoder); 8267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn (*decoder)->configure(format); 8286ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int64_t durationUs; 8307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (mDriver != NULL && mSource->getDuration(&durationUs) == OK) { 8317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 8326ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly if (driver != NULL) { 8337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn driver->notifyDuration(durationUs); 8347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8356ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly } 8367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return OK; 8387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn} 839a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 840a029ea131836725b050e1a7550aa171b68171522Robert Greenwaltstatus_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) { 841a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt sp<AMessage> reply; 842a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt CHECK(msg->findMessage("reply", &reply)); 843a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 844a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt if ((audio && IsFlushingState(mFlushingAudio)) 845a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt || (!audio && IsFlushingState(mFlushingVideo))) { 846a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt reply->setInt32("err", INFO_DISCONTINUITY); 847a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt reply->post(); 848a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt return OK; 849a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 850a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 851a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt sp<ABuffer> accessUnit; 852a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 8537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn bool dropAccessUnit; 8547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn do { 8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn status_t err = mSource->dequeueAccessUnit(audio, &accessUnit); 8567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn if (err == -EWOULDBLOCK) { 8587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn return err; 8597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } else if (err != OK) { 8604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (err == INFO_DISCONTINUITY) { 8617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn int32_t type; 8627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn CHECK(accessUnit->meta()->findInt32("discontinuity", &type)); 8637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn bool formatChange = 8657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn (audio && 8667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn (type & ATSParser::DISCONTINUITY_AUDIO_FORMAT)) 8677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn || (!audio && 8687a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey (type & ATSParser::DISCONTINUITY_VIDEO_FORMAT)); 8694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 8701059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey bool timeChange = (type & ATSParser::DISCONTINUITY_TIME) != 0; 8711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 8724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski ALOGI("%s discontinuity (formatChange=%d, time=%d)", 8731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey audio ? "audio" : "video", formatChange, timeChange); 8741059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 8751059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey if (audio) { 8767a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey mSkipRenderingAudioUntilMediaTimeUs = -1; 8777a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } else { 8787a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey mSkipRenderingVideoUntilMediaTimeUs = -1; 8797a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 8807a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 8817a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey if (timeChange) { 8827a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey sp<AMessage> extra; 8837a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey if (accessUnit->meta()->findMessage("extra", &extra) 8848ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn && extra != NULL) { 88508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn int64_t resumeAtMediaTimeUs; 8868ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn if (extra->findInt64( 8878ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn "resume-at-mediatimeUs", &resumeAtMediaTimeUs)) { 88808c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn ALOGI("suppressing rendering of %s until %lld us", 8898ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn audio ? "audio" : "video", resumeAtMediaTimeUs); 8908ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 8918ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn if (audio) { 8928ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mSkipRenderingAudioUntilMediaTimeUs = 8938ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn resumeAtMediaTimeUs; 8948ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } else { 8958ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mSkipRenderingVideoUntilMediaTimeUs = 8968ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn resumeAtMediaTimeUs; 8978ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8988ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8998ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9008ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9018ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9028ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mTimeDiscontinuityPending = 9038ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mTimeDiscontinuityPending || timeChange; 9048ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9058ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn if (formatChange || timeChange) { 9066771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski if (mFlushingAudio == NONE && mFlushingVideo == NONE) { 9076771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski // And we'll resume scanning sources once we're done 9086771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski // flushing. 9099f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mDeferredActions.push_front( 9109f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski new SimpleAction( 9119f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski &NuPlayer::performScanSources)); 9126771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9136771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 9146771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski flushDecoder(audio, formatChange); 9156771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } else { 9166771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski // This stream is unaffected by the discontinuity 9179f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski 9189f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski if (audio) { 9199f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mFlushingAudio = FLUSHED; 9209f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } else { 9219f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mFlushingVideo = FLUSHED; 9229f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9239f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski 9249f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski finishFlushIfPossible(); 9259f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski 9269f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski return -EWOULDBLOCK; 9279f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9286771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9296771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 930010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski reply->setInt32("err", err); 931010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski reply->post(); 932010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return OK; 933010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 934010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 935010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (!audio) { 936010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski ++mNumFramesTotal; 937010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 938010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 939010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski dropAccessUnit = false; 940010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (!audio 941010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski && mVideoLateByUs > 100000ll 942010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski && mVideoIsAVC 943010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski && !IsAVCReferenceFrame(accessUnit)) { 944010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski dropAccessUnit = true; 945010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski ++mNumFramesDropped; 946010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 947010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } while (dropAccessUnit); 948010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 949010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // ALOGV("returned a valid buffer of %s data", audio ? "audio" : "video"); 950010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 951010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#if 0 952010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski int64_t mediaTimeUs; 953010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski CHECK(accessUnit->meta()->findInt64("timeUs", &mediaTimeUs)); 954010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski ALOGV("feeding %s input buffer at media time %.2f secs", 955010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski audio ? "audio" : "video", 956010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mediaTimeUs / 1E6); 957010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski#endif 958010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 959010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski reply->setBuffer("buffer", accessUnit); 960010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski reply->post(); 961010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 962010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return OK; 963010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski} 964010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 965010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) { 966010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // ALOGV("renderBuffer %s", audio ? "audio" : "video"); 967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 968010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski sp<AMessage> reply; 969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski CHECK(msg->findMessage("reply", &reply)); 970010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (IsFlushingState(audio ? mFlushingAudio : mFlushingVideo)) { 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We're currently attempting to flush the decoder, in order 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to complete this, the decoder wants all its buffers back, 9744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // so we don't want any output buffers it sent us (from before 975d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // we initiated the flush) to be stuck in the renderer's queue. 976d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 977a8018ac47a0c0725882a041a1c42e67f52129f02Adam Lesinski ALOGV("we're still flushing the %s decoder, sending its output buffer" 978d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski " right back.", audio ? "audio" : "video"); 979d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 980d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski reply->post(); 981d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski return; 982d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 983d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 984d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski sp<ABuffer> buffer; 985d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski CHECK(msg->findBuffer("buffer", &buffer)); 986d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 987d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski int64_t &skipUntilMediaTimeUs = 988d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski audio 989d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski ? mSkipRenderingAudioUntilMediaTimeUs 990926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski : mSkipRenderingVideoUntilMediaTimeUs; 991a8018ac47a0c0725882a041a1c42e67f52129f02Adam Lesinski 992d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski if (skipUntilMediaTimeUs >= 0) { 993d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski int64_t mediaTimeUs; 994d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski CHECK(buffer->meta()->findInt64("timeUs", &mediaTimeUs)); 995d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 996d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski if (mediaTimeUs < skipUntilMediaTimeUs) { 997d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski ALOGV("dropping %s buffer at time %lld as requested.", 998010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski audio ? "audio" : "video", 999d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski mediaTimeUs); 1000926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski 1001a8018ac47a0c0725882a041a1c42e67f52129f02Adam Lesinski reply->post(); 1002d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski return; 1003d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1004d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 1005633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar skipUntilMediaTimeUs = -1; 1006633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRenderer->queueBuffer(audio, buffer, reply); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::notifyListener(int msg, int ext1, int ext2) { 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mDriver == NULL) { 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<NuPlayerDriver> driver = mDriver.promote(); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (driver == NULL) { 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project driver->notifyListener(msg, ext1, ext2); 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid NuPlayer::flushDecoder(bool audio, bool needShutdown) { 1026c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if ((audio && mAudioDecoder == NULL) || (!audio && mVideoDecoder == NULL)) { 1027c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn ALOGI("flushDecoder %s without decoder present", 1028515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski audio ? "audio" : "video"); 1029515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1030515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1031515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Make sure we don't continue to scan sources until we finish flushing. 1032c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn ++mScanSourcesGeneration; 1033c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mScanSourcesPending = false; 1034c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1035c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn (audio ? mAudioDecoder : mVideoDecoder)->signalFlush(); 1036c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mRenderer->flush(audio); 1037c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1038c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn FlushStatus newStatus = 1039c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn needShutdown ? FLUSHING_DECODER_SHUTDOWN : FLUSHING_DECODER; 1040515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1041515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (audio) { 1042515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski CHECK(mFlushingAudio == NONE 1043515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski || mFlushingAudio == AWAITING_DISCONTINUITY); 1044515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1045515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mFlushingAudio = newStatus; 1046515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1047515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (mFlushingVideo == NONE) { 1048515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mFlushingVideo = (mVideoDecoder != NULL) 1049c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn ? AWAITING_DISCONTINUITY 1050515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski : FLUSHED; 1051515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1052c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else { 1053515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski CHECK(mFlushingVideo == NONE 1054c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn || mFlushingVideo == AWAITING_DISCONTINUITY); 1055c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1056c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mFlushingVideo = newStatus; 1057c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1058c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (mFlushingAudio == NONE) { 1059c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mFlushingAudio = (mAudioDecoder != NULL) 1060515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski ? AWAITING_DISCONTINUITY 1061515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski : FLUSHED; 1062515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1063515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1064515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski} 1065515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1066515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskisp<AMessage> NuPlayer::Source::getFormat(bool audio) { 1067515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski sp<MetaData> meta = getFormatMeta(audio); 1068515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1069515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (meta == NULL) { 1070515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return NULL; 1071515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1072515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1073515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski sp<AMessage> msg = new AMessage; 1074515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1075515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if(convertMetaDataToMessage(meta, &msg) == OK) { 1076515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return msg; 1077515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1078515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return NULL; 1079515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski} 1080515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1081515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskistatus_t NuPlayer::setVideoScalingMode(int32_t mode) { 1082515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mVideoScalingMode = mode; 1083515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (mNativeWindow != NULL) { 1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn status_t ret = native_window_set_scaling_mode( 1085c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mNativeWindow->getNativeWindow().get(), mVideoScalingMode); 1086515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (ret != OK) { 1087c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn ALOGE("Failed to set scaling mode (%d): %s", 1088ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn -ret, strerror(-ret)); 108991268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn return ret; 10901e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn } 1091d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1092865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn return OK; 1093865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn} 10941476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato 1095099bc627c463d9941e23e480f25a78a154429c55Dianne Hackbornvoid NuPlayer::schedulePollDuration() { 1096c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn sp<AMessage> msg = new AMessage(kWhatPollDuration, id()); 1097c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn msg->setInt32("generation", mPollDurationGeneration); 1098d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn msg->post(); 1099ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn} 1100ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 1101d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackbornvoid NuPlayer::cancelPollDuration() { 1102d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn ++mPollDurationGeneration; 1103cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn} 1104fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn 1105fc0641340ff927d9c35d5613723d25858f751118Dianne Hackbornvoid NuPlayer::processDeferredActions() { 1106fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn while (!mDeferredActions.empty()) { 1107fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn // We won't execute any deferred actions until we're no longer in 1108fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn // an intermediate state, i.e. one more more decoders are currently 11090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // flushing or shutting down. 11101e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 1111fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn if (mRenderer != NULL) { 1112ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn // There's an edge case where the renderer owns all output 1113ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn // buffers and is paused, therefore the decoder will not read 1114cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn // more input data and will never encounter the matching 1115cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn // discontinuity. To avoid this, we resume the renderer. 1116cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1117cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (mFlushingAudio == AWAITING_DISCONTINUITY 1118cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn || mFlushingVideo == AWAITING_DISCONTINUITY) { 1119cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mRenderer->resume(); 1120cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11210068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 1122cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 11230068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (mFlushingAudio != NONE || mFlushingVideo != NONE) { 1124cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn // We're currently flushing, postpone the reset until that's 11259a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn // completed. 11269a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn 11279a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn ALOGV("postponing action mFlushingAudio=%d, mFlushingVideo=%d", 11289a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn mFlushingAudio, mFlushingVideo); 1129cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1130cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 1131cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1132cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1133cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn sp<Action> action = *mDeferredActions.begin(); 1134cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mDeferredActions.erase(mDeferredActions.begin()); 1135cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1136cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn action->execute(this); 11374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11403abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootvoid NuPlayer::performSeek(int64_t seekTimeUs) { 11413abd75ba3a981850cac43a401d0014a836559cb0Kenny Root ALOGV("performSeek seekTimeUs=%lld us (%.2f secs)", 11423abd75ba3a981850cac43a401d0014a836559cb0Kenny Root seekTimeUs, 11433abd75ba3a981850cac43a401d0014a836559cb0Kenny Root seekTimeUs / 1E6); 11443abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 11453abd75ba3a981850cac43a401d0014a836559cb0Kenny Root mSource->seekTo(seekTimeUs); 11463abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 11473abd75ba3a981850cac43a401d0014a836559cb0Kenny Root if (mDriver != NULL) { 1148c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 11490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (driver != NULL) { 11500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn driver->notifyPosition(seekTimeUs); 11510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn driver->notifySeekComplete(); 115216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1153c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1154cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn 1155e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn // everything's flushed, continue playback. 1156c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn} 1157c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1158e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornvoid NuPlayer::performDecoderFlush() { 11590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn ALOGV("performDecoderFlush"); 11600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 1161099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn if (mAudioDecoder != NULL && mVideoDecoder == NULL) { 1162c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn return; 1163c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1164c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1165c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mTimeDiscontinuityPending = true; 1166c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1167c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (mAudioDecoder != NULL) { 1168c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flushDecoder(true /* audio */, false /* needShutdown */); 1169c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1170c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1171c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (mVideoDecoder != NULL) { 117216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn flushDecoder(false /* audio */, false /* needShutdown */); 117349021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } 11740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn} 1175c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1176c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackbornvoid NuPlayer::performDecoderShutdown() { 1177c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn ALOGV("performDecoderShutdown"); 1178d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn 1179d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn if (mAudioDecoder != NULL && mVideoDecoder == NULL) { 1180e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn return; 1181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 11823d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn 1183e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mTimeDiscontinuityPending = true; 11840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mAudioDecoder != NULL) { 1186010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski flushDecoder(true /* audio */, true /* needShutdown */); 11870ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 1188010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 11890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (mVideoDecoder != NULL) { 11900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn flushDecoder(false /* audio */, true /* needShutdown */); 11910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 11920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn} 11930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 1194d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackbornvoid NuPlayer::performReset() { 1195d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn ALOGV("performReset"); 1196d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn 1197d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn CHECK(mAudioDecoder == NULL); 1198d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn CHECK(mVideoDecoder == NULL); 1199d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn 1200d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn cancelPollDuration(); 1201d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn 1202d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn ++mScanSourcesGeneration; 1203d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mScanSourcesPending = false; 1204d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn 1205d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mRenderer.clear(); 1206fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn 1207cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (mSource != NULL) { 1208cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mSource->stop(); 1209cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1210cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn looper()->unregisterHandler(mSource->id()); 1211cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1212cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mSource.clear(); 1213fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } 1214cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1215cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (mDriver != NULL) { 1216cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 1217cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (driver != NULL) { 1218cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn driver->notifyResetComplete(); 1219cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1220ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 1221ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 1222ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn mStarted = false; 1223e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood} 1224a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn 1225cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornvoid NuPlayer::performScanSources() { 12260ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn ALOGV("performScanSources"); 1227ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 1228cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn if (!mStarted) { 1229cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1230cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 1231cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn 1232e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey if (mAudioDecoder == NULL || mVideoDecoder == NULL) { 1233cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn postScanSources(); 1234cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 1235cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn} 1236cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn 1237cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornvoid NuPlayer::performSetSurface(const sp<NativeWindowWrapper> &wrapper) { 1238cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn ALOGV("performSetSurface"); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeWindow = wrapper; 1241e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 12420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn // XXX - ignore error from setVideoScalingMode for now 12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn setVideoScalingMode(mVideoScalingMode); 12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn 124513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn if (mDriver != NULL) { 124613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 124713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn if (driver != NULL) { 124813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn driver->notifySetSurfaceComplete(); 124913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } 125013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } 125113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn} 1252010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 125313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackbornvoid NuPlayer::onSourceNotify(const sp<AMessage> &msg) { 125413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn int32_t what; 1255d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn CHECK(msg->findInt32("what", &what)); 125613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 1257ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn switch (what) { 1258ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn case Source::kWhatPrepared: 1259ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn { 12601e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn int32_t err; 1261ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn CHECK(msg->findInt32("err", &err)); 1262ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn 1263ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn sp<NuPlayerDriver> driver = mDriver.promote(); 1264ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn if (driver != NULL) { 1265ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn driver->notifyPrepareCompleted(err); 12664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 12670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn break; 12689cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn } 12699cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn 12700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn case Source::kWhatFlagsChanged: 12710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn { 12720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn uint32_t flags; 12730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn CHECK(msg->findInt32("flags", (int32_t *)&flags)); 12740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 12750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if ((mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 12760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn && (!(flags & Source::FLAG_DYNAMIC_DURATION))) { 12770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn cancelPollDuration(); 12780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } else if (!(mSourceFlags & Source::FLAG_DYNAMIC_DURATION) 12790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn && (flags & Source::FLAG_DYNAMIC_DURATION) 12800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn && (mAudioDecoder != NULL || mVideoDecoder != NULL)) { 12810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn schedulePollDuration(); 12824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 12830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 12840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mSourceFlags = flags; 12850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn break; 12860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 12870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 12880068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn case Source::kWhatVideoSizeChanged: 12890068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn { 12909ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski int32_t width, height; 12910068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn CHECK(msg->findInt32("width", &width)); 12920068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn CHECK(msg->findInt32("height", &height)); 12930068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 12940068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn notifyListener(MEDIA_SET_VIDEO_SIZE, width, height); 12950068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn break; 12960068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 1297e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1298c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn case Source::kWhatBufferingStart: 129916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn { 130016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_START, 0); 130116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn break; 1302e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1303e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 1304e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn case Source::kWhatBufferingEnd: 1305c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn { 130616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn notifyListener(MEDIA_INFO, MEDIA_INFO_BUFFERING_END, 0); 130716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn break; 130816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1309e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TRESPASS(); 13124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1313010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski} 1314010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1315010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski//////////////////////////////////////////////////////////////////////////////// 1316010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1317010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::Source::notifyFlagsChanged(uint32_t flags) { 1318010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski sp<AMessage> notify = dupNotify(); 1319010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->setInt32("what", kWhatFlagsChanged); 1320010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->setInt32("flags", flags); 1321010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->post(); 1322010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski} 1323010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1324010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::Source::notifyVideoSizeChanged(int32_t width, int32_t height) { 1325010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski sp<AMessage> notify = dupNotify(); 1326010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->setInt32("what", kWhatVideoSizeChanged); 1327010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->setInt32("width", width); 1328010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->setInt32("height", height); 1329010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->post(); 1330010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski} 1331010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1332010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::Source::notifyPrepared(status_t err) { 1333010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski sp<AMessage> notify = dupNotify(); 1334010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->setInt32("what", kWhatPrepared); 1335010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->setInt32("err", err); 1336010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski notify->post(); 1337010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski} 1338010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1339010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskivoid NuPlayer::Source::onMessageReceived(const sp<AMessage> &msg) { 1340010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski TRESPASS(); 1341010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski} 1342010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1343010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski} // namespace android 1344010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski