NuPlayerDriver.cpp revision adf34bf9b7925f990259b1b6f4c69b8668f76ead
19c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis/* 29c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Copyright (C) 2010 The Android Open Source Project 39c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * 49c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 59c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * you may not use this file except in compliance with the License. 69c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * You may obtain a copy of the License at 79c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * 89c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 99c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * 109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Unless required by applicable law or agreed to in writing, software 119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * See the License for the specific language governing permissions and 149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * limitations under the License. 159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis */ 169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis//#define LOG_NDEBUG 0 189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#define LOG_TAG "NuPlayerDriver" 199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <inttypes.h> 209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <utils/Log.h> 21b7daa0dadebdb043d63e585975a128c5fc087168Mathias Agopian 229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "NuPlayerDriver.h" 23e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian 249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "NuPlayer.h" 259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "NuPlayerSource.h" 269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <media/stagefright/foundation/ADebug.h> 289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <media/stagefright/foundation/ALooper.h> 299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <media/stagefright/MetaData.h> 309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisnamespace android { 329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 339c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisNuPlayerDriver::NuPlayerDriver() 349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis : mState(STATE_IDLE), 359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mIsAsyncPrepare(false), 369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mAsyncResult(UNKNOWN_ERROR), 379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSetSurfaceInProgress(false), 389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mDurationUs(-1), 399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPositionUs(-1), 409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNotifyTimeRealUs(-1), 419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPauseStartedTimeUs(-1), 429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumFramesTotal(0), 439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumFramesDropped(0), 449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLooper(new ALooper), 459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayerFlags(0), 469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mAtEOS(false), 479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLooping(false), 489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mStartupSeekTimeUs(-1) { 499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLooper->setName("NuPlayerDriver Looper"); 509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLooper->start( 529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis false, /* runOnCallingThread */ 539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis true, /* canCallJava */ 549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis PRIORITY_AUDIO); 559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer = new NuPlayer; 579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLooper->registerHandler(mPlayer); 589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5963d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling mPlayer->setDriver(this); 609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 629c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisNuPlayerDriver::~NuPlayerDriver() { 639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLooper->stop(); 649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::initCheck() { 679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setUID(uid_t uid) { 719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->setUID(uid); 729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 76b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchandstatus_t NuPlayerDriver::setDataSource( 777bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling const sp<IMediaHTTPService> &httpService, 787bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling const char *url, 797bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling const KeyedVector<String8, String8> *headers) { 807bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling Mutex::Autolock autoLock(mLock); 817bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 827bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling ALOGV("setDataSource: url=%s", url); 837bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling if (mState != STATE_IDLE) { 847bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling return INVALID_OPERATION; 857bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling } 867bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 877bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mState = STATE_SET_DATASOURCE_PENDING; 887bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 897bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mPlayer->setDataSourceAsync(httpService, url, headers); 907bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 917bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling while (mState == STATE_SET_DATASOURCE_PENDING) { 927bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mCondition.wait(mLock); 937bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling } 949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 9563d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling return mAsyncResult; 969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 1009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ALOGV("setDataSource: fd=%d", fd); 1029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mState != STATE_IDLE) { 1039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 1049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 1059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_SET_DATASOURCE_PENDING; 1079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->setDataSourceAsync(fd, offset, length); 1099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis while (mState == STATE_SET_DATASOURCE_PENDING) { 1119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mCondition.wait(mLock); 1129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 1139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mAsyncResult; 1159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 1169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 1199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 120b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchand ALOGV("setDataSource: stream source"); 1217bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling if (mState != STATE_IDLE) { 1227bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling return INVALID_OPERATION; 1237bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling } 1247bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1257bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mState = STATE_SET_DATASOURCE_PENDING; 1267bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1277bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mPlayer->setDataSourceAsync(source); 1287bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1297bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling while (mState == STATE_SET_DATASOURCE_PENDING) { 1307bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mCondition.wait(mLock); 1317bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling } 1327bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1337bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling return mAsyncResult; 1347bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling} 1357bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1367bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gillingstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1377bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling const sp<IGraphicBufferProducer> &bufferProducer) { 1387bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling Mutex::Autolock autoLock(mLock); 1397bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1407bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling if (mSetSurfaceInProgress) { 1417bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling return INVALID_OPERATION; 1427bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling } 1437bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1447bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling switch (mState) { 1457bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling case STATE_SET_DATASOURCE_PENDING: 1469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_RESET_IN_PROGRESS: 14763d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling return INVALID_OPERATION; 1489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 1509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 1519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 1529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSetSurfaceInProgress = true; 1549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 1569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis while (mSetSurfaceInProgress) { 1589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mCondition.wait(mLock); 1599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 1609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 1629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 1639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::prepare() { 1659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 1669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return prepare_l(); 1679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 1689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::prepare_l() { 1709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch (mState) { 1719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_UNPREPARED: 1729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_PREPARING; 1739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 1749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // Make sure we're not posting any notifications, success or 1757bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling // failure information is only communicated through our result 176b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchand // code. 1777bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mIsAsyncPrepare = false; 1787bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mPlayer->prepareAsync(); 1797bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling while (mState == STATE_PREPARING) { 1807bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mCondition.wait(mLock); 1817bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling } 1827bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1837bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling case STATE_STOPPED: 1847bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling // this is really just paused. handle as seek to start 1857bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mAtEOS = false; 1867bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mState = STATE_STOPPED_AND_PREPARING; 1877bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mIsAsyncPrepare = false; 1887bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mPlayer->seekToAsync(0); 1897bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling while (mState == STATE_STOPPED_AND_PREPARING) { 1907bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mCondition.wait(mLock); 1917bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling } 1927bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; 1937bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling default: 1947bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling return INVALID_OPERATION; 1957bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling }; 1967bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling} 1977bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 1987bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gillingstatus_t NuPlayerDriver::prepareAsync() { 1997bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling Mutex::Autolock autoLock(mLock); 2007bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling 2017bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling switch (mState) { 2027bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling case STATE_UNPREPARED: 2037bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mState = STATE_PREPARING; 2047bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling mIsAsyncPrepare = true; 2059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->prepareAsync(); 2069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 2079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_STOPPED: 2089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // this is really just paused. handle as seek to start 209cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas mAtEOS = false; 210cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas mState = STATE_STOPPED_AND_PREPARING; 2119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mIsAsyncPrepare = true; 2129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->seekToAsync(0); 2139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 2149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 2159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 2169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis }; 2179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 2189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::start() { 2209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 2219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch (mState) { 2239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_UNPREPARED: 2249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 2259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis status_t err = prepare_l(); 226cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas 2279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (err != OK) { 2289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return err; 2299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis CHECK_EQ(mState, STATE_PREPARED); 2329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // fall through 2349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PREPARED: 2379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 2389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mAtEOS = false; 2399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->start(); 2409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mStartupSeekTimeUs >= 0) { 2429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mStartupSeekTimeUs == 0) { 243cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas notifySeekComplete_l(); 244cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas } else { 2459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->seekToAsync(mStartupSeekTimeUs); 2469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mStartupSeekTimeUs = -1; 2499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 2519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_RUNNING: 2549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 2559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mAtEOS) { 2569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->seekToAsync(0); 2579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mAtEOS = false; 2589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPositionUs = -1; 2599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 260cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas break; 2619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PAUSED: 2649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_STOPPED_AND_PREPARED: 2659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 2669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->resume(); 2679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPositionUs -= ALooper::GetNowUs() - mPauseStartedTimeUs; 2689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 2699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 2729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 2739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 2749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_RUNNING; 2769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPauseStartedTimeUs = -1; 2779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 2799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 2809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::stop() { 2829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 2839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch (mState) { 2859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_RUNNING: 2869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->pause(); 2879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // fall through 2889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PAUSED: 2909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_STOPPED; 2919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(MEDIA_STOPPED); 2929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 2939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 2949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PREPARED: 2959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_STOPPED: 2969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_STOPPED_AND_PREPARING: 2979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_STOPPED_AND_PREPARED: 2989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_STOPPED; 2999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 3009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 3029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 3039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis setPauseStartedTimeIfNeeded(); 3059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 3079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 3089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::pause() { 3109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 3119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch (mState) { 3139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PAUSED: 3149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PREPARED: 3159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 3169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_RUNNING: 3189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis setPauseStartedTimeIfNeeded(); 3199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_PAUSED; 3209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(MEDIA_PAUSED); 3219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->pause(); 3229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 3239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 3259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 3269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 3299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 3309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisbool NuPlayerDriver::isPlaying() { 3329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mState == STATE_RUNNING && !mAtEOS; 3339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 3349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::seekTo(int msec) { 3369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 3379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int64_t seekTimeUs = msec * 1000ll; 3399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch (mState) { 3419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PREPARED: 3429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 3439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mStartupSeekTimeUs = seekTimeUs; 3449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // pretend that the seek completed. It will actually happen when starting playback. 3459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // TODO: actually perform the seek here, so the player is ready to go at the new 3469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // location 3479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifySeekComplete_l(); 3489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 3499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_RUNNING: 3529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PAUSED: 3539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 3549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mAtEOS = false; 3559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // seeks can take a while, so we essentially paused 3569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(MEDIA_PAUSED); 3579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->seekToAsync(seekTimeUs); 3589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 3599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 3629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 3639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPositionUs = seekTimeUs; 3669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNotifyTimeRealUs = -1; 3679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 3689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 3699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 3719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 3729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mPositionUs < 0) { 3749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *msec = 0; 3759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else if (mNotifyTimeRealUs == -1) { 3769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *msec = mPositionUs / 1000; 3779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else { 3789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int64_t nowUs = 3799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis (isPlaying() ? ALooper::GetNowUs() : mPauseStartedTimeUs); 3809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000; 3819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 3849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 3859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::getDuration(int *msec) { 3879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 3889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mDurationUs < 0) { 3909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return UNKNOWN_ERROR; 3919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 3929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *msec = (mDurationUs + 500ll) / 1000; 3949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 3969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 3979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 3989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::reset() { 3999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 4009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch (mState) { 4029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_IDLE: 4039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 4049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_SET_DATASOURCE_PENDING: 4069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_RESET_IN_PROGRESS: 4079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 4089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case STATE_PREPARING: 4109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 4119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis CHECK(mIsAsyncPrepare); 4129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(MEDIA_PREPARED); 4149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 4159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 4189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 4199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mState != STATE_STOPPED) { 4229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(MEDIA_STOPPED); 4239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_RESET_IN_PROGRESS; 4269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->resetAsync(); 4279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis while (mState == STATE_RESET_IN_PROGRESS) { 4299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mCondition.wait(mLock); 4309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mDurationUs = -1; 4339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPositionUs = -1; 4349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mStartupSeekTimeUs = -1; 4359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLooping = false; 4369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 4389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 4399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setLooping(int loop) { 4419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLooping = loop != 0; 4429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 4439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 4449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisplayer_type NuPlayerDriver::playerType() { 4469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return NU_PLAYER; 4479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 4489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 4509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (reply == NULL) { 4519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ALOGE("reply is a NULL pointer"); 4529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return BAD_VALUE; 4539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int32_t methodId; 4569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis status_t ret = request.readInt32(&methodId); 4579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (ret != OK) { 4589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ALOGE("Failed to retrieve the requested method to invoke"); 4599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return ret; 4609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch (methodId) { 4639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case INVOKE_ID_SET_VIDEO_SCALING_MODE: 4649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 4659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int mode = request.readInt32(); 4669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mPlayer->setVideoScalingMode(mode); 4679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case INVOKE_ID_GET_TRACK_INFO: 4709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 4719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mPlayer->getTrackInfo(reply); 4729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case INVOKE_ID_SELECT_TRACK: 4759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 4769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int trackIndex = request.readInt32(); 4779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mPlayer->selectTrack(trackIndex, true /* select */); 4789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case INVOKE_ID_UNSELECT_TRACK: 4819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 4829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int trackIndex = request.readInt32(); 4839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mPlayer->selectTrack(trackIndex, false /* select */); 4849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case INVOKE_ID_GET_SELECTED_TRACK: 4879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 4889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int32_t type = request.readInt32(); 4899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return mPlayer->getSelectedTrack(type, reply); 4909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 4939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 4949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 4959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 4979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 4989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 4999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 5009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->setAudioSink(audioSink); 5019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setParameter( 5049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int /* key */, const Parcel & /* request */) { 5059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 5069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 5099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return INVALID_OPERATION; 5109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::getMetadata( 5139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis const media::Metadata::Filter& /* ids */, Parcel *records) { 5149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 5159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis using media::Metadata; 5179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Metadata meta(records); 5199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis meta.appendBool( 5219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Metadata::kPauseAvailable, 5229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 5239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis meta.appendBool( 5259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Metadata::kSeekBackwardAvailable, 5269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 5279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis meta.appendBool( 5299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Metadata::kSeekForwardAvailable, 5309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 5319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis meta.appendBool( 5339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Metadata::kSeekAvailable, 5349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 5359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 5379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyResetComplete() { 5409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 5419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 5439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_IDLE; 5449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mCondition.broadcast(); 5459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifySetSurfaceComplete() { 5489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 5499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis CHECK(mSetSurfaceInProgress); 5519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mSetSurfaceInProgress = false; 5529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mCondition.broadcast(); 5549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 5579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 5589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mDurationUs = durationUs; 5599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 5629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 5639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (isPlaying()) { 5649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPositionUs = positionUs; 5659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNotifyTimeRealUs = ALooper::GetNowUs(); 5669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifySeekComplete() { 5709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 5719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifySeekComplete_l(); 5729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifySeekComplete_l() { 5759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis bool wasSeeking = true; 5769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mState == STATE_STOPPED_AND_PREPARING) { 5779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis wasSeeking = false; 5789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_STOPPED_AND_PREPARED; 5799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mCondition.broadcast(); 5809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (!mIsAsyncPrepare) { 5819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // if we are preparing synchronously, no need to notify listener 5829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return; 5839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else if (mState == STATE_STOPPED) { 5859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // no need to notify listener 5869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return; 5879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 5889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); 5899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyFrameStats( 5929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int64_t numFramesTotal, int64_t numFramesDropped) { 5939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 5949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumFramesTotal = numFramesTotal; 5959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumFramesDropped = numFramesDropped; 5969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 5979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 5989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::dump( 5999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int fd, const Vector<String16> & /* args */) const { 6009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 6019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis FILE *out = fdopen(dup(fd), "w"); 60392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn 6049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(out, " NuPlayer\n"); 6059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fprintf(out, " numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), " 6069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis "percentageDropped(%.2f)\n", 6079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumFramesTotal, 6089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumFramesDropped, 6099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mNumFramesTotal == 0 6109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 6119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis fclose(out); 6139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis out = NULL; 6149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return OK; 6169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyListener( 6199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int msg, int ext1, int ext2, const Parcel *in) { 6209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 6219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(msg, ext1, ext2, in); 6229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyListener_l( 6259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis int msg, int ext1, int ext2, const Parcel *in) { 6269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis switch (msg) { 6279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case MEDIA_PLAYBACK_COMPLETE: 6289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 6299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mLooping && mState != STATE_RESET_IN_PROGRESS) { 6309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLock.unlock(); 6319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayer->seekToAsync(0); 6329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLock.lock(); 6339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 6349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // fall through 6369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis case MEDIA_ERROR: 6399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis { 6409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mAtEOS = true; 6419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis setPauseStartedTimeIfNeeded(); 6429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 6439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis default: 6469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis break; 6479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLock.unlock(); 6509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis sendEvent(msg, ext1, ext2, in); 6519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mLock.lock(); 6529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 6559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 6569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 6589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mAsyncResult = err; 6609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 6619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mCondition.broadcast(); 6629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 6639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 6659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 6669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mState != STATE_PREPARING) { 6689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // We were preparing asynchronously when the client called 6699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // reset(), we sent a premature "prepared" notification and 6709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // then initiated the reset. This notification is stale. 6719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 6729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis return; 6739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis CHECK_EQ(mState, STATE_PREPARING); 6769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mAsyncResult = err; 6789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (err == OK) { 6809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // update state before notifying client, so that if client calls back into NuPlayerDriver 6819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis // in response, NuPlayerDriver has the right state 6829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_PREPARED; 6839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mIsAsyncPrepare) { 6849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(MEDIA_PREPARED); 6859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } else { 6879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mState = STATE_UNPREPARED; 6889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mIsAsyncPrepare) { 6899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 6909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 6929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 69392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn mCondition.broadcast(); 69492dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn} 69592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn 6969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 6979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis Mutex::Autolock autoLock(mLock); 6989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 6999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPlayerFlags = flags; 7009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 7019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::setPauseStartedTimeIfNeeded() { 7039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis if (mPauseStartedTimeUs == -1) { 7049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis mPauseStartedTimeUs = ALooper::GetNowUs(); 7059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis } 7069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} 7079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis 7089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis} // namespace android 7099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis