NuPlayerDriver.cpp revision 4b75b86785d674b98dade17cd197b912d87cd279
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), 45a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping(false), 4643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->setName("NuPlayerDriver Looper"); 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->start( 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber false, /* runOnCallingThread */ 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber true, /* canCallJava */ 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PRIORITY_AUDIO); 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer = new NuPlayer; 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->registerHandler(mPlayer); 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->setDriver(this); 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 60f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() { 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 689b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 699b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 74f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 751b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 761b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 771b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 80a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: url=%s", url); 819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 845bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 8643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 871b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mPlayer->setDataSourceAsync(httpService, url, headers); 889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 98afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 99a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: fd=%d", fd); 1009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 103afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 105afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 11743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 118a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: stream source"); 1199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 12443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1341173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1358ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 13657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 13757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mSetSurfaceInProgress) { 13957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber return INVALID_OPERATION; 14057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 14157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 15157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress = true; 15257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1538ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 15457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 15557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber while (mSetSurfaceInProgress) { 15657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mCondition.wait(mLock); 15757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 1581173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1591173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1601173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1611173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 171ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 172ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 173ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 174ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 175ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 1769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 1789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1814b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 1824b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 1834b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 1844b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 1854b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = false; 1864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 1874b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar while (mState == STATE_STOPPED_AND_PREPARING) { 1884b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mCondition.wait(mLock); 1894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 1904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; 1919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 1949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 195afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 1979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1985bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 2009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 202ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 2039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 2049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 2054b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2064b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 2074b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 2084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 2094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = true; 2104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 2114b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 2129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 217f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 2189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 22043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 23543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 236a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 23743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 23843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 23943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 2402048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber if (mStartupSeekTimeUs == 0) { 2412048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber notifySeekComplete(); 2422048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } else { 2432048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mPlayer->seekToAsync(mStartupSeekTimeUs); 2442048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 2452048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 24643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 24743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 24843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 24943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 25043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2554b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 2569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 25743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->resume(); 25843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 25943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 26343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 26443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 2714b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar Mutex::Autolock autoLock(mLock); 2724b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2734b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar switch (mState) { 2744b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_RUNNING: 2754b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->pause(); 2764b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 2774b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2784b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PAUSED: 2794b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar notifyListener(MEDIA_STOPPED); 2804b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 2814b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2824b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PREPARED: 2834b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2844b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARING: 2854b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 2864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED; 2874b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar break; 2884b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar default: 2904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return INVALID_OPERATION; 2914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 2924b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2934b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 2979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 29943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 3019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 30243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 3039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 305cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_PAUSED); 30643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 30743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 3089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 30943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 31143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 31243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 3139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PAUSED; 31443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 3199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 322f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 3239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 32543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 32643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 32743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 32943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 33043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 331dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // pretend that the seek completed. It will actually happen when starting playback. 332dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // TODO: actually perform the seek here, so the player is ready to go at the new 333dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // location 334dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen notifySeekComplete(); 33543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 33643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 34043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 341a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 342cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 343cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_PAUSED); 34443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->seekToAsync(seekTimeUs); 34543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 34643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 34743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 34843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 35043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 35143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 35243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 35643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 35743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 35843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPositionUs < 0) { 35943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 36043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = (mPositionUs + 500ll) / 1000; 36243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3635bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 3645bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 36843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 36943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 37043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 371d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 37243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 374d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 375d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 3765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 3801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 3811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 3839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 3849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 3859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 3879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 3889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 3899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 390b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 391b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 392b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 393b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 394b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber notifyListener(MEDIA_PREPARED); 395b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 396b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 397b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 3989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 3999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 4009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 4019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4024b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (mState != STATE_STOPPED) { 4034b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar notifyListener(MEDIA_STOPPED); 4044b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 405cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 4069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 4071aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 4081aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 4101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 4111aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4121aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 41343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 41443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 41543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 416a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = false; 41743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 421a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnarstatus_t NuPlayerDriver::setLooping(int loop) { 422a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = loop != 0; 423a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar return OK; 424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 425f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 426f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 428f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 4310d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 4320d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 4330d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 4340d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4350d268a3cae145afb2720c88ae38fb81550be5584James Dong 4360d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 4370d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 4380d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 4390d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 4400d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 4410d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4420d268a3cae145afb2720c88ae38fb81550be5584James Dong 4430d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 4440d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 4450d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4460d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 4470d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 4480d268a3cae145afb2720c88ae38fb81550be5584James Dong } 449d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 450dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_GET_TRACK_INFO: 451dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 452dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->getTrackInfo(reply); 453dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 454dcb89b3b505522efde173c105a851c412f947178Chong Zhang 455dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_SELECT_TRACK: 456dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 457dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 458dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, true /* select */); 459dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 460dcb89b3b505522efde173c105a851c412f947178Chong Zhang 461dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_UNSELECT_TRACK: 462dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 463dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 464dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, false /* select */); 465dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 466dcb89b3b505522efde173c105a851c412f947178Chong Zhang 4677c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih case INVOKE_ID_GET_SELECTED_TRACK: 4687c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih { 4697c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih int32_t type = request.readInt32(); 4707c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih return mPlayer->getSelectedTrack(type, reply); 4717c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih } 4727c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih 4730d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 4740d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4750d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 4760d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4770d268a3cae145afb2720c88ae38fb81550be5584James Dong } 478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 480f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter( 48584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int /* key */, const Parcel & /* request */) { 4864f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 4874f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 4884f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 48984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 4904f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 4914f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 4924f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 49484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 4959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 4969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 4989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 5009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 5039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 5049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 5079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 5089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 5119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 5129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 5159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 5169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 52043c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 5211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 5229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 5249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 5251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 5261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 52857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayerDriver::notifySetSurfaceComplete() { 52957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 5309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 53157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber CHECK(mSetSurfaceInProgress); 53257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress = false; 5339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 53457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mCondition.broadcast(); 53557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber} 53657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 53743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 53843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 53943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 54043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 54143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 54243c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 54343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 54443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = positionUs; 54543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 54643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 54743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 5484b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar bool wasSeeking = true; 5494b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar { 5504b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar Mutex::Autolock autoLock(mLock); 5514b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (mState == STATE_STOPPED_AND_PREPARING) { 5524b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar wasSeeking = false; 5534b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARED; 5544b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mCondition.broadcast(); 5554b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (!mIsAsyncPrepare) { 5564b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // if we are preparing synchronously, no need to notify listener 5574b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return; 5584b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 5594b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } else if (mState == STATE_STOPPED) { 5604b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // no need to notify listener 5614b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return; 5624b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 5634b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 5644b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar notifyListener(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); 56543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 56643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats( 5683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t numFramesTotal, int64_t numFramesDropped) { 5693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 5703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = numFramesTotal; 5713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = numFramesDropped; 5723fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 5733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 57484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump( 57584333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int fd, const Vector<String16> & /* args */) const { 5763fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 5773fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber FILE *out = fdopen(dup(fd), "w"); 5793fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " NuPlayer\n"); 581377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT fprintf(out, " numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), " 5823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "percentageDropped(%.2f)\n", 5833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, 5843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped, 5853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal == 0 5863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 5873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fclose(out); 5893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber out = NULL; 5903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 5923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 5933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 594dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayerDriver::notifyListener( 595dcb89b3b505522efde173c105a851c412f947178Chong Zhang int msg, int ext1, int ext2, const Parcel *in) { 596a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar switch (msg) { 597a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_PLAYBACK_COMPLETE: 598a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 599a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar if (mLooping) { 600a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mPlayer->seekToAsync(0); 601a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 602a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 603a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar // fall through 604a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 605a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 606a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_ERROR: 607a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 608a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mAtEOS = true; 609a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 610a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 611a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 612a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar default: 613a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 614a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 615a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 616dcb89b3b505522efde173c105a851c412f947178Chong Zhang sendEvent(msg, ext1, ext2, in); 617a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 618a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 6199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 6209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 6239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 6269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 6279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 6309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 632b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 633b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 634b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 635b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 636b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 637b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 638b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 639b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 6409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 6419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 645ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 646ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notifyListener(MEDIA_PREPARED); 647ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 6489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARED; 6499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 650ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 651ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 652ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 6539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_UNPREPARED; 6549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 6559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 6579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 6609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 6639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 666