NuPlayerDriver.cpp revision cbaffcffee6418d678806e63097c19fe26d48fe0
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" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h> 20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDriver.h" 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include "NuPlayerSource.h" 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 261aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber#include <media/stagefright/foundation/ADebug.h> 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ALooper.h> 289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include <media/stagefright/MetaData.h> 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 30f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 32f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::NuPlayerDriver() 339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber : mState(STATE_IDLE), 34ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare(false), 359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult(UNKNOWN_ERROR), 3657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress(false), 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), 4443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->setName("NuPlayerDriver Looper"); 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->start( 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber false, /* runOnCallingThread */ 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber true, /* canCallJava */ 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PRIORITY_AUDIO); 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer = new NuPlayer; 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->registerHandler(mPlayer); 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->setDriver(this); 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() { 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 669b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 679b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 689b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 699b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 709b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 73f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 795bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 8143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(url, headers); 839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 91f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 93afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 97afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 99afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 11143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 11743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 1199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1271173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1288ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 12957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 13057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mSetSurfaceInProgress) { 13257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber return INVALID_OPERATION; 13357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 13457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 14457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress = true; 14557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 1468ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 14757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 14857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber while (mSetSurfaceInProgress) { 14957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mCondition.wait(mLock); 15057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 1511173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1521173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1531173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1541173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 164ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 165ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 166ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 167ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 168ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 1699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 1719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 1749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 1779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 178afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 1809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1815bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 1829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 185ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 1869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 1879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 1889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 1949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 19643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 1979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 1999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 21143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 212a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 21343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 21443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 21543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 2162048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber if (mStartupSeekTimeUs == 0) { 2172048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber notifySeekComplete(); 2182048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } else { 2192048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mPlayer->seekToAsync(mStartupSeekTimeUs); 2202048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 2212048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 22243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 22343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 22443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 22543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 22643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 23243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->resume(); 23343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 23443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 23843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 23943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 24643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return pause(); 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 2509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 25243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 2549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 25543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 2569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 258cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_PAUSED); 25943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 26043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 2619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 26243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 2639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 26443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 26543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PAUSED; 26743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 2729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 2769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 27843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 27943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 28043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 28243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 28343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 28443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 28543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 28943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 290a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 291cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 292cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_PAUSED); 29343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->seekToAsync(seekTimeUs); 29443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 29543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 29643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 29743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 2989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 29943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 30043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 30143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 30543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 30643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 30743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPositionUs < 0) { 30843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 30943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 31043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = (mPositionUs + 500ll) / 1000; 31143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3125bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 3135bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 31743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 31843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 31943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 320d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 32143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 3225bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 323d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 324d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 3255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 3291aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 3301aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 3329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 3339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 3349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 3369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 3379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 3389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 339b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 340b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 341b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 342b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 343b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber notifyListener(MEDIA_PREPARED); 344b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 345b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 346b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 3479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 3489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 3499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 3509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 351cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar notifyListener(MEDIA_STOPPED); 352cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 3539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 3541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 3551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 3569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 3571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 3581aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 3591aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 36043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 36243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 36343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setLooping(int loop) { 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INVALID_OPERATION; 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 3760d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 3770d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 3780d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 3790d268a3cae145afb2720c88ae38fb81550be5584James Dong } 3800d268a3cae145afb2720c88ae38fb81550be5584James Dong 3810d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 3820d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 3830d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 3840d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 3850d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 3860d268a3cae145afb2720c88ae38fb81550be5584James Dong } 3870d268a3cae145afb2720c88ae38fb81550be5584James Dong 3880d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 3890d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 3900d268a3cae145afb2720c88ae38fb81550be5584James Dong { 3910d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 3920d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 3930d268a3cae145afb2720c88ae38fb81550be5584James Dong } 394d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 3950d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 3960d268a3cae145afb2720c88ae38fb81550be5584James Dong { 3970d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 3980d268a3cae145afb2720c88ae38fb81550be5584James Dong } 3990d268a3cae145afb2720c88ae38fb81550be5584James Dong } 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 402f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4064f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t NuPlayerDriver::setParameter(int key, const Parcel &request) { 4074f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 4084f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 4094f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 4104f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t NuPlayerDriver::getParameter(int key, Parcel *reply) { 4114f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 4124f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 4134f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 414f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const media::Metadata::Filter& ids, Parcel *records) { 4169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 4179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 4199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 4219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 4249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 4259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 4289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 4299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 4329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 4339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 4359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 4369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 4379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 4421aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 4439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 4459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 4461aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 4471aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 4481aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 44957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayerDriver::notifySetSurfaceComplete() { 45057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 4519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 45257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber CHECK(mSetSurfaceInProgress); 45357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress = false; 4549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 45557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mCondition.broadcast(); 45657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber} 45757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 45843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 45943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 46043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 46143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 46243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 46343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 46443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 46543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = positionUs; 46643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 46743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 46843c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 469a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber notifyListener(MEDIA_SEEK_COMPLETE); 47043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 47143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 4723fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats( 4733fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t numFramesTotal, int64_t numFramesDropped) { 4743fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 4753fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = numFramesTotal; 4763fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = numFramesDropped; 4773fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 4783fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4793fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huberstatus_t NuPlayerDriver::dump(int fd, const Vector<String16> &args) const { 4803fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 4813fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4823fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber FILE *out = fdopen(dup(fd), "w"); 4833fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " NuPlayer\n"); 4853fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " numFramesTotal(%lld), numFramesDropped(%lld), " 4863fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "percentageDropped(%.2f)\n", 4873fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, 4883fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped, 4893fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal == 0 4903fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 4913fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4923fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fclose(out); 4933fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber out = NULL; 4943fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 4953fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 4963fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 4973fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 498a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Hubervoid NuPlayerDriver::notifyListener(int msg, int ext1, int ext2) { 499a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber if (msg == MEDIA_PLAYBACK_COMPLETE || msg == MEDIA_ERROR) { 500a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = true; 501a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 502a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 503a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber sendEvent(msg, ext1, ext2); 504a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 505a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 5069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 5079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 5109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 5129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 5139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 5149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 5159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 5179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 519b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 520b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 521b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 522b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 523b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 524b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 525b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 526b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 5279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 5289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 5309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 532ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 533ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notifyListener(MEDIA_PREPARED); 534ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 5359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARED; 5369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 537ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 538ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 539ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 5409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_UNPREPARED; 5419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 5429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 5449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 5459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 5479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 5509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 5519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 552f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 553