NuPlayerDriver.cpp revision 57a339cdb7524f883de3ceb364c0b5606df0c610
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" 24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 251aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber#include <media/stagefright/foundation/ADebug.h> 26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ALooper.h> 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 28f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 30f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::NuPlayerDriver() 311aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber : mResetInProgress(false), 3257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress(false), 3343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs(-1), 3443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs(-1), 353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal(0), 363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped(0), 371aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mLooper(new ALooper), 3843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mState(UNINITIALIZED), 39a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS(false), 4043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs(-1) { 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->setName("NuPlayerDriver Looper"); 42f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->start( 44f933441648ef6a71dee783d733aac17b9508b452Andreas Huber false, /* runOnCallingThread */ 45f933441648ef6a71dee783d733aac17b9508b452Andreas Huber true, /* canCallJava */ 46f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PRIORITY_AUDIO); 47f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer = new NuPlayer; 49f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->registerHandler(mPlayer); 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->setDriver(this); 52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() { 55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLooper->stop(); 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() { 59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 60f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 629b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) { 639b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 649b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 659b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 669b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 679b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 68f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource( 69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *url, const KeyedVector<String8, String8> *headers) { 7043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK_EQ((int)mState, (int)UNINITIALIZED); 7143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 725bc087c573c70c84c6a39946457590b42d392a33Andreas Huber mPlayer->setDataSource(url, headers); 735bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 7443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mState = STOPPED; 7543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 765bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 77f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 78f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 79f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) { 80afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber CHECK_EQ((int)mState, (int)UNINITIALIZED); 81afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 82afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber mPlayer->setDataSource(fd, offset, length); 83afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 84afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber mState = STOPPED; 85afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 86afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return OK; 87f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 88f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 89f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) { 9043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK_EQ((int)mState, (int)UNINITIALIZED); 9143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 92f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setDataSource(source); 93f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mState = STOPPED; 9543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 96f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 991173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture( 1001173118eace0e9e347cb007f0da817cee87579edGlenn Kasten const sp<ISurfaceTexture> &surfaceTexture) { 10157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 10257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 10357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber if (mResetInProgress) { 10457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber return INVALID_OPERATION; 10557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 10657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 10757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress = true; 10857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 10957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mPlayer->setVideoSurfaceTextureAsync(surfaceTexture); 11057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 11157a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber while (mSetSurfaceInProgress) { 11257a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mCondition.wait(mLock); 11357a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber } 1141173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 1151173118eace0e9e347cb007f0da817cee87579edGlenn Kasten return OK; 1161173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 1171173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 118f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() { 1190b7c9a327f5d10b841a3aa2bbe103a2ca6dcac37Andreas Huber sendEvent(MEDIA_SET_VIDEO_SIZE, 0, 0); 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepareAsync() { 124afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber status_t err = prepare(); 125afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber 126a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber notifyListener(MEDIA_PREPARED); 1275bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 128afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber return err; 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 131f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() { 13243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 13343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case UNINITIALIZED: 13443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return INVALID_OPERATION; 13543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case STOPPED: 13643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 137a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 13843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->start(); 13943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 14043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mStartupSeekTimeUs >= 0) { 1412048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber if (mStartupSeekTimeUs == 0) { 1422048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber notifySeekComplete(); 1432048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } else { 1442048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber mPlayer->seekToAsync(mStartupSeekTimeUs); 1452048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber } 1462048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 14743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 14843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 1492048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber 15043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 15143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 15243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case PLAYING: 15343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 15443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 15543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 15643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK_EQ((int)mState, (int)PAUSED); 15743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 15843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->resume(); 15943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 16043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 16143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 16243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 16343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mState = PLAYING; 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() { 16943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return pause(); 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() { 17343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 17443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case UNINITIALIZED: 17543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return INVALID_OPERATION; 17643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case STOPPED: 17743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 17843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case PLAYING: 17943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->pause(); 18043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 18143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 18243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 18343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber CHECK_EQ((int)mState, (int)PAUSED); 18443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 18543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 18643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 18743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 18843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mState = PAUSED; 18943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() { 194a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber return mState == PLAYING && !mAtEOS; 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) { 19843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber int64_t seekTimeUs = msec * 1000ll; 19943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 20043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber switch (mState) { 20143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case UNINITIALIZED: 20243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return INVALID_OPERATION; 20343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case STOPPED: 20443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 20543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = seekTimeUs; 20643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 20743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 20843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case PLAYING: 20943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber case PAUSED: 21043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber { 211a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = false; 21243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPlayer->seekToAsync(seekTimeUs); 21343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 21443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 21543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 21643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber default: 21743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber TRESPASS(); 21843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber break; 21943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 22043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 22143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber return OK; 222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 224f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) { 22543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 22643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 22743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mPositionUs < 0) { 22843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 22943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 23043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = (mPositionUs + 500ll) / 1000; 23143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2325bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2335bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) { 23743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 23843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 23943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber if (mDurationUs < 0) { 24043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = 0; 24143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } else { 24243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber *msec = (mDurationUs + 500ll) / 1000; 24343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber } 2445bc087c573c70c84c6a39946457590b42d392a33Andreas Huber 2455bc087c573c70c84c6a39946457590b42d392a33Andreas Huber return OK; 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() { 2491aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 2501aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = true; 2511aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2521aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mPlayer->resetAsync(); 2531aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 2541aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber while (mResetInProgress) { 2551aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.wait(mLock); 2561aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber } 2571aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 25843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = -1; 25943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = -1; 26043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mState = UNINITIALIZED; 26143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mStartupSeekTimeUs = -1; 26243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 263f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 266f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setLooping(int loop) { 267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INVALID_OPERATION; 268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() { 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NU_PLAYER; 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) { 2750d268a3cae145afb2720c88ae38fb81550be5584James Dong if (reply == NULL) { 2760d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("reply is a NULL pointer"); 2770d268a3cae145afb2720c88ae38fb81550be5584James Dong return BAD_VALUE; 2780d268a3cae145afb2720c88ae38fb81550be5584James Dong } 2790d268a3cae145afb2720c88ae38fb81550be5584James Dong 2800d268a3cae145afb2720c88ae38fb81550be5584James Dong int32_t methodId; 2810d268a3cae145afb2720c88ae38fb81550be5584James Dong status_t ret = request.readInt32(&methodId); 2820d268a3cae145afb2720c88ae38fb81550be5584James Dong if (ret != OK) { 2830d268a3cae145afb2720c88ae38fb81550be5584James Dong ALOGE("Failed to retrieve the requested method to invoke"); 2840d268a3cae145afb2720c88ae38fb81550be5584James Dong return ret; 2850d268a3cae145afb2720c88ae38fb81550be5584James Dong } 2860d268a3cae145afb2720c88ae38fb81550be5584James Dong 2870d268a3cae145afb2720c88ae38fb81550be5584James Dong switch (methodId) { 2880d268a3cae145afb2720c88ae38fb81550be5584James Dong case INVOKE_ID_SET_VIDEO_SCALING_MODE: 2890d268a3cae145afb2720c88ae38fb81550be5584James Dong { 2900d268a3cae145afb2720c88ae38fb81550be5584James Dong int mode = request.readInt32(); 2910d268a3cae145afb2720c88ae38fb81550be5584James Dong return mPlayer->setVideoScalingMode(mode); 2920d268a3cae145afb2720c88ae38fb81550be5584James Dong } 2930d268a3cae145afb2720c88ae38fb81550be5584James Dong default: 2940d268a3cae145afb2720c88ae38fb81550be5584James Dong { 2950d268a3cae145afb2720c88ae38fb81550be5584James Dong return INVALID_OPERATION; 2960d268a3cae145afb2720c88ae38fb81550be5584James Dong } 2970d268a3cae145afb2720c88ae38fb81550be5584James Dong } 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 300f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) { 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPlayer->setAudioSink(audioSink); 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3044f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t NuPlayerDriver::setParameter(int key, const Parcel &request) { 3054f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 3064f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 3074f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 3084f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t NuPlayerDriver::getParameter(int key, Parcel *reply) { 3094f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return INVALID_OPERATION; 3104f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 3114f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 312f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata( 313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const media::Metadata::Filter& ids, Parcel *records) { 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return INVALID_OPERATION; 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31743c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() { 3181aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber Mutex::Autolock autoLock(mLock); 3191aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber CHECK(mResetInProgress); 3201aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mResetInProgress = false; 3211aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber mCondition.broadcast(); 3221aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber} 3231aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber 32457a339cdb7524f883de3ceb364c0b5606df0c610Andreas Hubervoid NuPlayerDriver::notifySetSurfaceComplete() { 32557a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber Mutex::Autolock autoLock(mLock); 32657a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber CHECK(mSetSurfaceInProgress); 32757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mSetSurfaceInProgress = false; 32857a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber mCondition.broadcast(); 32957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber} 33057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber 33143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) { 33243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 33343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mDurationUs = durationUs; 33443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 33543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 33643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) { 33743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber Mutex::Autolock autoLock(mLock); 33843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber mPositionUs = positionUs; 33943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 34043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 34143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() { 342a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber notifyListener(MEDIA_SEEK_COMPLETE); 34343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber} 34443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber 3453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats( 3463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber int64_t numFramesTotal, int64_t numFramesDropped) { 3473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 3483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal = numFramesTotal; 3493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped = numFramesDropped; 3503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 3513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huberstatus_t NuPlayerDriver::dump(int fd, const Vector<String16> &args) const { 3533fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber Mutex::Autolock autoLock(mLock); 3543fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3553fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber FILE *out = fdopen(dup(fd), "w"); 3563fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3573fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " NuPlayer\n"); 3583fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fprintf(out, " numFramesTotal(%lld), numFramesDropped(%lld), " 3593fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber "percentageDropped(%.2f)\n", 3603fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal, 3613fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesDropped, 3623fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber mNumFramesTotal == 0 3633fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal); 3643fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3653fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber fclose(out); 3663fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber out = NULL; 3673fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 3683fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber return OK; 3693fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber} 3703fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber 371a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Hubervoid NuPlayerDriver::notifyListener(int msg, int ext1, int ext2) { 372a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber if (msg == MEDIA_PLAYBACK_COMPLETE || msg == MEDIA_ERROR) { 373a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber mAtEOS = true; 374a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber } 375a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 376a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber sendEvent(msg, ext1, ext2); 377a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber} 378a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 380