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> 213a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan#include <cutils/properties.h> 22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDriver.h" 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 25f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h" 269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include "NuPlayerSource.h" 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 281aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber#include <media/stagefright/foundation/ADebug.h> 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ALooper.h> 30a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu#include <media/stagefright/foundation/AUtils.h> 319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include <media/stagefright/MetaData.h> 322abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung#include <media/stagefright/Utils.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 34f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 35f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3668845c14ebf2c7282800b1abffde38d8e9a57aabRonghua WuNuPlayerDriver::NuPlayerDriver(pid_t pid) 379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber : mState(STATE_IDLE), 38ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare(false), 399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult(UNKNOWN_ERROR), 4013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress(false), 4143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs(-1), 4243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs(-1), 43a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mSeekInProgress(false), 441aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mLooper(new ALooper), 459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags(0), 46a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS(false), 47a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping(false), 48f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAutoLoop(false), 4943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 502abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("NuPlayerDriver(%p)", this); 51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->setName("NuPlayerDriver Looper"); 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->start( 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber false, /* runOnCallingThread */ 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber true, /* canCallJava */ 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PRIORITY_AUDIO); 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5868845c14ebf2c7282800b1abffde38d8e9a57aabRonghua Wu mPlayer = new NuPlayer(pid); 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->registerHandler(mPlayer); 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->setDriver(this); 62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 63f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 64f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() { 652abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("~NuPlayerDriver(%p)", this); 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 779b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 789b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 801b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 811b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 821b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 832abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) url(%s)", this, uriDebugString(url, false).c_str()); 849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 8543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 879575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 895bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 9143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 921b86fe063badb5f28c467ade39be0f4008688947Andreas Huber mPlayer->setDataSourceAsync(httpService, url, headers); 939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 1022abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) file(%d)", this, fd); 1039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 104afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 110afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 1119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(fd, offset, length); 1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 1212abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setDataSource(%p) stream source", this); 1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 12343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (mState != STATE_IDLE) { 1259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_SET_DATASOURCE_PENDING; 12943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 1309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->setDataSourceAsync(source); 13199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins 13299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins while (mState == STATE_SET_DATASOURCE_PENDING) { 13399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins mCondition.wait(mLock); 13499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins } 13599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins 13699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins return mAsyncResult; 13799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins} 13899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins 13999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkinsstatus_t NuPlayerDriver::setDataSource(const sp<DataSource> &source) { 14099f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins ALOGV("setDataSource(%p) callback source", this); 14199f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins Mutex::Autolock autoLock(mLock); 14299f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins 14399f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins if (mState != STATE_IDLE) { 14499f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins return INVALID_OPERATION; 14599f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins } 14699f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins 14799f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins mState = STATE_SET_DATASOURCE_PENDING; 14899f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins 14999f31604136d66ae10e20669fb6b5716f342bde0Chris Watkins mPlayer->setDataSourceAsync(source); 1509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_SET_DATASOURCE_PENDING) { 1529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 1539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mAsyncResult; 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1581173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1598ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 1602abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("setVideoSurfaceTexture(%p)", this); 16157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 16257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 16313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang if (mSetSurfaceInProgress) { 16413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang return INVALID_OPERATION; 16513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 16613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 1699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 1709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 1719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 1729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 1739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 1749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 1759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 17613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = true; 17713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1788ba01021b573889802e67e029225a96f0dfa471aAndy McFadden mPlayer->setVideoSurfaceTextureAsync(bufferProducer); 17957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 18013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang while (mSetSurfaceInProgress) { 18113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.wait(mLock); 18213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang } 18313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 1841173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1851173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1861173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1882abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("prepare(%p)", this); 1899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 1909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return prepare_l(); 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() { 1949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 1959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 1969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 197ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber 198ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // Make sure we're not posting any notifications, success or 199ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // failure information is only communicated through our result 200ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber // code. 201ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = false; 2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 2039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_PREPARING) { 2049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.wait(mLock); 2059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR; 2074b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 2094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 2104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 2114b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = false; 212dab70a065a8e972d272ed948e77cf2cd0f1525e1Wei Jia mPlayer->seekToAsync(0, true /* needNotify */); 2134b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar while (mState == STATE_STOPPED_AND_PREPARING) { 2144b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mCondition.wait(mLock); 2154b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 2164b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR; 2179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 2209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 221afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 2229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() { 2232abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("prepareAsync(%p)", this); 2249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2255bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 2279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_PREPARING; 229ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber mIsAsyncPrepare = true; 2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayer->prepareAsync(); 2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 2324b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 2334b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // this is really just paused. handle as seek to start 2344b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mAtEOS = false; 2354b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED_AND_PREPARING; 2364b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mIsAsyncPrepare = true; 237dab70a065a8e972d272ed948e77cf2cd0f1525e1Wei Jia mPlayer->seekToAsync(0, true /* needNotify */); 2384b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 2399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 2419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber }; 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 244f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 24567c2c94aa9d387bb7dc47514d62deeb66d486210Wei Jia ALOGD("start(%p), state is %d, eos is %d", this, mState, mAtEOS); 2469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 2479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 24843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 2499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_UNPREPARED: 2509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber { 2519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber status_t err = prepare_l(); 2529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err != OK) { 2549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return err; 2559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARED); 2589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber // fall through 2609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 2619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2629421174a2f002fef31b330fb04e00105a905dca4Wei Jia case STATE_PAUSED: 2639421174a2f002fef31b330fb04e00105a905dca4Wei Jia case STATE_STOPPED_AND_PREPARED: 2649421174a2f002fef31b330fb04e00105a905dca4Wei Jia { 2659421174a2f002fef31b330fb04e00105a905dca4Wei Jia if (mAtEOS && mStartupSeekTimeUs < 0) { 2669421174a2f002fef31b330fb04e00105a905dca4Wei Jia mStartupSeekTimeUs = 0; 2679421174a2f002fef31b330fb04e00105a905dca4Wei Jia mPositionUs = -1; 2689421174a2f002fef31b330fb04e00105a905dca4Wei Jia } 2699421174a2f002fef31b330fb04e00105a905dca4Wei Jia 2709421174a2f002fef31b330fb04e00105a905dca4Wei Jia // fall through 2719421174a2f002fef31b330fb04e00105a905dca4Wei Jia } 2729421174a2f002fef31b330fb04e00105a905dca4Wei Jia 2739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 27443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 275a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 27643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 27743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 27843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 2799421174a2f002fef31b330fb04e00105a905dca4Wei Jia mPlayer->seekToAsync(mStartupSeekTimeUs); 28043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 28143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 28243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 28343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 28443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 2860560195a71ee26e8546075e56c49ff535fcf1767Wei Jia { 2870560195a71ee26e8546075e56c49ff535fcf1767Wei Jia if (mAtEOS) { 2880560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPlayer->seekToAsync(0); 2890560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mAtEOS = false; 2900560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = -1; 2910560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 2930560195a71ee26e8546075e56c49ff535fcf1767Wei Jia } 2949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 2959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 2969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 29743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 29843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 2999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RUNNING; 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 304f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 3052abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("stop(%p)", this); 3064b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar Mutex::Autolock autoLock(mLock); 3074b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar switch (mState) { 3094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_RUNNING: 3104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mPlayer->pause(); 3114b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar // fall through 3124b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3134b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PAUSED: 3142a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_STOPPED; 3150560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 3162a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen break; 3174b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3184b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_PREPARED: 3194b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED: 3204b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARING: 3214b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar case STATE_STOPPED_AND_PREPARED: 3224b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar mState = STATE_STOPPED; 3234b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar break; 3244b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3254b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar default: 3264b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return INVALID_OPERATION; 3274b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 3284b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar 3294b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return OK; 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 333f83408b41bbd796b7923d719e7e3799ddc7acaffRonghua Wu // The NuPlayerRenderer may get flushed if pause for long enough, e.g. the pause timeout tear 334f83408b41bbd796b7923d719e7e3799ddc7acaffRonghua Wu // down for audio offload mode. If that happens, the NuPlayerRenderer will no longer know the 335f83408b41bbd796b7923d719e7e3799ddc7acaffRonghua Wu // current position. So similar to seekTo, update |mPositionUs| to the pause position by calling 336f83408b41bbd796b7923d719e7e3799ddc7acaffRonghua Wu // getCurrentPosition here. 337f83408b41bbd796b7923d719e7e3799ddc7acaffRonghua Wu int msec; 338f83408b41bbd796b7923d719e7e3799ddc7acaffRonghua Wu getCurrentPosition(&msec); 339f83408b41bbd796b7923d719e7e3799ddc7acaffRonghua Wu 3409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 34243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PAUSED: 3449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 34543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 3469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 3479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 3482a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_PAUSED; 3490560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 35043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 35143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 3529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 35343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 3549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 35543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 35643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 360f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 3619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return mState == STATE_RUNNING && !mAtEOS; 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3643a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t NuPlayerDriver::setPlaybackSettings(const AudioPlaybackRate &rate) { 3653a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar Mutex::Autolock autoLock(mLock); 3663a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar status_t err = mPlayer->setPlaybackSettings(rate); 3673a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar if (err == OK) { 3683a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar if (rate.mSpeed == 0.f && mState == STATE_RUNNING) { 3693a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar mState = STATE_PAUSED; 3703a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar // try to update position 3713a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar (void)mPlayer->getCurrentPosition(&mPositionUs); 3723a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar notifyListener_l(MEDIA_PAUSED); 3733a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar } else if (rate.mSpeed != 0.f && mState == STATE_PAUSED) { 3743a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar mState = STATE_RUNNING; 3753a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar } 3763a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar } 3773a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar return err; 3783a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar} 3793a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 3803a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t NuPlayerDriver::getPlaybackSettings(AudioPlaybackRate *rate) { 3813a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar return mPlayer->getPlaybackSettings(rate); 3823a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar} 3833a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 3843a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t NuPlayerDriver::setSyncSettings(const AVSyncSettings &sync, float videoFpsHint) { 3853a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar return mPlayer->setSyncSettings(sync, videoFpsHint); 3863a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar} 3873a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar 3883a474aa67fc31505740526dd249d96204c08bf79Lajos Molnarstatus_t NuPlayerDriver::getSyncSettings(AVSyncSettings *sync, float *videoFps) { 3893a474aa67fc31505740526dd249d96204c08bf79Lajos Molnar return mPlayer->getSyncSettings(sync, videoFps); 3909816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia} 3919816016afb2a13c6a866cd047d57020566a8b9a9Wei Jia 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 3932abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("seekTo(%p) %d ms", this, msec); 3949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 3959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 39643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 39743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 39843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 3999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_PREPARED: 4009421174a2f002fef31b330fb04e00105a905dca4Wei Jia case STATE_STOPPED_AND_PREPARED: 4011061c9c29cfdeb3b2a307a4ee4cda2cd197b48e6Wei Jia case STATE_PAUSED: 40243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 4031061c9c29cfdeb3b2a307a4ee4cda2cd197b48e6Wei Jia // fall through. 4049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RUNNING: 40543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 406a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 407a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mSeekInProgress = true; 408cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar // seeks can take a while, so we essentially paused 4090560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PAUSED); 410e427abf1ea252ff305fc33aacdd2e83cf34891b5Wei Jia mPlayer->seekToAsync(seekTimeUs, true /* needNotify */); 41143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 41243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 41343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 41443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 4159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 41643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 41743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 4180560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mPositionUs = seekTimeUs; 41943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 422f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 423a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu int64_t tempUs = 0; 424d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia { 425d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia Mutex::Autolock autoLock(mLock); 426d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia if (mSeekInProgress || mState == STATE_PAUSED) { 427d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia tempUs = (mPositionUs <= 0) ? 0 : mPositionUs; 428d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia *msec = (int)divRound(tempUs, (int64_t)(1000)); 429d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia return OK; 430d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia } 431d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia } 432d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia 433a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu status_t ret = mPlayer->getCurrentPosition(&tempUs); 43443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 435a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu Mutex::Autolock autoLock(mLock); 436a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu // We need to check mSeekInProgress here because mPlayer->seekToAsync is an async call, which 437a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu // means getCurrentPosition can be called before seek is completed. Iow, renderer may return a 438a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu // position value that's different the seek to position. 439d4cdba18ba7d0057ae54ec7efa5871b1a9d8becaWei Jia if (ret != OK) { 440a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu tempUs = (mPositionUs <= 0) ? 0 : mPositionUs; 44143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 442a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mPositionUs = tempUs; 44343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 444a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu *msec = (int)divRound(tempUs, (int64_t)(1000)); 4455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 44943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 45043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 45143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 452d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber return UNKNOWN_ERROR; 45343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 4545bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 455d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 456d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber 4575bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 459f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 460f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 4612abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGD("reset(%p)", this); 4621aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber switch (mState) { 4659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_IDLE: 4669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 4679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_SET_DATASOURCE_PENDING: 4699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber case STATE_RESET_IN_PROGRESS: 4709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return INVALID_OPERATION; 4719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 472b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber case STATE_PREPARING: 473b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber { 474b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mIsAsyncPrepare); 475b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4760560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 477b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber break; 478b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 479b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 4809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber default: 4819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber break; 4829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 4839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 4844b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar if (mState != STATE_STOPPED) { 4850560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_STOPPED); 4864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 487cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar 4883a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan char value[PROPERTY_VALUE_MAX]; 4893a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan if (property_get("persist.debug.sf.stats", value, NULL) && 4903a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan (!strcmp("1", value) || !strcasecmp("true", value))) { 4913a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan Vector<String16> args; 4923a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan dump(-1, args); 4933a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan } 4943a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan 4959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_RESET_IN_PROGRESS; 4961aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 4971aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 4989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber while (mState == STATE_RESET_IN_PROGRESS) { 4991aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 5001aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 5011aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 50243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 50343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 50443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 505a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = false; 50643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 510a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnarstatus_t NuPlayerDriver::setLooping(int loop) { 511a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mLooping = loop != 0; 512a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar return OK; 513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 515f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 519f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 5200d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 5210d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 5220d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 5230d268a3cae145afb2720c88ae38fb81550be5584James Dong } 5240d268a3cae145afb2720c88ae38fb81550be5584James Dong 5250d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 5260d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 5270d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 5280d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 5290d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 5300d268a3cae145afb2720c88ae38fb81550be5584James Dong } 5310d268a3cae145afb2720c88ae38fb81550be5584James Dong 5320d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 5330d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 5340d268a3cae145afb2720c88ae38fb81550be5584James Dong { 5350d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 5360d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 5370d268a3cae145afb2720c88ae38fb81550be5584James Dong } 538d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber 539dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_GET_TRACK_INFO: 540dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 541dcb89b3b505522efde173c105a851c412f947178Chong Zhang return mPlayer->getTrackInfo(reply); 542dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 543dcb89b3b505522efde173c105a851c412f947178Chong Zhang 544dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_SELECT_TRACK: 545dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 546dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 5476ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih int msec = 0; 5486ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih // getCurrentPosition should always return OK 5496ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih getCurrentPosition(&msec); 5506ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih return mPlayer->selectTrack(trackIndex, true /* select */, msec * 1000ll); 551dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 552dcb89b3b505522efde173c105a851c412f947178Chong Zhang 553dcb89b3b505522efde173c105a851c412f947178Chong Zhang case INVOKE_ID_UNSELECT_TRACK: 554dcb89b3b505522efde173c105a851c412f947178Chong Zhang { 555dcb89b3b505522efde173c105a851c412f947178Chong Zhang int trackIndex = request.readInt32(); 5566ffb1fd67eb8f00f130a6db914ba42a8432aec70Robert Shih return mPlayer->selectTrack(trackIndex, false /* select */, 0xdeadbeef /* not used */); 557dcb89b3b505522efde173c105a851c412f947178Chong Zhang } 558dcb89b3b505522efde173c105a851c412f947178Chong Zhang 5597c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih case INVOKE_ID_GET_SELECTED_TRACK: 5607c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih { 5617c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih int32_t type = request.readInt32(); 5627c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih return mPlayer->getSelectedTrack(type, reply); 5637c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih } 5647c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih 5650d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 5660d268a3cae145afb2720c88ae38fb81550be5584James Dong { 5670d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 5680d268a3cae145afb2720c88ae38fb81550be5584James Dong } 5690d268a3cae145afb2720c88ae38fb81550be5584James Dong } 570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 572f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 574f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAudioSink = audioSink; 575f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 576f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter( 57884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int /* key */, const Parcel & /* request */) { 5794f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5804f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 58284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) { 5834f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 5844f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 5854f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 586f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 58784333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 5889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 5899575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5909575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber using media::Metadata; 5919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata meta(records); 5939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kPauseAvailable, 5969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE); 5979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 5989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 5999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekBackwardAvailable, 6009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD); 6019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 6039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekForwardAvailable, 6049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD); 6059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber meta.appendBool( 6079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Metadata::kSeekAvailable, 6089575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK); 6099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber return OK; 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 612f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 61343c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 6148d121d41f5355b78b687f44e8d4aae4de2aa0359Andy Hung ALOGD("notifyResetComplete(%p)", this); 6151aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 6169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 6179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_RESET_IN_PROGRESS); 6189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = STATE_IDLE; 6191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 6201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 6211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 62213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhangvoid NuPlayerDriver::notifySetSurfaceComplete() { 6232abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("notifySetSurfaceComplete(%p)", this); 62413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang Mutex::Autolock autoLock(mLock); 62513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 62613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang CHECK(mSetSurfaceInProgress); 62713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mSetSurfaceInProgress = false; 62813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 62913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang mCondition.broadcast(); 63013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang} 63113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang 63243c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 63343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 63443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 63543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 63643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 63743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 6382abde2c118a94f843a7450818c925d3f0b673cd3Andy Hung ALOGV("notifySeekComplete(%p)", this); 639eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen Mutex::Autolock autoLock(mLock); 640a73d9e0b3d171d2bfcd9eb07df9d6d36ae74df57Ronghua Wu mSeekInProgress = false; 641eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen notifySeekComplete_l(); 642eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen} 643eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen 644eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissenvoid NuPlayerDriver::notifySeekComplete_l() { 6454b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar bool wasSeeking = true; 646eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (mState == STATE_STOPPED_AND_PREPARING) { 647eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen wasSeeking = false; 648eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mState = STATE_STOPPED_AND_PREPARED; 649eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen mCondition.broadcast(); 650eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen if (!mIsAsyncPrepare) { 651eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // if we are preparing synchronously, no need to notify listener 6524b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar return; 6534b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 654eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen } else if (mState == STATE_STOPPED) { 655eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen // no need to notify listener 656eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen return; 6574b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar } 6580560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED); 65943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 66043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 66184333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump( 66284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber int fd, const Vector<String16> & /* args */) const { 663e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan 664e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan Vector<sp<AMessage> > trackStats; 665e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan mPlayer->getStats(&trackStats); 6663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 6673a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan AString logString(" NuPlayer\n"); 6683a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan char buf[256] = {0}; 6693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 670e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan for (size_t i = 0; i < trackStats.size(); ++i) { 671e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan const sp<AMessage> &stats = trackStats.itemAt(i); 672e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan 673e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan AString mime; 674e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan if (stats->findString("mime", &mime)) { 6753a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan snprintf(buf, sizeof(buf), " mime(%s)\n", mime.c_str()); 6763a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan logString.append(buf); 677e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan } 678e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan 679e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan AString name; 680e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan if (stats->findString("component-name", &name)) { 6813a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan snprintf(buf, sizeof(buf), " decoder(%s)\n", name.c_str()); 6823a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan logString.append(buf); 683e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan } 6843fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 685e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan if (mime.startsWith("video/")) { 686e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan int32_t width, height; 687e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan if (stats->findInt32("width", &width) 688e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan && stats->findInt32("height", &height)) { 6893a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan snprintf(buf, sizeof(buf), " resolution(%d x %d)\n", width, height); 6903a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan logString.append(buf); 691e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan } 692e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan 693e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan int64_t numFramesTotal = 0; 694e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan int64_t numFramesDropped = 0; 695e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan 696e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan stats->findInt64("frames-total", &numFramesTotal); 697e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan stats->findInt64("frames-dropped-output", &numFramesDropped); 6983a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan snprintf(buf, sizeof(buf), " numFramesTotal(%lld), numFramesDropped(%lld), " 699e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan "percentageDropped(%.2f%%)\n", 700e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan (long long)numFramesTotal, 701e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan (long long)numFramesDropped, 702e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan numFramesTotal == 0 703e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan ? 0.0 : (double)(numFramesDropped * 100) / numFramesTotal); 7043a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan logString.append(buf); 705e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan } 706e1e5d7a3d3d4d6d644e6c731f977422e004140d5Praveen Chavan } 7073a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan 7083a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan ALOGI("%s", logString.c_str()); 7093a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan 7103a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan if (fd >= 0) { 7113a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan FILE *out = fdopen(dup(fd), "w"); 7123a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan fprintf(out, "%s", logString.c_str()); 7133a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan fclose(out); 7143a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan out = NULL; 7153a20d29ff09ca2568cb904415625cc44db37edb0Praveen Chavan } 7163fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 7173fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 7183fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 7193fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 720dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayerDriver::notifyListener( 721dcb89b3b505522efde173c105a851c412f947178Chong Zhang int msg, int ext1, int ext2, const Parcel *in) { 7220560195a71ee26e8546075e56c49ff535fcf1767Wei Jia Mutex::Autolock autoLock(mLock); 7230560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(msg, ext1, ext2, in); 7240560195a71ee26e8546075e56c49ff535fcf1767Wei Jia} 7250560195a71ee26e8546075e56c49ff535fcf1767Wei Jia 7260560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::notifyListener_l( 7270560195a71ee26e8546075e56c49ff535fcf1767Wei Jia int msg, int ext1, int ext2, const Parcel *in) { 72867c2c94aa9d387bb7dc47514d62deeb66d486210Wei Jia ALOGD("notifyListener_l(%p), (%d, %d, %d)", this, msg, ext1, ext2); 729a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar switch (msg) { 730a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_PLAYBACK_COMPLETE: 731a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 73271079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia if (mState != STATE_RESET_IN_PROGRESS) { 733707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen if (mAutoLoop) { 734707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen audio_stream_type_t streamType = AUDIO_STREAM_MUSIC; 735707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen if (mAudioSink != NULL) { 736707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen streamType = mAudioSink->getAudioStreamType(); 737707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen } 738707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen if (streamType == AUDIO_STREAM_NOTIFICATION) { 739707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen ALOGW("disabling auto-loop for notification"); 740707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen mAutoLoop = false; 741707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen } 742707eadef2ad1388bafdb2d003a4169208fa99811Marco Nelissen } 743b7848f1c442bc8c71020957948d1b003a62a25b7Marco Nelissen if (mLooping || mAutoLoop) { 74471079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mPlayer->seekToAsync(0); 745368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen if (mAudioSink != NULL) { 746368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen // The renderer has stopped the sink at the end in order to play out 747368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen // the last little bit of audio. If we're looping, we need to restart it. 748368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen mAudioSink->start(); 749368e33700ed16acc8e99657fb84edd5d2806b34fMarco Nelissen } 75071079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia break; 75171079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia } 75271079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia 75371079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia mPlayer->pause(); 75418def1b8b8cdc91695ebb75bb392a84bb1b9c9beLajos Molnar mState = STATE_PAUSED; 755a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 756a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar // fall through 757c6993231c56da1924ba8d67eb150fa953ba54a1bMarco Nelissen } 758a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 759a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar case MEDIA_ERROR: 760a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar { 761a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar mAtEOS = true; 762a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 763a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar } 764a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar 765a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar default: 766a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar break; 767a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 768a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 7690560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.unlock(); 770dcb89b3b505522efde173c105a851c412f947178Chong Zhang sendEvent(msg, ext1, ext2, in); 7710560195a71ee26e8546075e56c49ff535fcf1767Wei Jia mLock.lock(); 772a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 773a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 7749575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) { 7759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING); 7789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 7809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE; 7819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 7829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 7839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) { 7859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 7869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 787b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber if (mState != STATE_PREPARING) { 788b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // We were preparing asynchronously when the client called 789b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // reset(), we sent a premature "prepared" notification and 790b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber // then initiated the reset. This notification is stale. 791b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE); 792b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber return; 793b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber } 794b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber 7959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber CHECK_EQ(mState, STATE_PREPARING); 7969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mAsyncResult = err; 7989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 7999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber if (err == OK) { 8002a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen // update state before notifying client, so that if client calls back into NuPlayerDriver 8012a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen // in response, NuPlayerDriver has the right state 8022a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_PREPARED; 803ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 8040560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_PREPARED); 805ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 8069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } else { 8072a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen mState = STATE_UNPREPARED; 808ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber if (mIsAsyncPrepare) { 8090560195a71ee26e8546075e56c49ff535fcf1767Wei Jia notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); 810ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber } 8119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber } 8129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 813f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen sp<MetaData> meta = mPlayer->getFileMeta(); 814f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen int32_t loop; 815f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen if (meta != NULL 816f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen && meta->findInt32(kKeyAutoLoop, &loop) && loop != 0) { 817f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen mAutoLoop = true; 818f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen } 819f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen 8209575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mCondition.broadcast(); 8219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 8229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 8239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) { 8249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber Mutex::Autolock autoLock(mLock); 8259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 8269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber mPlayerFlags = flags; 8279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber} 8289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber 829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 830