NuPlayerDriver.cpp revision 13d6faa02087ce3bb0d4a02b8495f1822f211433
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayerDriver" 19377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT#include <inttypes.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDriver.h" 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include "NuPlayerSource.h" 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber#include <media/stagefright/foundation/ADebug.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ALooper.h> 299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include <media/stagefright/MetaData.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::NuPlayerDriver() 349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber : mState(STATE_IDLE), 35ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare(false), 369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult(UNKNOWN_ERROR), 3713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress(false), 3843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs(-1), 3943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs(-1), 400560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mNotifyTimeRealUs(-1), 410560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPauseStartedTimeUs(-1), 423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0), 433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped(0), 441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mLooper(new ALooper), 459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags(0), 46a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS(false), 47a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping(false), 4843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->setName("NuPlayerDriver Looper"); 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->start( 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber false, /* runOnCallingThread */ 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber true, /* canCallJava */ 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PRIORITY_AUDIO); 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer = new NuPlayer; 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->registerHandler(mPlayer); 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->setDriver(this); 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() { 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 76f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 771b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 781b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 791b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 8143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 82a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: url=%s", url); 839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 865bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 8843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 891b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mPlayer->setDataSourceAsync(httpService, url, headers); 909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 101a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: fd=%d", fd); 1029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 11943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 120a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: stream source"); 1219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 12643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 1289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1361173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1378ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 13857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 13957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 14013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang if (mSetSurfaceInProgress) { 14113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang return INVALID_OPERATION; 14213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 14313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 15313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = true; 15413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1558ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 15657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 15713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang while (mSetSurfaceInProgress) { 15813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.wait(mLock); 15913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 16013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1611173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1621173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1631173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 173ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 174ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 175ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 176ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 177ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 1789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 1809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1834b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 1844b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 1854b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 1864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 1874b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = false; 1884b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 1894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar while (mState == STATE_STOPPED_AND_PREPARING) { 1904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mCondition.wait(mLock); 1914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 1924b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; 1939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 1969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 197afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 1999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 204ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 2059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 2069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 2074b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 2094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 2104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 2114b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = true; 2124b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 2134b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 2149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 2209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 22243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 23743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 238a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 23943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 24043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 24143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 2422048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber if (mStartupSeekTimeUs == 0) { 243eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 2442048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } else { 2452048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mPlayer->seekToAsync(mStartupSeekTimeUs); 2462048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 2472048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 24843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 24943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 25043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 25143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 25243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2540560195a71ee26e8546075e56c49ff535fcf1767Wei Jia { 2550560195a71ee26e8546075e56c49ff535fcf1767Wei Jia if (mAtEOS) { 2560560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPlayer->seekToAsync(0); 2570560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mAtEOS = false; 2580560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = -1; 2590560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2610560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2644b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 2659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 26643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->resume(); 26715506a6582fb86567c6887c4c426d44be02d12afWei Jia mPositionUs -= ALooper::GetNowUs() - mPauseStartedTimeUs; 26843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 26943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 27343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 27443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 2760560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPauseStartedTimeUs = -1; 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 2824b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar Mutex::Autolock autoLock(mLock); 2834b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2844b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar switch (mState) { 2854b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_RUNNING: 2864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->pause(); 2874b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 2884b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PAUSED: 2900560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 2914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 2924b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2934b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PREPARED: 2944b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2954b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARING: 2964b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 2974b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED; 2984b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar break; 2994b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3004b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar default: 3014b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return INVALID_OPERATION; 3024b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 3030560195a71ee26e8546075e56c49ff535fcf1767Wei Jia setPauseStartedTimeIfNeeded(); 3044b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3054b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 3099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 31143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 3139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 31443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 3159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3170560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 31843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 31943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 3209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 32143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 32343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 32443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 3250560195a71ee26e8546075e56c49ff535fcf1767Wei Jia setPauseStartedTimeIfNeeded(); 3269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PAUSED; 32743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 3329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 3369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 33843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 33943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 34043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 34243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 34343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 344dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // pretend that the seek completed. It will actually happen when starting playback. 345dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // TODO: actually perform the seek here, so the player is ready to go at the new 346dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // location 347eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 34843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 34943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 35343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 354a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 355cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 3560560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 35743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->seekToAsync(seekTimeUs); 35843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 35943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 36043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 36343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 36443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 3650560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = seekTimeUs; 3660560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mNotifyTimeRealUs = -1; 36743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 37143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 37243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 37343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPositionUs < 0) { 37443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 3750560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } else if (mNotifyTimeRealUs == -1) { 3760560195a71ee26e8546075e56c49ff535fcf1767Wei Jia *msec = mPositionUs / 1000; 37743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 37815506a6582fb86567c6887c4c426d44be02d12afWei Jia int64_t nowUs = 3790560195a71ee26e8546075e56c49ff535fcf1767Wei Jia (isPlaying() ? ALooper::GetNowUs() : mPauseStartedTimeUs); 38015506a6582fb86567c6887c4c426d44be02d12afWei Jia *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000; 38143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 3835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 38743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 38843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 38943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 390d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 39143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3925bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 393d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 394d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 3955bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 3991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 4001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 4029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 4039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 4049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 4069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 4079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 4089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 409b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 410b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 411b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 412b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4130560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 414b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 415b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 416b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 4189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 4199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 4209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4214b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (mState != STATE_STOPPED) { 4220560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 4234b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 424cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 4259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 4261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 4271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 4291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 4301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 43243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 43343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 43443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 435a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = false; 43643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 440a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnarstatus_t NuPlayerDriver::setLooping(int loop) { 441a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = loop != 0; 442a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar return OK; 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 4500d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 4510d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 4520d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 4530d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4540d268a3cae145afb2720c88ae38fb81550be5584James Dong 4550d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 4560d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 4570d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 4580d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 4590d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 4600d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4610d268a3cae145afb2720c88ae38fb81550be5584James Dong 4620d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 4630d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 4640d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4650d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 4660d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 4670d268a3cae145afb2720c88ae38fb81550be5584James Dong } 468d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 469dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_GET_TRACK_INFO: 470dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 471dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->getTrackInfo(reply); 472dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 473dcb89b3b505522efde173c105a851c412f947178Chong Zhang 474dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_SELECT_TRACK: 475dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 476dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 477dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, true /* select */); 478dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 479dcb89b3b505522efde173c105a851c412f947178Chong Zhang 480dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_UNSELECT_TRACK: 481dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 482dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 483dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, false /* select */); 484dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 485dcb89b3b505522efde173c105a851c412f947178Chong Zhang 4867c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih case INVOKE_ID_GET_SELECTED_TRACK: 4877c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih { 4887c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih int32_t type = request.readInt32(); 4897c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih return mPlayer->getSelectedTrack(type, reply); 4907c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih } 4917c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih 4920d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 4930d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4940d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 4950d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4960d268a3cae145afb2720c88ae38fb81550be5584James Dong } 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 499f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter( 50484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int /* key */, const Parcel & /* request */) { 5054f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5064f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5074f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 50884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 5094f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5104f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5114f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 512f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 51384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 5149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 5179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 5199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 5229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 5239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 5269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 5279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 5309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 5319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 5349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 5359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 538f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 5401aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 5419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 5439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 5441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 5451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 54713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhangvoid NuPlayerDriver::notifySetSurfaceComplete() { 54813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang Mutex::Autolock autoLock(mLock); 54913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 55013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang CHECK(mSetSurfaceInProgress); 55113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = false; 55213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 55313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.broadcast(); 55413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang} 55513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 55643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 55743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 55843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 55943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 56043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 56143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 56243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 56343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = positionUs; 56415506a6582fb86567c6887c4c426d44be02d12afWei Jia mNotifyTimeRealUs = ALooper::GetNowUs(); 56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 56643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 56743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 568eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen Mutex::Autolock autoLock(mLock); 569eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 570eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen} 571eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen 572eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissenvoid NuPlayerDriver::notifySeekComplete_l() { 5734b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar bool wasSeeking = true; 574eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (mState == STATE_STOPPED_AND_PREPARING) { 575eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen wasSeeking = false; 576eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mState = STATE_STOPPED_AND_PREPARED; 577eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mCondition.broadcast(); 578eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (!mIsAsyncPrepare) { 579eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // if we are preparing synchronously, no need to notify listener 5804b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return; 5814b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 582eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen } else if (mState == STATE_STOPPED) { 583eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // no need to notify listener 584eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen return; 5854b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 5860560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); 58743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 58843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats( 5903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t numFramesTotal, int64_t numFramesDropped) { 5913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 5923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = numFramesTotal; 5933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = numFramesDropped; 5943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 5953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 59684333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump( 59784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int fd, const Vector<String16> & /* args */) const { 5983fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 5993fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6003fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber FILE *out = fdopen(dup(fd), "w"); 6013fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6023fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " NuPlayer\n"); 603377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT fprintf(out, " numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), " 6043fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "percentageDropped(%.2f)\n", 6053fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, 6063fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped, 6073fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal == 0 6083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 6093fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fclose(out); 6113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber out = NULL; 6123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6133fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 6143fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 6153fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 616dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayerDriver::notifyListener( 617dcb89b3b505522efde173c105a851c412f947178Chong Zhang int msg, int ext1, int ext2, const Parcel *in) { 6180560195a71ee26e8546075e56c49ff535fcf1767Wei Jia Mutex::Autolock autoLock(mLock); 6190560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(msg, ext1, ext2, in); 6200560195a71ee26e8546075e56c49ff535fcf1767Wei Jia} 6210560195a71ee26e8546075e56c49ff535fcf1767Wei Jia 6220560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::notifyListener_l( 6230560195a71ee26e8546075e56c49ff535fcf1767Wei Jia int msg, int ext1, int ext2, const Parcel *in) { 624a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar switch (msg) { 625a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_PLAYBACK_COMPLETE: 626a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 627a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar if (mLooping) { 6280560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.unlock(); 629a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mPlayer->seekToAsync(0); 6300560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.lock(); 631a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 632a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 633a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar // fall through 634a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 635a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 636a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_ERROR: 637a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 638a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mAtEOS = true; 6390560195a71ee26e8546075e56c49ff535fcf1767Wei Jia setPauseStartedTimeIfNeeded(); 640a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 641a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 642a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 643a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar default: 644a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 645a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 646a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 6470560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.unlock(); 648dcb89b3b505522efde173c105a851c412f947178Chong Zhang sendEvent(msg, ext1, ext2, in); 6490560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.lock(); 650a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 651a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 6529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 6539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 6569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 6599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 6609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 6639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 665b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 666b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 667b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 668b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 669b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 670b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 671b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 672b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 6739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 6749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 678ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 6790560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 680ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 6819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARED; 6829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 683ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 6840560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 685ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 6869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_UNPREPARED; 6879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 6889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 6909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 6939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 6969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6980560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::setPauseStartedTimeIfNeeded() { 6990560195a71ee26e8546075e56c49ff535fcf1767Wei Jia if (mPauseStartedTimeUs == -1) { 7000560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPauseStartedTimeUs = ALooper::GetNowUs(); 7010560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 7020560195a71ee26e8546075e56c49ff535fcf1767Wei Jia} 7030560195a71ee26e8546075e56c49ff535fcf1767Wei Jia 704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 705