NuPlayerDriver.cpp revision 2abde2c118a94f843a7450818c925d3f0b673cd3
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> 302abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung#include <media/stagefright/Utils.h> 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 34f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::NuPlayerDriver() 359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber : mState(STATE_IDLE), 36ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare(false), 379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult(UNKNOWN_ERROR), 3813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress(false), 3943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs(-1), 4043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs(-1), 410560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mNotifyTimeRealUs(-1), 420560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPauseStartedTimeUs(-1), 433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0), 443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped(0), 451aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mLooper(new ALooper), 469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags(0), 47a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS(false), 48a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping(false), 49f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAutoLoop(false), 5043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 512abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("NuPlayerDriver(%p)", this); 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->setName("NuPlayerDriver Looper"); 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->start( 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber false, /* runOnCallingThread */ 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber true, /* canCallJava */ 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PRIORITY_AUDIO); 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer = new NuPlayer; 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->registerHandler(mPlayer); 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->setDriver(this); 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 65f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() { 662abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("~NuPlayerDriver(%p)", this); 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 779b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 789b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 799b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 80f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 811b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 821b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 831b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 842abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) url(%s)", this, uriDebugString(url, false).c_str()); 859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 8643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 905bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 9243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 931b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mPlayer->setDataSourceAsync(httpService, url, headers); 949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 1032abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) file(%d)", this, fd); 1049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 109afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 111afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1222abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) stream source", this); 1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 13043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 1329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1401173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1418ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 1422abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setVideoSurfaceTexture(%p)", this); 14357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 14457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 14513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang if (mSetSurfaceInProgress) { 14613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang return INVALID_OPERATION; 14713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 14813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 15813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = true; 15913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1608ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 16157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 16213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang while (mSetSurfaceInProgress) { 16313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.wait(mLock); 16413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 16513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1661173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1671173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1681173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1702abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("prepare(%p)", this); 1719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 179ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 180ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 181ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 182ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 183ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 1849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 1869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 1904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 1914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 1924b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 1934b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = false; 1944b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 1954b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar while (mState == STATE_STOPPED_AND_PREPARING) { 1964b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mCondition.wait(mLock); 1974b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 1984b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; 1999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 203afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 2049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 2052abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("prepareAsync(%p)", this); 2069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2075bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 2099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 211ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 2129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 2139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 2144b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2154b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 2164b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 2174b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 2184b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = true; 2194b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 2204b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 2219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 226f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 2272abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("start(%p)", this); 2289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 23043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 24543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 246a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 24743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 24843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 24943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 250e427abf1ea252ff305fc33aacdd2e83cf34891b5Wei Jia if (mStartupSeekTimeUs > 0) { 2512048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mPlayer->seekToAsync(mStartupSeekTimeUs); 2522048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 2532048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 25443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 25543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 25643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 25743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 25843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2600560195a71ee26e8546075e56c49ff535fcf1767Wei Jia { 2610560195a71ee26e8546075e56c49ff535fcf1767Wei Jia if (mAtEOS) { 2620560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPlayer->seekToAsync(0); 2630560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mAtEOS = false; 2640560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = -1; 2650560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2670560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2704b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 2719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2726e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih if (mAtEOS) { 2736e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mPlayer->seekToAsync(0); 2746e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mAtEOS = false; 2756e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mPlayer->resume(); 2766e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mPositionUs = -1; 2776e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih } else { 2786e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih mPlayer->resume(); 27909e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung if (mNotifyTimeRealUs != -1) { 28009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // Pause time must be set if here by setPauseStartedTimeIfNeeded(). 28109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung //CHECK(mPauseStartedTimeUs != -1); 28209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung 28309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // if no seek occurs, adjust our notify time so that getCurrentPosition() 28409e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // is continuous if read immediately after calling start(). 28509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung mNotifyTimeRealUs += ALooper::GetNowUs() - mPauseStartedTimeUs; 28609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung } 2876e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih } 28843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 28943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 29343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 29443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 2960560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPauseStartedTimeUs = -1; 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 3022abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("stop(%p)", this); 3034b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar Mutex::Autolock autoLock(mLock); 3044b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3054b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar switch (mState) { 3064b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_RUNNING: 3074b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->pause(); 3084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 3094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PAUSED: 3112a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_STOPPED; 3120560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 3132a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen break; 3144b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3154b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PREPARED: 3164b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 3174b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARING: 3184b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 3194b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED; 3204b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar break; 3214b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3224b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar default: 3234b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return INVALID_OPERATION; 3244b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 3250560195a71ee26e8546075e56c49ff535fcf1767Wei Jia setPauseStartedTimeIfNeeded(); 3264b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3274b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 3319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 33343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 3359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 33643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 3379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3392a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen setPauseStartedTimeIfNeeded(); 3402a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_PAUSED; 3410560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 34243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 34343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 3449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 34543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 34743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 34843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 3539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 3572abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("seekTo(%p) %d ms", this, msec); 3589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 36043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 36243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 36443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 36543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 366dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // pretend that the seek completed. It will actually happen when starting playback. 367dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // TODO: actually perform the seek here, so the player is ready to go at the new 368dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // location 369eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 37043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 37143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 37543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 376a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 377cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 3780560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 379e427abf1ea252ff305fc33aacdd2e83cf34891b5Wei Jia mPlayer->seekToAsync(seekTimeUs, true /* needNotify */); 38043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 38143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 38243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 38343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 38543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 38643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 3870560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = seekTimeUs; 3880560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mNotifyTimeRealUs = -1; 38943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 39343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 39443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 39543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPositionUs < 0) { 39609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // mPositionUs is the media time. 39709e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // It is negative under these cases 39809e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // (1) == -1 after reset, or very first playback, no stream notification yet. 39909e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // (2) == -1 start after end of stream, no stream notification yet. 40009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // (3) == large negative # after ~292,471 years of continuous playback. 40109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung 40209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung //CHECK_EQ(mPositionUs, -1); 40343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 4040560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } else if (mNotifyTimeRealUs == -1) { 40509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // A seek has occurred just occurred, no stream notification yet. 40609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // mPositionUs (>= 0) is the new media position. 4070560195a71ee26e8546075e56c49ff535fcf1767Wei Jia *msec = mPositionUs / 1000; 40843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 40909e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // mPosition must be valid (i.e. >= 0) by the first check above. 41009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // We're either playing or have pause time set: mPauseStartedTimeUs is >= 0 41109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung //LOG_ALWAYS_FATAL_IF( 41209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // !isPlaying() && mPauseStartedTimeUs < 0, 41309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // "Player in non-playing mState(%d) and mPauseStartedTimeUs(%lld) < 0", 41409e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // mState, (long long)mPauseStartedTimeUs); 41509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung ALOG_ASSERT(mNotifyTimeRealUs >= 0); 41615506a6582fb86567c6887c4c426d44be02d12afWei Jia int64_t nowUs = 4170560195a71ee26e8546075e56c49ff535fcf1767Wei Jia (isPlaying() ? ALooper::GetNowUs() : mPauseStartedTimeUs); 41815506a6582fb86567c6887c4c426d44be02d12afWei Jia *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000; 41909e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // It is possible for *msec to be negative if the media position is > 596 hours. 42009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung // but we turn on this checking in NDEBUG == 0 mode. 42109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung ALOG_ASSERT(*msec >= 0); 42209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung ALOGV("getCurrentPosition nowUs(%lld)", (long long)nowUs); 42343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 42409e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung ALOGV("getCurrentPosition returning(%d) mPositionUs(%lld) mNotifyRealTimeUs(%lld)", 42509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung *msec, (long long)mPositionUs, (long long)mNotifyTimeRealUs); 4265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 43043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 43143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 43243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 433d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 43443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 4355bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 436d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 437d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 4385bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 441f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 4422abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("reset(%p)", this); 4431aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 4441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 4469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 4479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 4489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 4509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 4519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 4529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 453b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 454b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 455b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 456b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4570560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 458b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 459b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 460b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 4629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 4639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 4649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4654b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (mState != STATE_STOPPED) { 4660560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 4674b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 468cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 4699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 4701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 4711aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 4731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 4741aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 47643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 47743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 47843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 479a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = false; 48043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 484a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnarstatus_t NuPlayerDriver::setLooping(int loop) { 485a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = loop != 0; 486a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar return OK; 487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 489f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 491f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 4940d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 4950d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 4960d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 4970d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4980d268a3cae145afb2720c88ae38fb81550be5584James Dong 4990d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 5000d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 5010d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 5020d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 5030d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 5040d268a3cae145afb2720c88ae38fb81550be5584James Dong } 5050d268a3cae145afb2720c88ae38fb81550be5584James Dong 5060d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 5070d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 5080d268a3cae145afb2720c88ae38fb81550be5584James Dong { 5090d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 5100d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 5110d268a3cae145afb2720c88ae38fb81550be5584James Dong } 512d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 513dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_GET_TRACK_INFO: 514dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 515dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->getTrackInfo(reply); 516dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 517dcb89b3b505522efde173c105a851c412f947178Chong Zhang 518dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_SELECT_TRACK: 519dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 520dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 521dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, true /* select */); 522dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 523dcb89b3b505522efde173c105a851c412f947178Chong Zhang 524dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_UNSELECT_TRACK: 525dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 526dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 527dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, false /* select */); 528dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 529dcb89b3b505522efde173c105a851c412f947178Chong Zhang 5307c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih case INVOKE_ID_GET_SELECTED_TRACK: 5317c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih { 5327c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih int32_t type = request.readInt32(); 5337c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih return mPlayer->getSelectedTrack(type, reply); 5347c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih } 5357c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih 5360d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 5370d268a3cae145afb2720c88ae38fb81550be5584James Dong { 5380d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 5390d268a3cae145afb2720c88ae38fb81550be5584James Dong } 5400d268a3cae145afb2720c88ae38fb81550be5584James Dong } 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 542f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 543f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 545f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAudioSink = audioSink; 546f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 547f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter( 54984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int /* key */, const Parcel & /* request */) { 5504f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5514f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5524f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 55384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 5544f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5554f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5564f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 55884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 5599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 5629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 5649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 5679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 5689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 5719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 5729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 5759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 5769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 5799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 5809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 582f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 583f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 5852abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGI("notifyResetComplete(%p)", this); 5861aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 5879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 5899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 5901aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 5911aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5921aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 59313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhangvoid NuPlayerDriver::notifySetSurfaceComplete() { 5942abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("notifySetSurfaceComplete(%p)", this); 59513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang Mutex::Autolock autoLock(mLock); 59613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 59713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang CHECK(mSetSurfaceInProgress); 59813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = false; 59913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 60013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.broadcast(); 60113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang} 60213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 60343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 60543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 60643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 60743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 60843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 60943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 61073ddd210ea572375198cac1d4960df793745fb4bWei Jia if (isPlaying()) { 61173ddd210ea572375198cac1d4960df793745fb4bWei Jia mPositionUs = positionUs; 61273ddd210ea572375198cac1d4960df793745fb4bWei Jia mNotifyTimeRealUs = ALooper::GetNowUs(); 61373ddd210ea572375198cac1d4960df793745fb4bWei Jia } 61443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 61543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 61643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 6172abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("notifySeekComplete(%p)", this); 618eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen Mutex::Autolock autoLock(mLock); 619eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 620eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen} 621eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen 622eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissenvoid NuPlayerDriver::notifySeekComplete_l() { 6234b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar bool wasSeeking = true; 624eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (mState == STATE_STOPPED_AND_PREPARING) { 625eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen wasSeeking = false; 626eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mState = STATE_STOPPED_AND_PREPARED; 627eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mCondition.broadcast(); 628eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (!mIsAsyncPrepare) { 629eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // if we are preparing synchronously, no need to notify listener 6304b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return; 6314b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 632eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen } else if (mState == STATE_STOPPED) { 633eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // no need to notify listener 634eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen return; 6354b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 6360560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); 63743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 63843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 6393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats( 6403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t numFramesTotal, int64_t numFramesDropped) { 6413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 6423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = numFramesTotal; 6433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = numFramesDropped; 6443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 6453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 64684333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump( 64784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int fd, const Vector<String16> & /* args */) const { 6483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 6493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber FILE *out = fdopen(dup(fd), "w"); 6513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " NuPlayer\n"); 653377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT fprintf(out, " numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), " 6543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "percentageDropped(%.2f)\n", 6553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, 6563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped, 6573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal == 0 6583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 6593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fclose(out); 6613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber out = NULL; 6623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 6643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 6653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 666dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayerDriver::notifyListener( 667dcb89b3b505522efde173c105a851c412f947178Chong Zhang int msg, int ext1, int ext2, const Parcel *in) { 6680560195a71ee26e8546075e56c49ff535fcf1767Wei Jia Mutex::Autolock autoLock(mLock); 6690560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(msg, ext1, ext2, in); 6700560195a71ee26e8546075e56c49ff535fcf1767Wei Jia} 6710560195a71ee26e8546075e56c49ff535fcf1767Wei Jia 6720560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::notifyListener_l( 6730560195a71ee26e8546075e56c49ff535fcf1767Wei Jia int msg, int ext1, int ext2, const Parcel *in) { 674a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar switch (msg) { 675a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_PLAYBACK_COMPLETE: 676a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 67771079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia if (mState != STATE_RESET_IN_PROGRESS) { 678f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen if (mLooping || (mAutoLoop 679f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen && (mAudioSink == NULL || mAudioSink->realtime()))) { 68071079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mPlayer->seekToAsync(0); 68171079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia break; 68271079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia } 68371079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia 68471079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mPlayer->pause(); 68571079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mState = STATE_PAUSED; 686a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 687a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar // fall through 688a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 689a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 690a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_ERROR: 691a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 692a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mAtEOS = true; 6930560195a71ee26e8546075e56c49ff535fcf1767Wei Jia setPauseStartedTimeIfNeeded(); 694a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 695a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 696a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 697a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar default: 698a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 699a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 700a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 7010560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.unlock(); 702dcb89b3b505522efde173c105a851c412f947178Chong Zhang sendEvent(msg, ext1, ext2, in); 7030560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.lock(); 704a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 705a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 7069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 7079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 7109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 7129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 7139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 7149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 7179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 719b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 720b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 721b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 722b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 723b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 724b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 725b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 726b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 7279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 7289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 7309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 7322a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen // update state before notifying client, so that if client calls back into NuPlayerDriver 7332a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen // in response, NuPlayerDriver has the right state 7342a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_PREPARED; 735ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 7360560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 737ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 7389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 7392a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_UNPREPARED; 740ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 7410560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 742ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 7439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 7449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 745f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen sp<MetaData> meta = mPlayer->getFileMeta(); 746f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen int32_t loop; 747f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen if (meta != NULL 748f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen && meta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 749f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAutoLoop = true; 750f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen } 751f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen 7529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 7539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 7569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 7599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7610560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::setPauseStartedTimeIfNeeded() { 7620560195a71ee26e8546075e56c49ff535fcf1767Wei Jia if (mPauseStartedTimeUs == -1) { 7630560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPauseStartedTimeUs = ALooper::GetNowUs(); 7640560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 7650560195a71ee26e8546075e56c49ff535fcf1767Wei Jia} 7660560195a71ee26e8546075e56c49ff535fcf1767Wei Jia 767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 768