NuPlayerDriver.cpp revision e427abf1ea252ff305fc33aacdd2e83cf34891b5
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), 48f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAutoLoop(false), 4943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->setName("NuPlayerDriver Looper"); 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->start( 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber false, /* runOnCallingThread */ 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber true, /* canCallJava */ 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PRIORITY_AUDIO); 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer = new NuPlayer; 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->registerHandler(mPlayer); 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->setDriver(this); 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 63f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() { 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 781b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 791b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 801b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 8243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 83a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: url=%s", url); 849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 8943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 901b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mPlayer->setDataSourceAsync(httpService, url, headers); 919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 1009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 102a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: fd=%d", fd); 1039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 121a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: stream source"); 1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 12743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1371173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1388ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 13957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 14057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 14113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang if (mSetSurfaceInProgress) { 14213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang return INVALID_OPERATION; 14313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 14413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 15413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = true; 15513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1568ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 15757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 15813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang while (mSetSurfaceInProgress) { 15913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.wait(mLock); 16013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 16113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1621173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1631173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1641173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 174ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 175ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 176ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 177ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 178ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 1799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 1819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1844b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 1854b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 1864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 1874b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 1884b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = false; 1894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 1904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar while (mState == STATE_STOPPED_AND_PREPARING) { 1914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mCondition.wait(mLock); 1924b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 1934b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; 1949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 1979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 2009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 2039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 205ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 2069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 2079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 2084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 2104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 2114b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 2124b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = true; 2134b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 2144b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 2159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 220f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 2219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 22343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 23843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 239a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 24043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 24143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 24243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 243e427abf1ea252ff305fc33aacdd2e83cf34891b5Wei Jia if (mStartupSeekTimeUs > 0) { 2442048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mPlayer->seekToAsync(mStartupSeekTimeUs); 2452048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 2462048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 24743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 24843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 24943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 25043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 25143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2530560195a71ee26e8546075e56c49ff535fcf1767Wei Jia { 2540560195a71ee26e8546075e56c49ff535fcf1767Wei Jia if (mAtEOS) { 2550560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPlayer->seekToAsync(0); 2560560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mAtEOS = false; 2570560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = -1; 2580560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2600560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2634b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 2649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2656e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih if (mAtEOS) { 2666e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mPlayer->seekToAsync(0); 2676e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mAtEOS = false; 2686e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mPlayer->resume(); 2696e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mPositionUs = -1; 2706e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih } else { 2716e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mPlayer->resume(); 27209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung if (mNotifyTimeRealUs != -1) { 27309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // Pause time must be set if here by setPauseStartedTimeIfNeeded(). 27409e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung //CHECK(mPauseStartedTimeUs != -1); 27509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung 27609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // if no seek occurs, adjust our notify time so that getCurrentPosition() 27709e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // is continuous if read immediately after calling start(). 27809e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung mNotifyTimeRealUs += ALooper::GetNowUs() - mPauseStartedTimeUs; 27909e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung } 2806e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih } 28143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 28243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 28643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 28743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 2890560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPauseStartedTimeUs = -1; 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 2954b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar Mutex::Autolock autoLock(mLock); 2964b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2974b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar switch (mState) { 2984b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_RUNNING: 2994b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->pause(); 3004b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 3014b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3024b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PAUSED: 3032a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_STOPPED; 3040560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 3052a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen break; 3064b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3074b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PREPARED: 3084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 3094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARING: 3104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 3114b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED; 3124b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar break; 3134b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3144b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar default: 3154b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return INVALID_OPERATION; 3164b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 3170560195a71ee26e8546075e56c49ff535fcf1767Wei Jia setPauseStartedTimeIfNeeded(); 3184b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3194b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 3239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 32543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 3279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 32843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 3299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3312a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen setPauseStartedTimeIfNeeded(); 3322a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_PAUSED; 3330560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 33443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 33543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 3369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 33743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 33943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 34043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 3459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 3499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 35143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 35243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 35343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 35543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 35643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 357dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // pretend that the seek completed. It will actually happen when starting playback. 358dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // TODO: actually perform the seek here, so the player is ready to go at the new 359dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // location 360eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 36243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 36643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 367a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 368cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 3690560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 370e427abf1ea252ff305fc33aacdd2e83cf34891b5Wei Jia mPlayer->seekToAsync(seekTimeUs, true /* needNotify */); 37143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 37243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 37343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 37443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 37643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 37743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 3780560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = seekTimeUs; 3790560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mNotifyTimeRealUs = -1; 38043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 38443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 38543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 38643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPositionUs < 0) { 38709e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // mPositionUs is the media time. 38809e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // It is negative under these cases 38909e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // (1) == -1 after reset, or very first playback, no stream notification yet. 39009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // (2) == -1 start after end of stream, no stream notification yet. 39109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // (3) == large negative # after ~292,471 years of continuous playback. 39209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung 39309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung //CHECK_EQ(mPositionUs, -1); 39443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 3950560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } else if (mNotifyTimeRealUs == -1) { 39609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // A seek has occurred just occurred, no stream notification yet. 39709e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // mPositionUs (>= 0) is the new media position. 3980560195a71ee26e8546075e56c49ff535fcf1767Wei Jia *msec = mPositionUs / 1000; 39943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 40009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // mPosition must be valid (i.e. >= 0) by the first check above. 40109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // We're either playing or have pause time set: mPauseStartedTimeUs is >= 0 40209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung //LOG_ALWAYS_FATAL_IF( 40309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // !isPlaying() && mPauseStartedTimeUs < 0, 40409e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // "Player in non-playing mState(%d) and mPauseStartedTimeUs(%lld) < 0", 40509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // mState, (long long)mPauseStartedTimeUs); 40609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung ALOG_ASSERT(mNotifyTimeRealUs >= 0); 40715506a6582fb86567c6887c4c426d44be02d12afWei Jia int64_t nowUs = 4080560195a71ee26e8546075e56c49ff535fcf1767Wei Jia (isPlaying() ? ALooper::GetNowUs() : mPauseStartedTimeUs); 40915506a6582fb86567c6887c4c426d44be02d12afWei Jia *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000; 41009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // It is possible for *msec to be negative if the media position is > 596 hours. 41109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // but we turn on this checking in NDEBUG == 0 mode. 41209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung ALOG_ASSERT(*msec >= 0); 41309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung ALOGV("getCurrentPosition nowUs(%lld)", (long long)nowUs); 41443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 41509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung ALOGV("getCurrentPosition returning(%d) mPositionUs(%lld) mNotifyRealTimeUs(%lld)", 41609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung *msec, (long long)mPositionUs, (long long)mNotifyTimeRealUs); 4175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 42143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 42243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 42343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 424d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 42543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 4265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 427d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 428d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 4295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 4331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 4341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 4369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 4379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 4389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 4409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 4419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 4429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 443b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 444b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 445b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 446b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4470560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 448b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 449b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 450b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 4529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 4539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 4549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4554b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (mState != STATE_STOPPED) { 4560560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 4574b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 458cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 4599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 4601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 4611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 4641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 46643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 46743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 46843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 469a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = false; 47043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 474a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnarstatus_t NuPlayerDriver::setLooping(int loop) { 475a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = loop != 0; 476a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar return OK; 477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 479f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 483f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 4840d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 4850d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 4860d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 4870d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4880d268a3cae145afb2720c88ae38fb81550be5584James Dong 4890d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 4900d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 4910d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 4920d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 4930d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 4940d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4950d268a3cae145afb2720c88ae38fb81550be5584James Dong 4960d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 4970d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 4980d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4990d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 5000d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 5010d268a3cae145afb2720c88ae38fb81550be5584James Dong } 502d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 503dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_GET_TRACK_INFO: 504dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 505dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->getTrackInfo(reply); 506dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 507dcb89b3b505522efde173c105a851c412f947178Chong Zhang 508dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_SELECT_TRACK: 509dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 510dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 511dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, true /* select */); 512dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 513dcb89b3b505522efde173c105a851c412f947178Chong Zhang 514dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_UNSELECT_TRACK: 515dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 516dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 517dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, false /* select */); 518dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 519dcb89b3b505522efde173c105a851c412f947178Chong Zhang 5207c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih case INVOKE_ID_GET_SELECTED_TRACK: 5217c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih { 5227c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih int32_t type = request.readInt32(); 5237c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih return mPlayer->getSelectedTrack(type, reply); 5247c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih } 5257c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih 5260d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 5270d268a3cae145afb2720c88ae38fb81550be5584James Dong { 5280d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 5290d268a3cae145afb2720c88ae38fb81550be5584James Dong } 5300d268a3cae145afb2720c88ae38fb81550be5584James Dong } 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 533f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 535f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAudioSink = audioSink; 536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter( 53984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int /* key */, const Parcel & /* request */) { 5404f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5414f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5424f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 54384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 5444f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5454f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5464f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 54884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 5499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 5529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 5549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 5579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 5589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 5619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 5629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 5659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 5669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 5699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 5709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 5751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 5769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 5789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 5791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 5801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 58213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhangvoid NuPlayerDriver::notifySetSurfaceComplete() { 58313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang Mutex::Autolock autoLock(mLock); 58413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 58513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang CHECK(mSetSurfaceInProgress); 58613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = false; 58713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 58813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.broadcast(); 58913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang} 59013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 59143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 59243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 59343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 59443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 59543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 59643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 59743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 59873ddd210ea572375198cac1d4960df793745fb4bWei Jia if (isPlaying()) { 59973ddd210ea572375198cac1d4960df793745fb4bWei Jia mPositionUs = positionUs; 60073ddd210ea572375198cac1d4960df793745fb4bWei Jia mNotifyTimeRealUs = ALooper::GetNowUs(); 60173ddd210ea572375198cac1d4960df793745fb4bWei Jia } 60243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 60343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 605eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen Mutex::Autolock autoLock(mLock); 606eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 607eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen} 608eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen 609eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissenvoid NuPlayerDriver::notifySeekComplete_l() { 6104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar bool wasSeeking = true; 611eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (mState == STATE_STOPPED_AND_PREPARING) { 612eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen wasSeeking = false; 613eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mState = STATE_STOPPED_AND_PREPARED; 614eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mCondition.broadcast(); 615eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (!mIsAsyncPrepare) { 616eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // if we are preparing synchronously, no need to notify listener 6174b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return; 6184b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 619eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen } else if (mState == STATE_STOPPED) { 620eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // no need to notify listener 621eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen return; 6224b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 6230560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); 62443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 62543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 6263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats( 6273fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t numFramesTotal, int64_t numFramesDropped) { 6283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 6293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = numFramesTotal; 6303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = numFramesDropped; 6313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 6323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 63384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump( 63484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int fd, const Vector<String16> & /* args */) const { 6353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 6363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber FILE *out = fdopen(dup(fd), "w"); 6383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " NuPlayer\n"); 640377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT fprintf(out, " numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), " 6413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "percentageDropped(%.2f)\n", 6423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, 6433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped, 6443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal == 0 6453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 6463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fclose(out); 6483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber out = NULL; 6493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 6513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 6523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 653dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayerDriver::notifyListener( 654dcb89b3b505522efde173c105a851c412f947178Chong Zhang int msg, int ext1, int ext2, const Parcel *in) { 6550560195a71ee26e8546075e56c49ff535fcf1767Wei Jia Mutex::Autolock autoLock(mLock); 6560560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(msg, ext1, ext2, in); 6570560195a71ee26e8546075e56c49ff535fcf1767Wei Jia} 6580560195a71ee26e8546075e56c49ff535fcf1767Wei Jia 6590560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::notifyListener_l( 6600560195a71ee26e8546075e56c49ff535fcf1767Wei Jia int msg, int ext1, int ext2, const Parcel *in) { 661a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar switch (msg) { 662a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_PLAYBACK_COMPLETE: 663a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 66471079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia if (mState != STATE_RESET_IN_PROGRESS) { 665f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen if (mLooping || (mAutoLoop 666f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen && (mAudioSink == NULL || mAudioSink->realtime()))) { 66771079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mPlayer->seekToAsync(0); 66871079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia break; 66971079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia } 67071079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia 67171079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mPlayer->pause(); 67271079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mState = STATE_PAUSED; 673a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 674a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar // fall through 675a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 676a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 677a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_ERROR: 678a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 679a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mAtEOS = true; 6800560195a71ee26e8546075e56c49ff535fcf1767Wei Jia setPauseStartedTimeIfNeeded(); 681a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 682a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 683a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 684a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar default: 685a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 686a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 687a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 6880560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.unlock(); 689dcb89b3b505522efde173c105a851c412f947178Chong Zhang sendEvent(msg, ext1, ext2, in); 6900560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.lock(); 691a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 692a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 6939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 6949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 6979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 7009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 7019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 7049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 706b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 707b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 708b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 709b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 710b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 711b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 712b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 713b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 7149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 7159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 7179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 7192a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen // update state before notifying client, so that if client calls back into NuPlayerDriver 7202a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen // in response, NuPlayerDriver has the right state 7212a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_PREPARED; 722ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 7230560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 724ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 7259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 7262a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_UNPREPARED; 727ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 7280560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 729ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 7309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 7319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 732f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen sp<MetaData> meta = mPlayer->getFileMeta(); 733f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen int32_t loop; 734f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen if (meta != NULL 735f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen && meta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 736f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAutoLoop = true; 737f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen } 738f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen 7399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 7409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 7439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 7469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7480560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::setPauseStartedTimeIfNeeded() { 7490560195a71ee26e8546075e56c49ff535fcf1767Wei Jia if (mPauseStartedTimeUs == -1) { 7500560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPauseStartedTimeUs = ALooper::GetNowUs(); 7510560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 7520560195a71ee26e8546075e56c49ff535fcf1767Wei Jia} 7530560195a71ee26e8546075e56c49ff535fcf1767Wei Jia 754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 755