NuPlayerDriver.cpp revision 707eadef2ad1388bafdb2d003a4169208fa99811
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> 29a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu#include <media/stagefright/foundation/AUtils.h> 309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include <media/stagefright/MetaData.h> 312abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung#include <media/stagefright/Utils.h> 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 35f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::NuPlayerDriver() 369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber : mState(STATE_IDLE), 37ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare(false), 389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult(UNKNOWN_ERROR), 3913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress(false), 4043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs(-1), 4143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs(-1), 42a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mSeekInProgress(false), 431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mLooper(new ALooper), 449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags(0), 45a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS(false), 46a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping(false), 47f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAutoLoop(false), 4843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 492abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("NuPlayerDriver(%p)", this); 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() { 642abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("~NuPlayerDriver(%p)", this); 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 779b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 791b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 801b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 811b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 822abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) url(%s)", this, uriDebugString(url, false).c_str()); 839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 8443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 9043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 911b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mPlayer->setDataSourceAsync(httpService, url, headers); 929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 1012abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) file(%d)", this, fd); 1029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 107afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1202abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) stream source", this); 1219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 12243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 12843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 1309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1381173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1398ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 1402abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setVideoSurfaceTexture(%p)", this); 14157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 14257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 14313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang if (mSetSurfaceInProgress) { 14413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang return INVALID_OPERATION; 14513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 14613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 15613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = true; 15713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1588ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 15957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 16013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang while (mSetSurfaceInProgress) { 16113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.wait(mLock); 16213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 16313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1641173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1651173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1661173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1682abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("prepare(%p)", this); 1699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 177ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 178ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 179ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 180ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 181ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 1829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 1849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1874b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 1884b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 1894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 1904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 1914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = false; 192dab70a065a8e972d272ed948e77cf2cd0f1525e1Wei Jia mPlayer->seekToAsync(0, true /* needNotify */); 1934b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar while (mState == STATE_STOPPED_AND_PREPARING) { 1944b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mCondition.wait(mLock); 1954b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 1964b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; 1979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 2009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 201afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 2032abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("prepareAsync(%p)", this); 2049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2055bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 2079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 209ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 2109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 2119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 2124b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2134b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 2144b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 2154b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 2164b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = true; 217dab70a065a8e972d272ed948e77cf2cd0f1525e1Wei Jia mPlayer->seekToAsync(0, true /* needNotify */); 2184b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 2199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 2252abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("start(%p)", this); 2269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 22843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2429421174a2f002fef31b330fb04e00105a905dca4Wei Jia case STATE_PAUSED: 2439421174a2f002fef31b330fb04e00105a905dca4Wei Jia case STATE_STOPPED_AND_PREPARED: 2449421174a2f002fef31b330fb04e00105a905dca4Wei Jia { 2459421174a2f002fef31b330fb04e00105a905dca4Wei Jia if (mAtEOS && mStartupSeekTimeUs < 0) { 2469421174a2f002fef31b330fb04e00105a905dca4Wei Jia mStartupSeekTimeUs = 0; 2479421174a2f002fef31b330fb04e00105a905dca4Wei Jia mPositionUs = -1; 2489421174a2f002fef31b330fb04e00105a905dca4Wei Jia } 2499421174a2f002fef31b330fb04e00105a905dca4Wei Jia 2509421174a2f002fef31b330fb04e00105a905dca4Wei Jia // fall through 2519421174a2f002fef31b330fb04e00105a905dca4Wei Jia } 2529421174a2f002fef31b330fb04e00105a905dca4Wei Jia 2539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 25443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 255a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 25643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 25743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 25843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 2599421174a2f002fef31b330fb04e00105a905dca4Wei Jia mPlayer->seekToAsync(mStartupSeekTimeUs); 26043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 26143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 26243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 26343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 26443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2660560195a71ee26e8546075e56c49ff535fcf1767Wei Jia { 2670560195a71ee26e8546075e56c49ff535fcf1767Wei Jia if (mAtEOS) { 2680560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPlayer->seekToAsync(0); 2690560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mAtEOS = false; 2700560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = -1; 2710560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2730560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 27743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 27843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 2852abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("stop(%p)", this); 2864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar Mutex::Autolock autoLock(mLock); 2874b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2884b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar switch (mState) { 2894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_RUNNING: 2904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->pause(); 2914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 2924b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2934b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PAUSED: 2942a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_STOPPED; 2950560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 2962a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen break; 2974b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2984b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PREPARED: 2994b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 3004b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARING: 3014b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 3024b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED; 3034b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar break; 3044b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3054b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar default: 3064b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return INVALID_OPERATION; 3074b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 3084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 3139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 31543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 3179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 31843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 3199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3212a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_PAUSED; 3220560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 32343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 32443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 3259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 32643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 32843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 32943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 3349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 3382abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("seekTo(%p) %d ms", this, msec); 3399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 34143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 34243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 34343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 3459421174a2f002fef31b330fb04e00105a905dca4Wei Jia case STATE_STOPPED_AND_PREPARED: 34643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 34743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 348dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // pretend that the seek completed. It will actually happen when starting playback. 349dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // TODO: actually perform the seek here, so the player is ready to go at the new 350dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // location 351eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 35243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 35343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 35743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 358a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 359a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mSeekInProgress = true; 360cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 3610560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 362e427abf1ea252ff305fc33aacdd2e83cf34891b5Wei Jia mPlayer->seekToAsync(seekTimeUs, true /* needNotify */); 36343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 36443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 36543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 36643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 36843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 36943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 3700560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = seekTimeUs; 37143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 375a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu int64_t tempUs = 0; 376a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu status_t ret = mPlayer->getCurrentPosition(&tempUs); 37743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 378a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu Mutex::Autolock autoLock(mLock); 379a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu // We need to check mSeekInProgress here because mPlayer->seekToAsync is an async call, which 380a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu // means getCurrentPosition can be called before seek is completed. Iow, renderer may return a 381a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu // position value that's different the seek to position. 382a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu if (ret != OK || mSeekInProgress) { 383a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu tempUs = (mPositionUs <= 0) ? 0 : mPositionUs; 38443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 385a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mPositionUs = tempUs; 38643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 387a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu *msec = (int)divRound(tempUs, (int64_t)(1000)); 3885bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 39243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 39343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 39443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 395d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 39643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3975bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 398d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 399d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 4005bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 4042abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("reset(%p)", this); 4051aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 4061aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 4089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 4099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 4109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 4129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 4139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 4149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 415b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 416b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 417b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 418b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4190560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 420b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 421b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 422b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 4249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 4259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 4269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4274b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (mState != STATE_STOPPED) { 4280560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 4294b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 430cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 4319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 4321aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 4331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 4351aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 4361aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 43843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 43943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 44043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 441a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = false; 44243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 446a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnarstatus_t NuPlayerDriver::setLooping(int loop) { 447a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = loop != 0; 448a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar return OK; 449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 455f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 4560d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 4570d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 4580d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 4590d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4600d268a3cae145afb2720c88ae38fb81550be5584James Dong 4610d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 4620d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 4630d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 4640d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 4650d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 4660d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4670d268a3cae145afb2720c88ae38fb81550be5584James Dong 4680d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 4690d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 4700d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4710d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 4720d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 4730d268a3cae145afb2720c88ae38fb81550be5584James Dong } 474d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 475dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_GET_TRACK_INFO: 476dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 477dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->getTrackInfo(reply); 478dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 479dcb89b3b505522efde173c105a851c412f947178Chong Zhang 480dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_SELECT_TRACK: 481dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 482dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 483dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, true /* select */); 484dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 485dcb89b3b505522efde173c105a851c412f947178Chong Zhang 486dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_UNSELECT_TRACK: 487dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 488dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 489dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, false /* select */); 490dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 491dcb89b3b505522efde173c105a851c412f947178Chong Zhang 4927c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih case INVOKE_ID_GET_SELECTED_TRACK: 4937c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih { 4947c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih int32_t type = request.readInt32(); 4957c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih return mPlayer->getSelectedTrack(type, reply); 4967c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih } 4977c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih 4980d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 4990d268a3cae145afb2720c88ae38fb81550be5584James Dong { 5000d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 5010d268a3cae145afb2720c88ae38fb81550be5584James Dong } 5020d268a3cae145afb2720c88ae38fb81550be5584James Dong } 503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 505f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 507f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAudioSink = audioSink; 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter( 51184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int /* key */, const Parcel & /* request */) { 5124f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5134f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5144f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 51584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 5164f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5174f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5184f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 52084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 5219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 5249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 5269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 5299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 5309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 5339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 5349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 5379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 5389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 5419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 5429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 545f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 5478d121d41f5355b78b687f44e8d4aae4de2aa0359Andy Hung ALOGD("notifyResetComplete(%p)", this); 5481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 5499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 5519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 5521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 5531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 55513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhangvoid NuPlayerDriver::notifySetSurfaceComplete() { 5562abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("notifySetSurfaceComplete(%p)", this); 55713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang Mutex::Autolock autoLock(mLock); 55813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 55913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang CHECK(mSetSurfaceInProgress); 56013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = false; 56113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 56213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.broadcast(); 56313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang} 56413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 56643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 56743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 56843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 56943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 57043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 5712abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("notifySeekComplete(%p)", this); 572eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen Mutex::Autolock autoLock(mLock); 573a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mSeekInProgress = false; 574eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 575eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen} 576eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen 577eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissenvoid NuPlayerDriver::notifySeekComplete_l() { 5784b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar bool wasSeeking = true; 579eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (mState == STATE_STOPPED_AND_PREPARING) { 580eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen wasSeeking = false; 581eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mState = STATE_STOPPED_AND_PREPARED; 582eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mCondition.broadcast(); 583eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (!mIsAsyncPrepare) { 584eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // if we are preparing synchronously, no need to notify listener 5854b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return; 5864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 587eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen } else if (mState == STATE_STOPPED) { 588eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // no need to notify listener 589eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen return; 5904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 5910560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); 59243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 59343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 59484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump( 59584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int fd, const Vector<String16> & /* args */) const { 596a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu int64_t numFramesTotal; 597a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu int64_t numFramesDropped; 598a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mPlayer->getStats(&numFramesTotal, &numFramesDropped); 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", 605a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu numFramesTotal, 606a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu numFramesDropped, 607a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu numFramesTotal == 0 608a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu ? 0.0 : (double)numFramesDropped / numFramesTotal); 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 { 62771079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia if (mState != STATE_RESET_IN_PROGRESS) { 628707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen if (mAutoLoop) { 629707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen audio_stream_type_t streamType = AUDIO_STREAM_MUSIC; 630707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen if (mAudioSink != NULL) { 631707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen streamType = mAudioSink->getAudioStreamType(); 632707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen } 633707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen if (streamType == AUDIO_STREAM_NOTIFICATION) { 634707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen ALOGW("disabling auto-loop for notification"); 635707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen mAutoLoop = false; 636707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen } 637707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen } 638f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen if (mLooping || (mAutoLoop 639f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen && (mAudioSink == NULL || mAudioSink->realtime()))) { 64071079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mPlayer->seekToAsync(0); 641368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen if (mAudioSink != NULL) { 642368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen // The renderer has stopped the sink at the end in order to play out 643368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen // the last little bit of audio. If we're looping, we need to restart it. 644368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen mAudioSink->start(); 645368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen } 64671079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia break; 64771079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia } 64871079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia 64971079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mPlayer->pause(); 65071079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mState = STATE_PAUSED; 651a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 652a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar // fall through 653a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 654a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 655a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_ERROR: 656a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 657a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mAtEOS = true; 658a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 659a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 660a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 661a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar default: 662a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 663a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 664a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 6650560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.unlock(); 666dcb89b3b505522efde173c105a851c412f947178Chong Zhang sendEvent(msg, ext1, ext2, in); 6670560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.lock(); 668a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 669a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 6709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 6719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 6749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 6779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 6789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 6819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 683b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 684b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 685b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 686b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 687b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 688b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 689b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 690b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 6919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 6929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 6962a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen // update state before notifying client, so that if client calls back into NuPlayerDriver 6972a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen // in response, NuPlayerDriver has the right state 6982a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_PREPARED; 699ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 7000560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 701ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 7029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 7032a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_UNPREPARED; 704ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 7050560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 706ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 7079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 7089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 709f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen sp<MetaData> meta = mPlayer->getFileMeta(); 710f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen int32_t loop; 711f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen if (meta != NULL 712f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen && meta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 713f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAutoLoop = true; 714f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen } 715f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen 7169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 7179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 7209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 7239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 726