NuPlayerDriver.cpp revision eb645a0d1820b227af287a5309f017afadbab4e3
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), 3743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs(-1), 3843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs(-1), 393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0), 403fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped(0), 411aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mLooper(new ALooper), 429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags(0), 43a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS(false), 44a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping(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 79a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: url=%s", url); 809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 835bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 8543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 861b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mPlayer->setDataSourceAsync(httpService, url, headers); 879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 94f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 95f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 98a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: fd=%d", fd); 999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 102afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 11643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 117a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar ALOGV("setDataSource: stream source"); 1189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1331173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1348ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 13557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 13657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1468ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 14757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1481173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1491173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1501173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 160ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 161ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 162ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 163ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 164ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 1659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 1679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1704b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 1714b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 1724b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 1734b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 1744b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = false; 1754b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 1764b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar while (mState == STATE_STOPPED_AND_PREPARING) { 1774b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mCondition.wait(mLock); 1784b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 1794b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; 1809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 1839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 184afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 1869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 191ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 1929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 1944b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 1954b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 1964b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 1974b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 1984b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = true; 1994b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->seekToAsync(0); 2004b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 2019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 2079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 20943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 22443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 225a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 22643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 22743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 22843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 2292048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber if (mStartupSeekTimeUs == 0) { 230eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 2312048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } else { 2322048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mPlayer->seekToAsync(mStartupSeekTimeUs); 2332048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 2342048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 23543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 23643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 23743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 23843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 23943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2444b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 2459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 24643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->resume(); 24743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 24843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 25243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 25343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 259f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 2604b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar Mutex::Autolock autoLock(mLock); 2614b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2624b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar switch (mState) { 2634b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_RUNNING: 2644b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->pause(); 2654b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 2664b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2674b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PAUSED: 2684b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar notifyListener(MEDIA_STOPPED); 2694b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 2704b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2714b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PREPARED: 2724b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2734b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARING: 2744b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 2754b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED; 2764b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar break; 2774b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2784b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar default: 2794b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return INVALID_OPERATION; 2804b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 2814b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 2824b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 2869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 28843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 29143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 2929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 294cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_PAUSED); 29543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 29643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 2979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 29843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 2999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 30043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 30143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 3029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PAUSED; 30343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 3089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 311f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 3129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 31443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 31543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 31643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 31843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 31943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 320dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // pretend that the seek completed. It will actually happen when starting playback. 321dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // TODO: actually perform the seek here, so the player is ready to go at the new 322dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen // location 323eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 32443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 32543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 32943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 330a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 331cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 332cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_PAUSED); 33343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->seekToAsync(seekTimeUs); 33443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 33543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 33643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 33743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 33943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 34043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 34143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 34543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 34643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 34743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPositionUs < 0) { 34843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 34943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 35043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = (mPositionUs + 500ll) / 1000; 35143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3525bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 3535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 35743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 35843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 35943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 360d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3625bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 363d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 364d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 3655bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 3691aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 3701aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 3729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 3739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 3749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 3769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 3779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 3789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 379b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 380b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 381b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 382b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 383b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber notifyListener(MEDIA_PREPARED); 384b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 385b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 386b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 3879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 3889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 3899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 3909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (mState != STATE_STOPPED) { 3924b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar notifyListener(MEDIA_STOPPED); 3934b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 394cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 3959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 3961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 3971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 3991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 4001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 4011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 40243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 40343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 40443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 405a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = false; 40643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 410a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnarstatus_t NuPlayerDriver::setLooping(int loop) { 411a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = loop != 0; 412a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar return OK; 413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 419f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 4200d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 4210d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 4220d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 4230d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4240d268a3cae145afb2720c88ae38fb81550be5584James Dong 4250d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 4260d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 4270d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 4280d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 4290d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 4300d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4310d268a3cae145afb2720c88ae38fb81550be5584James Dong 4320d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 4330d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 4340d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4350d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 4360d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 4370d268a3cae145afb2720c88ae38fb81550be5584James Dong } 438d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 439dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_GET_TRACK_INFO: 440dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 441dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->getTrackInfo(reply); 442dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 443dcb89b3b505522efde173c105a851c412f947178Chong Zhang 444dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_SELECT_TRACK: 445dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 446dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 447dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, true /* select */); 448dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 449dcb89b3b505522efde173c105a851c412f947178Chong Zhang 450dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_UNSELECT_TRACK: 451dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 452dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 453dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->selectTrack(trackIndex, false /* select */); 454dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 455dcb89b3b505522efde173c105a851c412f947178Chong Zhang 4567c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih case INVOKE_ID_GET_SELECTED_TRACK: 4577c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih { 4587c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih int32_t type = request.readInt32(); 4597c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih return mPlayer->getSelectedTrack(type, reply); 4607c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih } 4617c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih 4620d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 4630d268a3cae145afb2720c88ae38fb81550be5584James Dong { 4640d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 4650d268a3cae145afb2720c88ae38fb81550be5584James Dong } 4660d268a3cae145afb2720c88ae38fb81550be5584James Dong } 467f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 468f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 469f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 470f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter( 47484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int /* key */, const Parcel & /* request */) { 4754f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 4764f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 4774f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 47884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 4794f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 4804f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 4814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 482f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 48384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 4849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 4859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 4879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 4899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 4929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 4939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 4969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 4979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 5009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 5019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 5049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 5059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50943c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 5101aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 5119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 5139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 5141aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 5151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 5161aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 51743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 51843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 51943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 52043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 52143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 52243c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 52343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 52443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = positionUs; 52543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 52643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 52743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 528eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen Mutex::Autolock autoLock(mLock); 529eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 530eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen} 531eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen 532eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissenvoid NuPlayerDriver::notifySeekComplete_l() { 5334b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar bool wasSeeking = true; 534eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (mState == STATE_STOPPED_AND_PREPARING) { 535eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen wasSeeking = false; 536eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mState = STATE_STOPPED_AND_PREPARED; 537eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mCondition.broadcast(); 538eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (!mIsAsyncPrepare) { 539eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // if we are preparing synchronously, no need to notify listener 5404b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return; 5414b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 542eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen } else if (mState == STATE_STOPPED) { 543eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // no need to notify listener 544eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen return; 5454b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 546eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // note: notifyListener called with lock held 547eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mLock.unlock(); 5484b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar notifyListener(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); 549eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mLock.lock(); 55043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 55143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 5523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats( 5533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t numFramesTotal, int64_t numFramesDropped) { 5543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 5553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = numFramesTotal; 5563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = numFramesDropped; 5573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 5583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 55984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump( 56084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int fd, const Vector<String16> & /* args */) const { 5613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 5623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber FILE *out = fdopen(dup(fd), "w"); 5643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " NuPlayer\n"); 566377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT fprintf(out, " numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), " 5673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "percentageDropped(%.2f)\n", 5683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, 5693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped, 5703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal == 0 5713fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 5723fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fclose(out); 5743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber out = NULL; 5753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 5763fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 5773fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 5783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 579dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayerDriver::notifyListener( 580dcb89b3b505522efde173c105a851c412f947178Chong Zhang int msg, int ext1, int ext2, const Parcel *in) { 581a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar switch (msg) { 582a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_PLAYBACK_COMPLETE: 583a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 584a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar if (mLooping) { 585a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mPlayer->seekToAsync(0); 586a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 587a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 588a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar // fall through 589a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 590a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 591a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_ERROR: 592a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 593a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mAtEOS = true; 594a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 595a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 596a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 597a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar default: 598a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 599a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 600a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 601dcb89b3b505522efde173c105a851c412f947178Chong Zhang sendEvent(msg, ext1, ext2, in); 602a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 603a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 6049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 6059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 6089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 6119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 6129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 6159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 617b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 618b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 619b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 620b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 621b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 622b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 623b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 624b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 6259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 6269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 6289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 630ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 631ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notifyListener(MEDIA_PREPARED); 632ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 6339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARED; 6349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 635ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 636ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 637ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 6389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_UNPREPARED; 6399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 6409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 6429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 6459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 6469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 6489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 6499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 651