NuPlayerDriver.cpp revision adf34bf9b7925f990259b1b6f4c69b8668f76ead
19c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis/*
29c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Copyright (C) 2010 The Android Open Source Project
39c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
49c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License");
59c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * you may not use this file except in compliance with the License.
69c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * You may obtain a copy of the License at
79c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
89c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *      http://www.apache.org/licenses/LICENSE-2.0
99c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis *
109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * Unless required by applicable law or agreed to in writing, software
119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS,
129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * See the License for the specific language governing permissions and
149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis * limitations under the License.
159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis */
169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis//#define LOG_NDEBUG 0
189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#define LOG_TAG "NuPlayerDriver"
199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <inttypes.h>
209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <utils/Log.h>
21b7daa0dadebdb043d63e585975a128c5fc087168Mathias Agopian
229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "NuPlayerDriver.h"
23e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "NuPlayer.h"
259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include "NuPlayerSource.h"
269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <media/stagefright/foundation/ADebug.h>
289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <media/stagefright/foundation/ALooper.h>
299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis#include <media/stagefright/MetaData.h>
309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisnamespace android {
329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
339c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisNuPlayerDriver::NuPlayerDriver()
349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    : mState(STATE_IDLE),
359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mIsAsyncPrepare(false),
369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mAsyncResult(UNKNOWN_ERROR),
379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mSetSurfaceInProgress(false),
389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mDurationUs(-1),
399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mPositionUs(-1),
409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mNotifyTimeRealUs(-1),
419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mPauseStartedTimeUs(-1),
429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mNumFramesTotal(0),
439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mNumFramesDropped(0),
449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mLooper(new ALooper),
459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mPlayerFlags(0),
469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mAtEOS(false),
479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mLooping(false),
489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis      mStartupSeekTimeUs(-1) {
499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mLooper->setName("NuPlayerDriver Looper");
509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mLooper->start(
529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            false, /* runOnCallingThread */
539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            true,  /* canCallJava */
549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            PRIORITY_AUDIO);
559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPlayer = new NuPlayer;
579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mLooper->registerHandler(mPlayer);
589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5963d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling    mPlayer->setDriver(this);
609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
629c183f2493222000fa512d927cfde3f4c748eda0Jamie GennisNuPlayerDriver::~NuPlayerDriver() {
639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mLooper->stop();
649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::initCheck() {
679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setUID(uid_t uid) {
719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPlayer->setUID(uid);
729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
76b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchandstatus_t NuPlayerDriver::setDataSource(
777bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        const sp<IMediaHTTPService> &httpService,
787bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        const char *url,
797bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        const KeyedVector<String8, String8> *headers) {
807bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    Mutex::Autolock autoLock(mLock);
817bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
827bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    ALOGV("setDataSource: url=%s", url);
837bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    if (mState != STATE_IDLE) {
847bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        return INVALID_OPERATION;
857bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    }
867bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
877bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    mState = STATE_SET_DATASOURCE_PENDING;
887bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
897bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    mPlayer->setDataSourceAsync(httpService, url, headers);
907bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
917bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    while (mState == STATE_SET_DATASOURCE_PENDING) {
927bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        mCondition.wait(mLock);
937bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    }
949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
9563d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling    return mAsyncResult;
969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
1009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    ALOGV("setDataSource: fd=%d", fd);
1029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (mState != STATE_IDLE) {
1039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return INVALID_OPERATION;
1049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mState = STATE_SET_DATASOURCE_PENDING;
1079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPlayer->setDataSourceAsync(fd, offset, length);
1099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    while (mState == STATE_SET_DATASOURCE_PENDING) {
1119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mCondition.wait(mLock);
1129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return mAsyncResult;
1159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
1169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
1189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
1199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
120b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchand    ALOGV("setDataSource: stream source");
1217bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    if (mState != STATE_IDLE) {
1227bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        return INVALID_OPERATION;
1237bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    }
1247bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
1257bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    mState = STATE_SET_DATASOURCE_PENDING;
1267bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
1277bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    mPlayer->setDataSourceAsync(source);
1287bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
1297bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    while (mState == STATE_SET_DATASOURCE_PENDING) {
1307bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        mCondition.wait(mLock);
1317bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    }
1327bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
1337bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    return mAsyncResult;
1347bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling}
1357bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
1367bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gillingstatus_t NuPlayerDriver::setVideoSurfaceTexture(
1377bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        const sp<IGraphicBufferProducer> &bufferProducer) {
1387bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    Mutex::Autolock autoLock(mLock);
1397bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
1407bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    if (mSetSurfaceInProgress) {
1417bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        return INVALID_OPERATION;
1427bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    }
1437bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
1447bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    switch (mState) {
1457bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        case STATE_SET_DATASOURCE_PENDING:
1469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_RESET_IN_PROGRESS:
14763d076e3399c77cc610e81b4b173faa0a89efd23Erik Gilling            return INVALID_OPERATION;
1489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
1509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
1519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mSetSurfaceInProgress = true;
1549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPlayer->setVideoSurfaceTextureAsync(bufferProducer);
1569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    while (mSetSurfaceInProgress) {
1589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mCondition.wait(mLock);
1599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
1609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
1629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
1639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::prepare() {
1659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
1669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return prepare_l();
1679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
1689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::prepare_l() {
1709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    switch (mState) {
1719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_UNPREPARED:
1729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mState = STATE_PREPARING;
1739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
1749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // Make sure we're not posting any notifications, success or
1757bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            // failure information is only communicated through our result
176b3fb0ae7fd296031f1fa22f3ac058973a5621ebbRom Lemarchand            // code.
1777bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            mIsAsyncPrepare = false;
1787bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            mPlayer->prepareAsync();
1797bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            while (mState == STATE_PREPARING) {
1807bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling                mCondition.wait(mLock);
1817bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            }
1827bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR;
1837bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        case STATE_STOPPED:
1847bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            // this is really just paused. handle as seek to start
1857bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            mAtEOS = false;
1867bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            mState = STATE_STOPPED_AND_PREPARING;
1877bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            mIsAsyncPrepare = false;
1887bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            mPlayer->seekToAsync(0);
1897bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            while (mState == STATE_STOPPED_AND_PREPARING) {
1907bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling                mCondition.wait(mLock);
1917bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            }
1927bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR;
1937bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        default:
1947bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            return INVALID_OPERATION;
1957bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    };
1967bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling}
1977bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
1987bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gillingstatus_t NuPlayerDriver::prepareAsync() {
1997bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    Mutex::Autolock autoLock(mLock);
2007bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling
2017bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling    switch (mState) {
2027bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling        case STATE_UNPREPARED:
2037bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            mState = STATE_PREPARING;
2047bfdf27539cb5082e9d11da780d2d24405a008d6Erik Gilling            mIsAsyncPrepare = true;
2059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayer->prepareAsync();
2069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return OK;
2079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_STOPPED:
2089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // this is really just paused. handle as seek to start
209cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas            mAtEOS = false;
210cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas            mState = STATE_STOPPED_AND_PREPARING;
2119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mIsAsyncPrepare = true;
2129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayer->seekToAsync(0);
2139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return OK;
2149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
2159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return INVALID_OPERATION;
2169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    };
2179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
2189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::start() {
2209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
2219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    switch (mState) {
2239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_UNPREPARED:
2249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
2259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            status_t err = prepare_l();
226cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas
2279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            if (err != OK) {
2289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                return err;
2299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            }
2309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            CHECK_EQ(mState, STATE_PREPARED);
2329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // fall through
2349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
2359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PREPARED:
2379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
2389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mAtEOS = false;
2399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayer->start();
2409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            if (mStartupSeekTimeUs >= 0) {
2429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                if (mStartupSeekTimeUs == 0) {
243cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas                    notifySeekComplete_l();
244cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas                } else {
2459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                    mPlayer->seekToAsync(mStartupSeekTimeUs);
2469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                }
2479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                mStartupSeekTimeUs = -1;
2499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            }
2509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
2519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
2529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_RUNNING:
2549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
2559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            if (mAtEOS) {
2569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                mPlayer->seekToAsync(0);
2579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                mAtEOS = false;
2589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                mPositionUs = -1;
2599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            }
260cae752bea130d33a54c94ac5d30106ed70df278cAurimas Liutikas            break;
2619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
2629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PAUSED:
2649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_STOPPED_AND_PREPARED:
2659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
2669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayer->resume();
2679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPositionUs -= ALooper::GetNowUs() - mPauseStartedTimeUs;
2689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
2699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
2709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
2729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return INVALID_OPERATION;
2739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
2749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mState = STATE_RUNNING;
2769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPauseStartedTimeUs = -1;
2779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
2799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
2809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::stop() {
2829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
2839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    switch (mState) {
2859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_RUNNING:
2869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayer->pause();
2879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // fall through
2889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PAUSED:
2909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mState = STATE_STOPPED;
2919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            notifyListener_l(MEDIA_STOPPED);
2929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
2939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
2949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PREPARED:
2959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_STOPPED:
2969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_STOPPED_AND_PREPARING:
2979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_STOPPED_AND_PREPARED:
2989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mState = STATE_STOPPED;
2999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
3009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
3029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return INVALID_OPERATION;
3039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
3049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    setPauseStartedTimeIfNeeded();
3059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
3079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
3089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::pause() {
3109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
3119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    switch (mState) {
3139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PAUSED:
3149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PREPARED:
3159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return OK;
3169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_RUNNING:
3189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            setPauseStartedTimeIfNeeded();
3199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mState = STATE_PAUSED;
3209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            notifyListener_l(MEDIA_PAUSED);
3219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayer->pause();
3229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
3239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
3259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return INVALID_OPERATION;
3269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
3279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
3299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
3309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisbool NuPlayerDriver::isPlaying() {
3329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return mState == STATE_RUNNING && !mAtEOS;
3339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
3349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::seekTo(int msec) {
3369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
3379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    int64_t seekTimeUs = msec * 1000ll;
3399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    switch (mState) {
3419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PREPARED:
3429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
3439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mStartupSeekTimeUs = seekTimeUs;
3449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // pretend that the seek completed. It will actually happen when starting playback.
3459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // TODO: actually perform the seek here, so the player is ready to go at the new
3469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // location
3479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            notifySeekComplete_l();
3489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
3499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
3509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_RUNNING:
3529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PAUSED:
3539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
3549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mAtEOS = false;
3559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // seeks can take a while, so we essentially paused
3569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            notifyListener_l(MEDIA_PAUSED);
3579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayer->seekToAsync(seekTimeUs);
3589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
3599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
3609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
3629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return INVALID_OPERATION;
3639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
3649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPositionUs = seekTimeUs;
3669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mNotifyTimeRealUs = -1;
3679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
3689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
3699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::getCurrentPosition(int *msec) {
3719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
3729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (mPositionUs < 0) {
3749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        *msec = 0;
3759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    } else if (mNotifyTimeRealUs == -1) {
3769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        *msec = mPositionUs / 1000;
3779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    } else {
3789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        int64_t nowUs =
3799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                (isPlaying() ?  ALooper::GetNowUs() : mPauseStartedTimeUs);
3809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000;
3819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
3829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
3849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
3859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::getDuration(int *msec) {
3879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
3889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (mDurationUs < 0) {
3909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return UNKNOWN_ERROR;
3919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
3929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    *msec = (mDurationUs + 500ll) / 1000;
3949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
3969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
3979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
3989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::reset() {
3999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
4009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    switch (mState) {
4029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_IDLE:
4039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return OK;
4049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_SET_DATASOURCE_PENDING:
4069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_RESET_IN_PROGRESS:
4079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return INVALID_OPERATION;
4089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case STATE_PREPARING:
4109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
4119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            CHECK(mIsAsyncPrepare);
4129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            notifyListener_l(MEDIA_PREPARED);
4149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
4159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
4169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
4189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
4199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
4209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (mState != STATE_STOPPED) {
4229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        notifyListener_l(MEDIA_STOPPED);
4239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
4249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mState = STATE_RESET_IN_PROGRESS;
4269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPlayer->resetAsync();
4279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    while (mState == STATE_RESET_IN_PROGRESS) {
4299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mCondition.wait(mLock);
4309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
4319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mDurationUs = -1;
4339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPositionUs = -1;
4349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mStartupSeekTimeUs = -1;
4359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mLooping = false;
4369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
4389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
4399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setLooping(int loop) {
4419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mLooping = loop != 0;
4429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
4439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
4449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisplayer_type NuPlayerDriver::playerType() {
4469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return NU_PLAYER;
4479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
4489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
4509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (reply == NULL) {
4519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        ALOGE("reply is a NULL pointer");
4529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return BAD_VALUE;
4539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
4549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    int32_t methodId;
4569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    status_t ret = request.readInt32(&methodId);
4579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (ret != OK) {
4589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        ALOGE("Failed to retrieve the requested method to invoke");
4599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return ret;
4609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
4619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    switch (methodId) {
4639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case INVOKE_ID_SET_VIDEO_SCALING_MODE:
4649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
4659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int mode = request.readInt32();
4669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mPlayer->setVideoScalingMode(mode);
4679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
4689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case INVOKE_ID_GET_TRACK_INFO:
4709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
4719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mPlayer->getTrackInfo(reply);
4729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
4739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case INVOKE_ID_SELECT_TRACK:
4759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
4769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int trackIndex = request.readInt32();
4779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mPlayer->selectTrack(trackIndex, true /* select */);
4789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
4799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case INVOKE_ID_UNSELECT_TRACK:
4819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
4829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int trackIndex = request.readInt32();
4839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mPlayer->selectTrack(trackIndex, false /* select */);
4849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
4859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case INVOKE_ID_GET_SELECTED_TRACK:
4879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
4889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            int32_t type = request.readInt32();
4899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return mPlayer->getSelectedTrack(type, reply);
4909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
4919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
4939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
4949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return INVALID_OPERATION;
4959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
4969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
4979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
4989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
4999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
5009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPlayer->setAudioSink(audioSink);
5019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::setParameter(
5049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        int /* key */, const Parcel & /* request */) {
5059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return INVALID_OPERATION;
5069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) {
5099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return INVALID_OPERATION;
5109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::getMetadata(
5139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        const media::Metadata::Filter& /* ids */, Parcel *records) {
5149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
5159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    using media::Metadata;
5179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Metadata meta(records);
5199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    meta.appendBool(
5219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            Metadata::kPauseAvailable,
5229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE);
5239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    meta.appendBool(
5259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            Metadata::kSeekBackwardAvailable,
5269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD);
5279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    meta.appendBool(
5299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            Metadata::kSeekForwardAvailable,
5309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD);
5319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    meta.appendBool(
5339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            Metadata::kSeekAvailable,
5349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK);
5359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
5379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyResetComplete() {
5409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
5419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    CHECK_EQ(mState, STATE_RESET_IN_PROGRESS);
5439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mState = STATE_IDLE;
5449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mCondition.broadcast();
5459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifySetSurfaceComplete() {
5489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
5499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    CHECK(mSetSurfaceInProgress);
5519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mSetSurfaceInProgress = false;
5529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mCondition.broadcast();
5549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyDuration(int64_t durationUs) {
5579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
5589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mDurationUs = durationUs;
5599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyPosition(int64_t positionUs) {
5629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
5639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (isPlaying()) {
5649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mPositionUs = positionUs;
5659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mNotifyTimeRealUs = ALooper::GetNowUs();
5669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
5679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifySeekComplete() {
5709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
5719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    notifySeekComplete_l();
5729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifySeekComplete_l() {
5759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    bool wasSeeking = true;
5769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (mState == STATE_STOPPED_AND_PREPARING) {
5779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        wasSeeking = false;
5789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mState = STATE_STOPPED_AND_PREPARED;
5799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mCondition.broadcast();
5809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        if (!mIsAsyncPrepare) {
5819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // if we are preparing synchronously, no need to notify listener
5829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            return;
5839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
5849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    } else if (mState == STATE_STOPPED) {
5859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        // no need to notify listener
5869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return;
5879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
5889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED);
5899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyFrameStats(
5929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        int64_t numFramesTotal, int64_t numFramesDropped) {
5939c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
5949c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mNumFramesTotal = numFramesTotal;
5959c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mNumFramesDropped = numFramesDropped;
5969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
5979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
5989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisstatus_t NuPlayerDriver::dump(
5999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        int fd, const Vector<String16> & /* args */) const {
6009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
6019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    FILE *out = fdopen(dup(fd), "w");
60392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn
6049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    fprintf(out, " NuPlayer\n");
6059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    fprintf(out, "  numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), "
6069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                 "percentageDropped(%.2f)\n",
6079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                 mNumFramesTotal,
6089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                 mNumFramesDropped,
6099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                 mNumFramesTotal == 0
6109c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                    ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal);
6119c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6129c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    fclose(out);
6139c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    out = NULL;
6149c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6159c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    return OK;
6169c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
6179c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6189c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyListener(
6199c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        int msg, int ext1, int ext2, const Parcel *in) {
6209c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
6219c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    notifyListener_l(msg, ext1, ext2, in);
6229c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
6239c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6249c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyListener_l(
6259c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        int msg, int ext1, int ext2, const Parcel *in) {
6269c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    switch (msg) {
6279c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case MEDIA_PLAYBACK_COMPLETE:
6289c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
6299c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            if (mLooping && mState != STATE_RESET_IN_PROGRESS) {
6309c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                mLock.unlock();
6319c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                mPlayer->seekToAsync(0);
6329c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                mLock.lock();
6339c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis                break;
6349c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            }
6359c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            // fall through
6369c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
6379c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6389c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        case MEDIA_ERROR:
6399c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        {
6409c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            mAtEOS = true;
6419c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            setPauseStartedTimeIfNeeded();
6429c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
6439c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
6449c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6459c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        default:
6469c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            break;
6479c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
6489c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6499c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mLock.unlock();
6509c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    sendEvent(msg, ext1, ext2, in);
6519c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mLock.lock();
6529c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
6539c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6549c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) {
6559c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
6569c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6579c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING);
6589c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6599c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mAsyncResult = err;
6609c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE;
6619c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mCondition.broadcast();
6629c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
6639c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6649c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyPrepareCompleted(status_t err) {
6659c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
6669c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6679c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (mState != STATE_PREPARING) {
6689c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        // We were preparing asynchronously when the client called
6699c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        // reset(), we sent a premature "prepared" notification and
6709c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        // then initiated the reset. This notification is stale.
6719c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE);
6729c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        return;
6739c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
6749c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6759c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    CHECK_EQ(mState, STATE_PREPARING);
6769c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6779c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mAsyncResult = err;
6789c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6799c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (err == OK) {
6809c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        // update state before notifying client, so that if client calls back into NuPlayerDriver
6819c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        // in response, NuPlayerDriver has the right state
6829c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mState = STATE_PREPARED;
6839c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        if (mIsAsyncPrepare) {
6849c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            notifyListener_l(MEDIA_PREPARED);
6859c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
6869c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    } else {
6879c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mState = STATE_UNPREPARED;
6889c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        if (mIsAsyncPrepare) {
6899c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
6909c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        }
6919c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
6929c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
69392dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn    mCondition.broadcast();
69492dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn}
69592dc3fc52cf097bd105460cf377779bdcf146d62Mark Salyzyn
6969c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) {
6979c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    Mutex::Autolock autoLock(mLock);
6989c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
6999c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    mPlayerFlags = flags;
7009c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
7019c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
7029c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennisvoid NuPlayerDriver::setPauseStartedTimeIfNeeded() {
7039c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    if (mPauseStartedTimeUs == -1) {
7049c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis        mPauseStartedTimeUs = ALooper::GetNowUs();
7059c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis    }
7069c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}
7079c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis
7089c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis}  // namespace android
7099c183f2493222000fa512d927cfde3f4c748eda0Jamie Gennis