NuPlayerDriver.cpp revision c6993231c56da1924ba8d67eb150fa953ba54a1b
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/* 2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License. 6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at 7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * 10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software 11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and 14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License. 15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */ 16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayerDriver" 19377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT#include <inttypes.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDriver.h" 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include "NuPlayerSource.h" 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber#include <media/stagefright/foundation/ADebug.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ALooper.h> 299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include <media/stagefright/MetaData.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 33f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::NuPlayerDriver() 349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber : mState(STATE_IDLE), 35ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare(false), 369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult(UNKNOWN_ERROR), 3757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress(false), 3843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs(-1), 3943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs(-1), 403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0), 413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped(0), 421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mLooper(new ALooper), 439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags(0), 44a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS(false), 4543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->setName("NuPlayerDriver Looper"); 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->start( 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber false, /* runOnCallingThread */ 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber true, /* canCallJava */ 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PRIORITY_AUDIO); 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer = new NuPlayer; 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->registerHandler(mPlayer); 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->setDriver(this); 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 59f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() { 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 679b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 689b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 699b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 741b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 751b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 761b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 825bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 8443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 851b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mPlayer->setDataSourceAsync(httpService, url, headers); 869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 96afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 100afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 11443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1301173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1318ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 13257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 13357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mSetSurfaceInProgress) { 13557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber return INVALID_OPERATION; 13657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 13757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress = true; 14857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1498ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 15057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 15157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber while (mSetSurfaceInProgress) { 15257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mCondition.wait(mLock); 15357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 1541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1551173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1561173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1571173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 167ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 168ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 169ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 170ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 171ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 1729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 1749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 1809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 181afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 1839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 188ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 1899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 1919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 1979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 19943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 21443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 215a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 21643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 21743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 21843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 2192048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber if (mStartupSeekTimeUs == 0) { 2202048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber notifySeekComplete(); 2212048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } else { 2222048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mPlayer->seekToAsync(mStartupSeekTimeUs); 2232048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 2242048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 22543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 22643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 22743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 22843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 22943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 235c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen if (mAtEOS) { 236c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen mPlayer->seekToAsync(0); 237c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen } 23843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->resume(); 23943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 24043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 24443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 24543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 251f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 25243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return pause(); 253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 2569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 25843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 26143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 2629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 264cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_PAUSED); 26543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 26643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 2679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 26843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 2699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 27043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 27143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PAUSED; 27343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 2789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 2829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 28443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 28543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 28643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 28843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 289c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen int curpos = 0; 290c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen if (mPositionUs > 0) { 291c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen curpos = (mPositionUs + 500ll) / 1000; 292c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen } 293c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen if (curpos == msec) { 294c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen // nothing to do, and doing something anyway could result in deadlock (b/15323063) 295c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen break; 296c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen } 29743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 298dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // pretend that the seek completed. It will actually happen when starting playback. 299dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // TODO: actually perform the seek here, so the player is ready to go at the new 300dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // location 301dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen notifySeekComplete(); 30243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 30343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 30743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 308a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 309cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 310cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_PAUSED); 31143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->seekToAsync(seekTimeUs); 31243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 31343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 31443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 31543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 31743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 31843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 31943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 32343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 32443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 32543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPositionUs < 0) { 32643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 32743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 32843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = (mPositionUs + 500ll) / 1000; 32943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3305bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 3315bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 33543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 33643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 33743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 338d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 33943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3405bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 341d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 342d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 3435bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 3471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 3481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 3509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 3519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 3529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 3549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 3559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 3569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 357b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 358b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 359b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 360b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 361b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber notifyListener(MEDIA_PREPARED); 362b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 363b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 364b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 3659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 3669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 3679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 3689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 369cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_STOPPED); 370cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 3719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 3721aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 3731aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 3751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 3761aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 3771aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 37843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 37943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 38043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 38143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 38584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setLooping(int /* loop */) { 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INVALID_OPERATION; 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 3940d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 3950d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 3960d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 3970d268a3cae145afb2720c88ae38fb81550be5584James Dong } 3980d268a3cae145afb2720c88ae38fb81550be5584James Dong 3990d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 4000d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 4010d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 4020d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 4030d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 4040d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4050d268a3cae145afb2720c88ae38fb81550be5584James Dong 4060d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 4070d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 4080d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4090d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 4100d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 4110d268a3cae145afb2720c88ae38fb81550be5584James Dong } 412d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 413dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_GET_TRACK_INFO: 414dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 415dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->getTrackInfo(reply); 416dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 417dcb89b3b505522efde173c105a851c412f947178Chong Zhang 418dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_SELECT_TRACK: 419dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 420dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 421dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, true /* select */); 422dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 423dcb89b3b505522efde173c105a851c412f947178Chong Zhang 424dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_UNSELECT_TRACK: 425dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 426dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 427dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, false /* select */); 428dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 429dcb89b3b505522efde173c105a851c412f947178Chong Zhang 4300d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 4310d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4320d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 4330d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4340d268a3cae145afb2720c88ae38fb81550be5584James Dong } 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 437f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter( 44284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int /* key */, const Parcel & /* request */) { 4434f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 4444f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 4454f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 44684333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 4474f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 4484f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 4494f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 45184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 4529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 4539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 4559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 4579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 4609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 4619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 4649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 4659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 4689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 4699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 4729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 4739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 4781aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 4799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 4819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 4821aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 4831aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 4841aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 48557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayerDriver::notifySetSurfaceComplete() { 48657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 4879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 48857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber CHECK(mSetSurfaceInProgress); 48957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress = false; 4909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 49157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mCondition.broadcast(); 49257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber} 49357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 49443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 49543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 49643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 49743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 49843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 49943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 50043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 50143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = positionUs; 50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 50343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 50443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 505a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber notifyListener(MEDIA_SEEK_COMPLETE); 50643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 50743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5083fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats( 5093fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t numFramesTotal, int64_t numFramesDropped) { 5103fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 5113fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = numFramesTotal; 5123fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = numFramesDropped; 5133fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 5143fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 51584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump( 51684333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int fd, const Vector<String16> & /* args */) const { 5173fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 5183fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5193fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber FILE *out = fdopen(dup(fd), "w"); 5203fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5213fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " NuPlayer\n"); 522377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT fprintf(out, " numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), " 5233fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "percentageDropped(%.2f)\n", 5243fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, 5253fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped, 5263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal == 0 5273fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 5283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fclose(out); 5303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber out = NULL; 5313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 5333fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 5343fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 535dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayerDriver::notifyListener( 536dcb89b3b505522efde173c105a851c412f947178Chong Zhang int msg, int ext1, int ext2, const Parcel *in) { 537a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber if (msg == MEDIA_PLAYBACK_COMPLETE || msg == MEDIA_ERROR) { 538a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = true; 539c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen if (msg == MEDIA_PLAYBACK_COMPLETE) { 540c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen mState = STATE_PAUSED; 541c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen } 542a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 543a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 544dcb89b3b505522efde173c105a851c412f947178Chong Zhang sendEvent(msg, ext1, ext2, in); 545a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 546a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 5479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 5489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 5519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 5539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 5549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 5559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 5569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 5589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 560b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 561b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 562b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 563b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 564b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 565b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 566b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 567b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 5689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 5699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 5719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 573ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 574ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notifyListener(MEDIA_PREPARED); 575ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 5769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARED; 5779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 578ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 579ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 580ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 5819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_UNPREPARED; 5829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 5839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 5859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 5869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 5889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 5919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 5929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 593f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 594