NuPlayerDriver.cpp revision e427abf1ea252ff305fc33aacdd2e83cf34891b5
1f933441648ef6a71dee783d733aac17b9508b452Andreas Huber/*
2f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Copyright (C) 2010 The Android Open Source Project
3f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
4f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * you may not use this file except in compliance with the License.
6f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * You may obtain a copy of the License at
7f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
8f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *
10f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * Unless required by applicable law or agreed to in writing, software
11f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * See the License for the specific language governing permissions and
14f933441648ef6a71dee783d733aac17b9508b452Andreas Huber * limitations under the License.
15f933441648ef6a71dee783d733aac17b9508b452Andreas Huber */
16f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0
18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "NuPlayerDriver"
19377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT#include <inttypes.h>
20f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <utils/Log.h>
21f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
22f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayerDriver.h"
23f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
24f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include "NuPlayer.h"
259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include "NuPlayerSource.h"
26f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
271aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber#include <media/stagefright/foundation/ADebug.h>
28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ALooper.h>
299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber#include <media/stagefright/MetaData.h>
30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
31f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android {
32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
33f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::NuPlayerDriver()
349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    : mState(STATE_IDLE),
35ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber      mIsAsyncPrepare(false),
369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber      mAsyncResult(UNKNOWN_ERROR),
3713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang      mSetSurfaceInProgress(false),
3843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber      mDurationUs(-1),
3943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber      mPositionUs(-1),
400560195a71ee26e8546075e56c49ff535fcf1767Wei Jia      mNotifyTimeRealUs(-1),
410560195a71ee26e8546075e56c49ff535fcf1767Wei Jia      mPauseStartedTimeUs(-1),
423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesTotal(0),
433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber      mNumFramesDropped(0),
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) {
50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mLooper->setName("NuPlayerDriver Looper");
51f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
52f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mLooper->start(
53f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            false, /* runOnCallingThread */
54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            true,  /* canCallJava */
55f933441648ef6a71dee783d733aac17b9508b452Andreas Huber            PRIORITY_AUDIO);
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mPlayer = new NuPlayer;
58f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mLooper->registerHandler(mPlayer);
59f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
6043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mPlayer->setDriver(this);
61f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
62f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
63f933441648ef6a71dee783d733aac17b9508b452Andreas HuberNuPlayerDriver::~NuPlayerDriver() {
64f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mLooper->stop();
65f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::initCheck() {
68f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
69f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
719b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t NuPlayerDriver::setUID(uid_t uid) {
729b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    mPlayer->setUID(uid);
739b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
749b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber    return OK;
759b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber}
769b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber
77f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(
781b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const sp<IMediaHTTPService> &httpService,
791b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const char *url,
801b86fe063badb5f28c467ade39be0f4008688947Andreas Huber        const KeyedVector<String8, String8> *headers) {
819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
8243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
83a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar    ALOGV("setDataSource: url=%s", url);
849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    if (mState != STATE_IDLE) {
859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        return INVALID_OPERATION;
869575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
875bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mState = STATE_SET_DATASOURCE_PENDING;
8943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
901b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    mPlayer->setDataSourceAsync(httpService, url, headers);
919575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
929575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    while (mState == STATE_SET_DATASOURCE_PENDING) {
939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        mCondition.wait(mLock);
949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    return mAsyncResult;
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
1009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
101afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
102a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar    ALOGV("setDataSource: fd=%d", fd);
1039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    if (mState != STATE_IDLE) {
1049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        return INVALID_OPERATION;
1059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
106afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mState = STATE_SET_DATASOURCE_PENDING;
108afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1099575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mPlayer->setDataSourceAsync(fd, offset, length);
1109575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1119575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    while (mState == STATE_SET_DATASOURCE_PENDING) {
1129575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        mCondition.wait(mLock);
1139575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
1149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    return mAsyncResult;
116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
118f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
1199575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
12043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
121a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar    ALOGV("setDataSource: stream source");
1229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    if (mState != STATE_IDLE) {
1239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        return INVALID_OPERATION;
1249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mState = STATE_SET_DATASOURCE_PENDING;
12743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
1289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mPlayer->setDataSourceAsync(source);
1299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    while (mState == STATE_SET_DATASOURCE_PENDING) {
1319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        mCondition.wait(mLock);
1329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
1339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    return mAsyncResult;
135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1371173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t NuPlayerDriver::setVideoSurfaceTexture(
1388ba01021b573889802e67e029225a96f0dfa471aAndy McFadden        const sp<IGraphicBufferProducer> &bufferProducer) {
13957a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber    Mutex::Autolock autoLock(mLock);
14057a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
14113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    if (mSetSurfaceInProgress) {
14213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang        return INVALID_OPERATION;
14313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    }
14413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang
1459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    switch (mState) {
1469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_SET_DATASOURCE_PENDING:
1479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_RESET_IN_PROGRESS:
1489575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return INVALID_OPERATION;
1499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
1509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        default:
1519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
1529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
1539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
15413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    mSetSurfaceInProgress = true;
15513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang
1568ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    mPlayer->setVideoSurfaceTextureAsync(bufferProducer);
15757a339cdb7524f883de3ceb364c0b5606df0c610Andreas Huber
15813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    while (mSetSurfaceInProgress) {
15913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang        mCondition.wait(mLock);
16013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    }
16113d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang
1621173118eace0e9e347cb007f0da817cee87579edGlenn Kasten    return OK;
1631173118eace0e9e347cb007f0da817cee87579edGlenn Kasten}
1641173118eace0e9e347cb007f0da817cee87579edGlenn Kasten
165f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::prepare() {
1669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
1679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    return prepare_l();
168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepare_l() {
1719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    switch (mState) {
1729575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_UNPREPARED:
1739575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mState = STATE_PREPARING;
174ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber
175ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            // Make sure we're not posting any notifications, success or
176ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            // failure information is only communicated through our result
177ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            // code.
178ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            mIsAsyncPrepare = false;
1799575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mPlayer->prepareAsync();
1809575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            while (mState == STATE_PREPARING) {
1819575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                mCondition.wait(mLock);
1829575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            }
1839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR;
1844b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_STOPPED:
1854b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            // this is really just paused. handle as seek to start
1864b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mAtEOS = false;
1874b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mState = STATE_STOPPED_AND_PREPARING;
1884b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mIsAsyncPrepare = false;
1894b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mPlayer->seekToAsync(0);
1904b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            while (mState == STATE_STOPPED_AND_PREPARING) {
1914b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar                mCondition.wait(mLock);
1924b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            }
1934b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            return (mState == STATE_STOPPED_AND_PREPARED) ? OK : UNKNOWN_ERROR;
1949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        default:
1959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return INVALID_OPERATION;
1969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    };
1979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
198afed0e1fa37473a4cd30018577b560acc79d9a3fAndreas Huber
1999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huberstatus_t NuPlayerDriver::prepareAsync() {
2009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
2015bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
2029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    switch (mState) {
2039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_UNPREPARED:
2049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mState = STATE_PREPARING;
205ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber            mIsAsyncPrepare = true;
2069575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mPlayer->prepareAsync();
2079575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return OK;
2084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_STOPPED:
2094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            // this is really just paused. handle as seek to start
2104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mAtEOS = false;
2114b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mState = STATE_STOPPED_AND_PREPARING;
2124b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mIsAsyncPrepare = true;
2134b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mPlayer->seekToAsync(0);
2144b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            return OK;
2159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        default:
2169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return INVALID_OPERATION;
2179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    };
218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
220f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::start() {
2219575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
2229575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
22343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    switch (mState) {
2249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_UNPREPARED:
2259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
2269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            status_t err = prepare_l();
2279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
2289575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            if (err != OK) {
2299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber                return err;
2309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            }
2319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
2329575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            CHECK_EQ(mState, STATE_PREPARED);
2339575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
2349575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            // fall through
2359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        }
2369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
2379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_PREPARED:
23843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
239a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber            mAtEOS = false;
24043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mPlayer->start();
24143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
24243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            if (mStartupSeekTimeUs >= 0) {
243e427abf1ea252ff305fc33aacdd2e83cf34891b5Wei Jia                if (mStartupSeekTimeUs > 0) {
2442048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber                    mPlayer->seekToAsync(mStartupSeekTimeUs);
2452048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber                }
2462048d0cfccce48be26816dec8711a6691ebff71cAndreas Huber
24743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber                mStartupSeekTimeUs = -1;
24843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            }
24943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
25043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
25143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_RUNNING:
2530560195a71ee26e8546075e56c49ff535fcf1767Wei Jia        {
2540560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            if (mAtEOS) {
2550560195a71ee26e8546075e56c49ff535fcf1767Wei Jia                mPlayer->seekToAsync(0);
2560560195a71ee26e8546075e56c49ff535fcf1767Wei Jia                mAtEOS = false;
2570560195a71ee26e8546075e56c49ff535fcf1767Wei Jia                mPositionUs = -1;
2580560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            }
2599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
2600560195a71ee26e8546075e56c49ff535fcf1767Wei Jia        }
2619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
2629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_PAUSED:
2634b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_STOPPED_AND_PREPARED:
2649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        {
2656e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih            if (mAtEOS) {
2666e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih                mPlayer->seekToAsync(0);
2676e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih                mAtEOS = false;
2686e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih                mPlayer->resume();
2696e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih                mPositionUs = -1;
2706e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih            } else {
2716e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih                mPlayer->resume();
27209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung                if (mNotifyTimeRealUs != -1) {
27309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung                    // Pause time must be set if here by setPauseStartedTimeIfNeeded().
27409e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung                    //CHECK(mPauseStartedTimeUs != -1);
27509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung
27609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung                    // if no seek occurs, adjust our notify time so that getCurrentPosition()
27709e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung                    // is continuous if read immediately after calling start().
27809e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung                    mNotifyTimeRealUs += ALooper::GetNowUs() - mPauseStartedTimeUs;
27909e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung                }
2806e9f6b498d758848fd934f8217c386dd74ef3833Robert Shih            }
28143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
28243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
2839575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
2849575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        default:
2859575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return INVALID_OPERATION;
28643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
28743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
2889575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mState = STATE_RUNNING;
2890560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    mPauseStartedTimeUs = -1;
290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
294f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::stop() {
2954b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar    Mutex::Autolock autoLock(mLock);
2964b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar
2974b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar    switch (mState) {
2984b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_RUNNING:
2994b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mPlayer->pause();
3004b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            // fall through
3014b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar
3024b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_PAUSED:
3032a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen            mState = STATE_STOPPED;
3040560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            notifyListener_l(MEDIA_STOPPED);
3052a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen            break;
3064b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar
3074b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_PREPARED:
3084b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_STOPPED:
3094b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_STOPPED_AND_PREPARING:
3104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        case STATE_STOPPED_AND_PREPARED:
3114b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            mState = STATE_STOPPED;
3124b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            break;
3134b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar
3144b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        default:
3154b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            return INVALID_OPERATION;
3164b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar    }
3170560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    setPauseStartedTimeIfNeeded();
3184b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar
3194b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar    return OK;
320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
322f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::pause() {
3239575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
3249575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
32543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    switch (mState) {
3269575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_PAUSED:
3279575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_PREPARED:
32843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            return OK;
3299575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
3309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_RUNNING:
3312a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen            setPauseStartedTimeIfNeeded();
3322a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen            mState = STATE_PAUSED;
3330560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            notifyListener_l(MEDIA_PAUSED);
33443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mPlayer->pause();
33543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
3369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
33743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        default:
3389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return INVALID_OPERATION;
33943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
34043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
344f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool NuPlayerDriver::isPlaying() {
3459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    return mState == STATE_RUNNING && !mAtEOS;
346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
348f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::seekTo(int msec) {
3499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
3509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
35143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    int64_t seekTimeUs = msec * 1000ll;
35243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
35343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    switch (mState) {
3549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_PREPARED:
35543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
35643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            mStartupSeekTimeUs = seekTimeUs;
357dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen            // pretend that the seek completed. It will actually happen when starting playback.
358dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen            // TODO: actually perform the seek here, so the player is ready to go at the new
359dd114d19f65d8a5cdfddbaf6d3ef8119c6169b28Marco Nelissen            // location
360eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen            notifySeekComplete_l();
36143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
36243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
3639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
3649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_RUNNING:
3659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_PAUSED:
36643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        {
367a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber            mAtEOS = false;
368cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar            // seeks can take a while, so we essentially paused
3690560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            notifyListener_l(MEDIA_PAUSED);
370e427abf1ea252ff305fc33aacdd2e83cf34891b5Wei Jia            mPlayer->seekToAsync(seekTimeUs, true /* needNotify */);
37143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber            break;
37243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        }
37343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
37443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        default:
3759575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return INVALID_OPERATION;
37643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
37743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
3780560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    mPositionUs = seekTimeUs;
3790560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    mNotifyTimeRealUs = -1;
38043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    return OK;
381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
383f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getCurrentPosition(int *msec) {
38443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    Mutex::Autolock autoLock(mLock);
38543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
38643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mPositionUs < 0) {
38709e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // mPositionUs is the media time.
38809e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // It is negative under these cases
38909e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // (1) == -1 after reset, or very first playback, no stream notification yet.
39009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // (2) == -1 start after end of stream, no stream notification yet.
39109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // (3) == large negative # after ~292,471 years of continuous playback.
39209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung
39309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        //CHECK_EQ(mPositionUs, -1);
39443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        *msec = 0;
3950560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    } else if (mNotifyTimeRealUs == -1) {
39609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // A seek has occurred just occurred, no stream notification yet.
39709e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // mPositionUs (>= 0) is the new media position.
3980560195a71ee26e8546075e56c49ff535fcf1767Wei Jia        *msec = mPositionUs / 1000;
39943c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    } else {
40009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // mPosition must be valid (i.e. >= 0) by the first check above.
40109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // We're either playing or have pause time set: mPauseStartedTimeUs is >= 0
40209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        //LOG_ALWAYS_FATAL_IF(
40309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        //        !isPlaying() && mPauseStartedTimeUs < 0,
40409e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        //        "Player in non-playing mState(%d) and mPauseStartedTimeUs(%lld) < 0",
40509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        //        mState, (long long)mPauseStartedTimeUs);
40609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        ALOG_ASSERT(mNotifyTimeRealUs >= 0);
40715506a6582fb86567c6887c4c426d44be02d12afWei Jia        int64_t nowUs =
4080560195a71ee26e8546075e56c49ff535fcf1767Wei Jia                (isPlaying() ?  ALooper::GetNowUs() : mPauseStartedTimeUs);
40915506a6582fb86567c6887c4c426d44be02d12afWei Jia        *msec = (mPositionUs + nowUs - mNotifyTimeRealUs + 500ll) / 1000;
41009e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // It is possible for *msec to be negative if the media position is > 596 hours.
41109e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        // but we turn on this checking in NDEBUG == 0 mode.
41209e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        ALOG_ASSERT(*msec >= 0);
41309e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung        ALOGV("getCurrentPosition nowUs(%lld)", (long long)nowUs);
41443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
41509e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung    ALOGV("getCurrentPosition returning(%d) mPositionUs(%lld) mNotifyRealTimeUs(%lld)",
41609e0c3646362d29c78bc26c8b23b7a753c412e6cAndy Hung            *msec, (long long)mPositionUs, (long long)mNotifyTimeRealUs);
4175bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    return OK;
418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
420f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getDuration(int *msec) {
42143c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    Mutex::Autolock autoLock(mLock);
42243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
42343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    if (mDurationUs < 0) {
424d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber        return UNKNOWN_ERROR;
42543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    }
4265bc087c573c70c84c6a39946457590b42d392a33Andreas Huber
427d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber    *msec = (mDurationUs + 500ll) / 1000;
428d85929f6086e050d7cb33bfe0d29f339ad7279e5Andreas Huber
4295bc087c573c70c84c6a39946457590b42d392a33Andreas Huber    return OK;
430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
432f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::reset() {
4331aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    Mutex::Autolock autoLock(mLock);
4341aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4359575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    switch (mState) {
4369575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_IDLE:
4379575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return OK;
4389575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
4399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_SET_DATASOURCE_PENDING:
4409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        case STATE_RESET_IN_PROGRESS:
4419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            return INVALID_OPERATION;
4429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
443b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber        case STATE_PREPARING:
444b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber        {
445b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber            CHECK(mIsAsyncPrepare);
446b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber
4470560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            notifyListener_l(MEDIA_PREPARED);
448b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber            break;
449b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber        }
450b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber
4519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber        default:
4529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            break;
4539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
4549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
4554b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar    if (mState != STATE_STOPPED) {
4560560195a71ee26e8546075e56c49ff535fcf1767Wei Jia        notifyListener_l(MEDIA_STOPPED);
4574b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar    }
458cbaffcffee6418d678806e63097c19fe26d48fe0Lajos Molnar
4599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mState = STATE_RESET_IN_PROGRESS;
4601aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mPlayer->resetAsync();
4611aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
4629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    while (mState == STATE_RESET_IN_PROGRESS) {
4631aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber        mCondition.wait(mLock);
4641aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    }
4651aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
46643c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDurationUs = -1;
46743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mPositionUs = -1;
46843c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mStartupSeekTimeUs = -1;
469a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar    mLooping = false;
47043c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
471f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return OK;
472f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
473f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
474a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnarstatus_t NuPlayerDriver::setLooping(int loop) {
475a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar    mLooping = loop != 0;
476a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar    return OK;
477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
479f933441648ef6a71dee783d733aac17b9508b452Andreas Huberplayer_type NuPlayerDriver::playerType() {
480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return NU_PLAYER;
481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
483f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
4840d268a3cae145afb2720c88ae38fb81550be5584James Dong    if (reply == NULL) {
4850d268a3cae145afb2720c88ae38fb81550be5584James Dong        ALOGE("reply is a NULL pointer");
4860d268a3cae145afb2720c88ae38fb81550be5584James Dong        return BAD_VALUE;
4870d268a3cae145afb2720c88ae38fb81550be5584James Dong    }
4880d268a3cae145afb2720c88ae38fb81550be5584James Dong
4890d268a3cae145afb2720c88ae38fb81550be5584James Dong    int32_t methodId;
4900d268a3cae145afb2720c88ae38fb81550be5584James Dong    status_t ret = request.readInt32(&methodId);
4910d268a3cae145afb2720c88ae38fb81550be5584James Dong    if (ret != OK) {
4920d268a3cae145afb2720c88ae38fb81550be5584James Dong        ALOGE("Failed to retrieve the requested method to invoke");
4930d268a3cae145afb2720c88ae38fb81550be5584James Dong        return ret;
4940d268a3cae145afb2720c88ae38fb81550be5584James Dong    }
4950d268a3cae145afb2720c88ae38fb81550be5584James Dong
4960d268a3cae145afb2720c88ae38fb81550be5584James Dong    switch (methodId) {
4970d268a3cae145afb2720c88ae38fb81550be5584James Dong        case INVOKE_ID_SET_VIDEO_SCALING_MODE:
4980d268a3cae145afb2720c88ae38fb81550be5584James Dong        {
4990d268a3cae145afb2720c88ae38fb81550be5584James Dong            int mode = request.readInt32();
5000d268a3cae145afb2720c88ae38fb81550be5584James Dong            return mPlayer->setVideoScalingMode(mode);
5010d268a3cae145afb2720c88ae38fb81550be5584James Dong        }
502d5e56231a598b180a1d898bb7dc61b75580e59a4Andreas Huber
503dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case INVOKE_ID_GET_TRACK_INFO:
504dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
505dcb89b3b505522efde173c105a851c412f947178Chong Zhang            return mPlayer->getTrackInfo(reply);
506dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
507dcb89b3b505522efde173c105a851c412f947178Chong Zhang
508dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case INVOKE_ID_SELECT_TRACK:
509dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
510dcb89b3b505522efde173c105a851c412f947178Chong Zhang            int trackIndex = request.readInt32();
511dcb89b3b505522efde173c105a851c412f947178Chong Zhang            return mPlayer->selectTrack(trackIndex, true /* select */);
512dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
513dcb89b3b505522efde173c105a851c412f947178Chong Zhang
514dcb89b3b505522efde173c105a851c412f947178Chong Zhang        case INVOKE_ID_UNSELECT_TRACK:
515dcb89b3b505522efde173c105a851c412f947178Chong Zhang        {
516dcb89b3b505522efde173c105a851c412f947178Chong Zhang            int trackIndex = request.readInt32();
517dcb89b3b505522efde173c105a851c412f947178Chong Zhang            return mPlayer->selectTrack(trackIndex, false /* select */);
518dcb89b3b505522efde173c105a851c412f947178Chong Zhang        }
519dcb89b3b505522efde173c105a851c412f947178Chong Zhang
5207c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih        case INVOKE_ID_GET_SELECTED_TRACK:
5217c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih        {
5227c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih            int32_t type = request.readInt32();
5237c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih            return mPlayer->getSelectedTrack(type, reply);
5247c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih        }
5257c4f0d757bfeedaab4b7ef4ccf5b0a72ec8f4306Robert Shih
5260d268a3cae145afb2720c88ae38fb81550be5584James Dong        default:
5270d268a3cae145afb2720c88ae38fb81550be5584James Dong        {
5280d268a3cae145afb2720c88ae38fb81550be5584James Dong            return INVALID_OPERATION;
5290d268a3cae145afb2720c88ae38fb81550be5584James Dong        }
5300d268a3cae145afb2720c88ae38fb81550be5584James Dong    }
531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
533f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    mPlayer->setAudioSink(audioSink);
535f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    mAudioSink = audioSink;
536f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
537f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
53884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::setParameter(
53984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        int /* key */, const Parcel & /* request */) {
5404f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    return INVALID_OPERATION;
5414f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
5424f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
54384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::getParameter(int /* key */, Parcel * /* reply */) {
5444f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang    return INVALID_OPERATION;
5454f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang}
5464f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang
547f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t NuPlayerDriver::getMetadata(
54884333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        const media::Metadata::Filter& /* ids */, Parcel *records) {
5499575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
5509575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
5519575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    using media::Metadata;
5529575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
5539575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Metadata meta(records);
5549575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
5559575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    meta.appendBool(
5569575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            Metadata::kPauseAvailable,
5579575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE);
5589575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
5599575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    meta.appendBool(
5609575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            Metadata::kSeekBackwardAvailable,
5619575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD);
5629575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
5639575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    meta.appendBool(
5649575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            Metadata::kSeekForwardAvailable,
5659575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD);
5669575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
5679575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    meta.appendBool(
5689575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            Metadata::kSeekAvailable,
5699575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber            mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK);
5709575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
5719575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    return OK;
572f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
573f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
57443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyResetComplete() {
5751aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    Mutex::Autolock autoLock(mLock);
5769575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
5779575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    CHECK_EQ(mState, STATE_RESET_IN_PROGRESS);
5789575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mState = STATE_IDLE;
5791aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber    mCondition.broadcast();
5801aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber}
5811aef211b4e5dc952081727bfd2318b2cb5ca4506Andreas Huber
58213d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhangvoid NuPlayerDriver::notifySetSurfaceComplete() {
58313d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    Mutex::Autolock autoLock(mLock);
58413d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang
58513d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    CHECK(mSetSurfaceInProgress);
58613d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    mSetSurfaceInProgress = false;
58713d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang
58813d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang    mCondition.broadcast();
58913d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang}
59013d6faa02087ce3bb0d4a02b8495f1822f211433Chong Zhang
59143c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyDuration(int64_t durationUs) {
59243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    Mutex::Autolock autoLock(mLock);
59343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    mDurationUs = durationUs;
59443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
59543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
59643c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifyPosition(int64_t positionUs) {
59743c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber    Mutex::Autolock autoLock(mLock);
59873ddd210ea572375198cac1d4960df793745fb4bWei Jia    if (isPlaying()) {
59973ddd210ea572375198cac1d4960df793745fb4bWei Jia        mPositionUs = positionUs;
60073ddd210ea572375198cac1d4960df793745fb4bWei Jia        mNotifyTimeRealUs = ALooper::GetNowUs();
60173ddd210ea572375198cac1d4960df793745fb4bWei Jia    }
60243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
60343c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
60443c3e6ce02215ca99d506458f596cb1211639f29Andreas Hubervoid NuPlayerDriver::notifySeekComplete() {
605eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen    Mutex::Autolock autoLock(mLock);
606eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen    notifySeekComplete_l();
607eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen}
608eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen
609eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissenvoid NuPlayerDriver::notifySeekComplete_l() {
6104b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar    bool wasSeeking = true;
611eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen    if (mState == STATE_STOPPED_AND_PREPARING) {
612eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen        wasSeeking = false;
613eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen        mState = STATE_STOPPED_AND_PREPARED;
614eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen        mCondition.broadcast();
615eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen        if (!mIsAsyncPrepare) {
616eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen            // if we are preparing synchronously, no need to notify listener
6174b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar            return;
6184b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar        }
619eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen    } else if (mState == STATE_STOPPED) {
620eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen        // no need to notify listener
621eb645a0d1820b227af287a5309f017afadbab4e3Marco Nelissen        return;
6224b75b86785d674b98dade17cd197b912d87cd279Lajos Molnar    }
6230560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    notifyListener_l(wasSeeking ? MEDIA_SEEK_COMPLETE : MEDIA_PREPARED);
62443c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber}
62543c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber
6263fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Hubervoid NuPlayerDriver::notifyFrameStats(
6273fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber        int64_t numFramesTotal, int64_t numFramesDropped) {
6283fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    Mutex::Autolock autoLock(mLock);
6293fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    mNumFramesTotal = numFramesTotal;
6303fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    mNumFramesDropped = numFramesDropped;
6313fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber}
6323fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
63384333e0475bc911adc16417f4ca327c975cf6c36Andreas Huberstatus_t NuPlayerDriver::dump(
63484333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber        int fd, const Vector<String16> & /* args */) const {
6353fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    Mutex::Autolock autoLock(mLock);
6363fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
6373fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    FILE *out = fdopen(dup(fd), "w");
6383fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
6393fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    fprintf(out, " NuPlayer\n");
640377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT    fprintf(out, "  numFramesTotal(%" PRId64 "), numFramesDropped(%" PRId64 "), "
6413fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                 "percentageDropped(%.2f)\n",
6423fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                 mNumFramesTotal,
6433fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                 mNumFramesDropped,
6443fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                 mNumFramesTotal == 0
6453fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber                    ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal);
6463fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
6473fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    fclose(out);
6483fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    out = NULL;
6493fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
6503fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber    return OK;
6513fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber}
6523fe62150fa3dd6d25cb84aad80bc9e27ddd16c45Andreas Huber
653dcb89b3b505522efde173c105a851c412f947178Chong Zhangvoid NuPlayerDriver::notifyListener(
654dcb89b3b505522efde173c105a851c412f947178Chong Zhang        int msg, int ext1, int ext2, const Parcel *in) {
6550560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    Mutex::Autolock autoLock(mLock);
6560560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    notifyListener_l(msg, ext1, ext2, in);
6570560195a71ee26e8546075e56c49ff535fcf1767Wei Jia}
6580560195a71ee26e8546075e56c49ff535fcf1767Wei Jia
6590560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::notifyListener_l(
6600560195a71ee26e8546075e56c49ff535fcf1767Wei Jia        int msg, int ext1, int ext2, const Parcel *in) {
661a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar    switch (msg) {
662a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar        case MEDIA_PLAYBACK_COMPLETE:
663a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar        {
66471079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia            if (mState != STATE_RESET_IN_PROGRESS) {
665f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen                if (mLooping || (mAutoLoop
666f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen                        && (mAudioSink == NULL || mAudioSink->realtime()))) {
66771079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia                    mPlayer->seekToAsync(0);
66871079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia                    break;
66971079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia                }
67071079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia
67171079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia                mPlayer->pause();
67271079fc29d93fb49d6022397b6d4168b7fba6e9bWei Jia                mState = STATE_PAUSED;
673a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar            }
674a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar            // fall through
675a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar        }
676a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar
677a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar        case MEDIA_ERROR:
678a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar        {
679a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar            mAtEOS = true;
6800560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            setPauseStartedTimeIfNeeded();
681a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar            break;
682a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar        }
683a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar
684a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar        default:
685a2e14302d4b5ca5443611d0c05218b9da4cc64a6Lajos Molnar            break;
686a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber    }
687a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber
6880560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    mLock.unlock();
689dcb89b3b505522efde173c105a851c412f947178Chong Zhang    sendEvent(msg, ext1, ext2, in);
6900560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    mLock.lock();
691a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber}
692a4af2143ecbd630e946647c1b5f90fda8f61ebb3Andreas Huber
6939575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifySetDataSourceCompleted(status_t err) {
6949575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
6959575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
6969575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING);
6979575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
6989575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mAsyncResult = err;
6999575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE;
7009575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mCondition.broadcast();
7019575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
7029575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
7039575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyPrepareCompleted(status_t err) {
7049575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
7059575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
706b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber    if (mState != STATE_PREPARING) {
707b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber        // We were preparing asynchronously when the client called
708b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber        // reset(), we sent a premature "prepared" notification and
709b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber        // then initiated the reset. This notification is stale.
710b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber        CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE);
711b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber        return;
712b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber    }
713b5f28d4749b898d92fe5e56236b417e37b6fe84fAndreas Huber
7149575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    CHECK_EQ(mState, STATE_PREPARING);
7159575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
7169575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mAsyncResult = err;
7179575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
7189575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    if (err == OK) {
7192a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen        // update state before notifying client, so that if client calls back into NuPlayerDriver
7202a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen        // in response, NuPlayerDriver has the right state
7212a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen        mState = STATE_PREPARED;
722ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber        if (mIsAsyncPrepare) {
7230560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            notifyListener_l(MEDIA_PREPARED);
724ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber        }
7259575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    } else {
7262a79c3274e11b91675a509e16cb3b157df141facMarco Nelissen        mState = STATE_UNPREPARED;
727ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber        if (mIsAsyncPrepare) {
7280560195a71ee26e8546075e56c49ff535fcf1767Wei Jia            notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
729ec0c597cabf169ca646bcea5faac1bd81ed4484dAndreas Huber        }
7309575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    }
7319575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
732f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    sp<MetaData> meta = mPlayer->getFileMeta();
733f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    int32_t loop;
734f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    if (meta != NULL
735f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen            && meta->findInt32(kKeyAutoLoop, &loop) && loop != 0) {
736f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen        mAutoLoop = true;
737f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen    }
738f0b72b509ab1147a2a0925aced970dd68fd7fa4fMarco Nelissen
7399575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mCondition.broadcast();
7409575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
7419575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
7429575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Hubervoid NuPlayerDriver::notifyFlagsChanged(uint32_t flags) {
7439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    Mutex::Autolock autoLock(mLock);
7449575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
7459575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    mPlayerFlags = flags;
7469575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber}
7479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber
7480560195a71ee26e8546075e56c49ff535fcf1767Wei Jiavoid NuPlayerDriver::setPauseStartedTimeIfNeeded() {
7490560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    if (mPauseStartedTimeUs == -1) {
7500560195a71ee26e8546075e56c49ff535fcf1767Wei Jia        mPauseStartedTimeUs = ALooper::GetNowUs();
7510560195a71ee26e8546075e56c49ff535fcf1767Wei Jia    }
7520560195a71ee26e8546075e56c49ff535fcf1767Wei Jia}
7530560195a71ee26e8546075e56c49ff535fcf1767Wei Jia
754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}  // namespace android
755