SimplePlayer.cpp revision 2d8bedd05437b6fccdbc6bf70f673ffd86744d59
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/*
25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright (C) 2012 The Android Open Source Project
35778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License.
65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at
75778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
85778822d86b0337407514b9372562b86edfa91cdAndreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
95778822d86b0337407514b9372562b86edfa91cdAndreas Huber *
105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software
115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and
145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License.
155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */
165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
175778822d86b0337407514b9372562b86edfa91cdAndreas Huber//#define LOG_NDEBUG 0
185778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define LOG_TAG "SimplePlayer"
195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Log.h>
205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "SimplePlayer.h"
225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <gui/SurfaceTextureClient.h>
245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/AudioTrack.h>
255778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h>
265778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h>
275778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h>
285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h>
295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h>
305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h>
315778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NuMediaExtractor.h>
325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
335778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
355778822d86b0337407514b9372562b86edfa91cdAndreas HuberSimplePlayer::SimplePlayer()
365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    : mState(UNINITIALIZED),
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDoMoreStuffGeneration(0),
385778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mStartTimeRealUs(-1ll) {
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
415778822d86b0337407514b9372562b86edfa91cdAndreas HuberSimplePlayer::~SimplePlayer() {
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
455778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t PostAndAwaitResponse(
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &msg, sp<AMessage> *response) {
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = msg->postAndAwaitResponse(response);
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!(*response)->findInt32("err", &err)) {
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = OK;
555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return err;
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
595778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::setDataSource(const char *path) {
605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetDataSource, id());
615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setString("path", path);
625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
665778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::setSurface(const sp<ISurfaceTexture> &surfaceTexture) {
675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetSurface, id());
685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<SurfaceTextureClient> surfaceTextureClient;
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (surfaceTexture != NULL) {
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        surfaceTextureClient = new SurfaceTextureClient(surfaceTexture);
725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setObject(
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            "native-window", new NativeWindowWrapper(surfaceTextureClient));
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
795778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
815778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::prepare() {
825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatPrepare, id());
835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
855778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
875778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::start() {
885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStart, id());
895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
935778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::stop() {
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStop, id());
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
995778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::reset() {
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReset, id());
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1055778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid SimplePlayer::onMessageReceived(const sp<AMessage> &msg) {
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    switch (msg->what()) {
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatSetDataSource:
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err;
1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNINITIALIZED) {
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = INVALID_OPERATION;
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK(msg->findString("path", &mPath));
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mState = UNPREPARED;
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatSetSurface:
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err;
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNPREPARED) {
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = INVALID_OPERATION;
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<RefBase> obj;
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK(msg->findObject("native-window", &obj));
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get());
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = OK;
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatPrepare:
1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err;
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNPREPARED) {
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = INVALID_OPERATION;
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = onPrepare();
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (err == OK) {
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mState = STOPPED;
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStart:
1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = OK;
1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState == UNPREPARED) {
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = onPrepare();
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (err == OK) {
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mState = STOPPED;
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (err == OK) {
1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (mState != STOPPED) {
1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    err = INVALID_OPERATION;
1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                } else {
1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    err = onStart();
1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (err == OK) {
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mState = STARTED;
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStop:
2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err;
2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED) {
2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = INVALID_OPERATION;
2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = onStop();
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (err == OK) {
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mState = STOPPED;
2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatReset:
2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = OK;
2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState == STARTED) {
2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK_EQ(onStop(), (status_t)OK);
2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mState = STOPPED;
2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState == STOPPED) {
2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = onReset();
2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mState = UNINITIALIZED;
2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
2495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDoMoreStuff:
2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDoMoreStuffGeneration) {
2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onDoMoreStuff();
2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (err == OK) {
2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                msg->post(5000ll);
2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        default:
2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            TRESPASS();
2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2725778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onPrepare() {
2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, UNPREPARED);
2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mExtractor = new NuMediaExtractor;
2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = mExtractor->setDataSource(mPath.c_str());
2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mExtractor.clear();
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mCodecLooper == NULL) {
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper = new ALooper;
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper->start();
2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool haveAudio = false;
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool haveVideo = false;
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mExtractor->countTracks(); ++i) {
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> format;
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        status_t err = mExtractor->getTrackFormat(i, &format);
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        AString mime;
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(format->findString("mime", &mime));
2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (!haveAudio && !strncasecmp(mime.c_str(), "audio/", 6)) {
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            haveAudio = true;
3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber        } else if (!haveVideo && !strncasecmp(mime.c_str(), "video/", 6)) {
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber            haveVideo = true;
3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        } else {
3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            continue;
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = mExtractor->selectTrack(i);
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state =
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            &mStateByTrackIndex.editValueAt(
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mStateByTrackIndex.add(i, CodecState()));
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mNumFramesWritten = 0;
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mCodec = MediaCodec::CreateByType(
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mCodecLooper, mime.c_str(), false /* encoder */);
3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(state->mCodec != NULL);
3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = state->mCodec->configure(
3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format, mNativeWindow->getSurfaceTextureClient(),
3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                0 /* flags */);
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t j = 0;
3272d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        sp<ABuffer> buffer;
3282d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        while (format->findBuffer(StringPrintf("csd-%d", j).c_str(), &buffer)) {
3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber            state->mCSD.push_back(buffer);
3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            ++j;
3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &mStateByTrackIndex.editValueAt(i);
3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        status_t err = state->mCodec->start();
3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = state->mCodec->getInputBuffers(&state->mBuffers[0]);
3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = state->mCodec->getOutputBuffers(&state->mBuffers[1]);
3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        for (size_t j = 0; j < state->mCSD.size(); ++j) {
3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ABuffer> &srcBuffer = state->mCSD.itemAt(j);
3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index;
3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = state->mCodec->dequeueInputBuffer(&index, -1ll);
3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ABuffer> &dstBuffer = state->mBuffers[0].itemAt(index);
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_LE(srcBuffer->size(), dstBuffer->capacity());
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            dstBuffer->setRange(0, srcBuffer->size());
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            memcpy(dstBuffer->data(), srcBuffer->data(), srcBuffer->size());
3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = state->mCodec->queueInputBuffer(
3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    index,
3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0,
3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    dstBuffer->size(),
3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0ll,
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    MediaCodec::BUFFER_FLAG_CODECCONFIG);
3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3735778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onStart() {
3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, STOPPED);
3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mStartTimeRealUs = -1ll;
3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDoMoreStuff, id());
3795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("generation", ++mDoMoreStuffGeneration);
3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->post();
3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3855778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onStop() {
3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, STARTED);
3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ++mDoMoreStuffGeneration;
3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3935778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onReset() {
3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, STOPPED);
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &mStateByTrackIndex.editValueAt(i);
3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(state->mCodec->stop(), (status_t)OK);
4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mStartTimeRealUs = -1ll;
4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mStateByTrackIndex.clear();
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mCodecLooper.clear();
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mExtractor.clear();
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mNativeWindow.clear();
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mPath.clear();
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4135778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onDoMoreStuff() {
4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &mStateByTrackIndex.editValueAt(i);
4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t index;
4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        status_t err = state->mCodec->dequeueInputBuffer(&index);
4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (err == OK) {
4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            state->mAvailInputBufferIndices.push_back(index);
4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo info;
4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = state->mCodec->dequeueOutputBuffer(
4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                &info.mIndex,
4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                &info.mOffset,
4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                &info.mSize,
4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                &info.mPresentationTimeUs,
4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                &info.mFlags);
4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (err == OK) {
4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            state->mAvailOutputBufferInfos.push_back(info);
4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber        } else if (err == INFO_FORMAT_CHANGED) {
4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = onOutputFormatChanged(mStateByTrackIndex.keyAt(i), state);
4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        } else if (err == INFO_OUTPUT_BUFFERS_CHANGED) {
4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = state->mCodec->getOutputBuffers(&state->mBuffers[1]);
4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (;;) {
4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t trackIndex;
4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        status_t err = mExtractor->getSampleTrackIndex(&trackIndex);
4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (err != OK) {
4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            ALOGI("encountered input EOS.");
4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        } else {
4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CodecState *state = &mStateByTrackIndex.editValueFor(trackIndex);
4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (state->mAvailInputBufferIndices.empty()) {
4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index = *state->mAvailInputBufferIndices.begin();
4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            state->mAvailInputBufferIndices.erase(
4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    state->mAvailInputBufferIndices.begin());
4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ABuffer> &dstBuffer =
4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                state->mBuffers[0].itemAt(index);
4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = mExtractor->readSampleData(dstBuffer);
4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeUs;
4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(mExtractor->getSampleTime(&timeUs), (status_t)OK);
4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = state->mCodec->queueInputBuffer(
4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    index,
4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    dstBuffer->offset(),
4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    dstBuffer->size(),
4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    timeUs,
4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0);
4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = mExtractor->advance();
4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t nowUs = ALooper::GetNowUs();
4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mStartTimeRealUs < 0ll) {
4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mStartTimeRealUs = nowUs + 1000000ll;
4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &mStateByTrackIndex.editValueAt(i);
4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber        while (!state->mAvailOutputBufferInfos.empty()) {
4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            BufferInfo *info = &*state->mAvailOutputBufferInfos.begin();
4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t whenRealUs = info->mPresentationTimeUs + mStartTimeRealUs;
4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t lateByUs = nowUs - whenRealUs;
4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (lateByUs > -10000ll) {
4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                bool release = true;
5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (lateByUs > 30000ll) {
5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGI("track %d buffer late by %lld us, dropping.",
5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          i, lateByUs);
5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    state->mCodec->releaseOutputBuffer(info->mIndex);
5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                } else {
5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (state->mAudioTrack != NULL) {
5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        const sp<ABuffer> &srcBuffer =
5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            state->mBuffers[1].itemAt(info->mIndex);
5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        renderAudio(state, info, srcBuffer);
5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (info->mSize > 0) {
5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            release = false;
5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (release) {
5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        state->mCodec->renderOutputBufferAndRelease(
5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                info->mIndex);
5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (release) {
5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    state->mAvailOutputBufferInfos.erase(
5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            state->mAvailOutputBufferInfos.begin());
5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    info = NULL;
5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                } else {
5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("track %d buffer early by %lld us.", i, -lateByUs);
5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5415778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onOutputFormatChanged(
5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t trackIndex, CodecState *state) {
5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> format;
5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = state->mCodec->getOutputFormat(&format);
5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    AString mime;
5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(format->findString("mime", &mime));
5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!strncasecmp(mime.c_str(), "audio/", 6)) {
5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t channelCount;
5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t sampleRate;
5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(format->findInt32("channel-count", &channelCount));
5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(format->findInt32("sample-rate", &sampleRate));
5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mAudioTrack = new AudioTrack(
5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                AUDIO_STREAM_MUSIC,
5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sampleRate,
5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                AUDIO_FORMAT_PCM_16_BIT,
5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                (channelCount == 1)
5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ? AUDIO_CHANNEL_OUT_MONO : AUDIO_CHANNEL_OUT_STEREO,
5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                0);
5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mNumFramesWritten = 0;
5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5735778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid SimplePlayer::renderAudio(
5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state, BufferInfo *info, const sp<ABuffer> &buffer) {
5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(state->mAudioTrack != NULL);
5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (state->mAudioTrack->stopped()) {
5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mAudioTrack->start();
5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t numFramesPlayed;
5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(state->mAudioTrack->getPosition(&numFramesPlayed), (status_t)OK);
5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t numFramesAvailableToWrite =
5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mAudioTrack->frameCount()
5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            - (state->mNumFramesWritten - numFramesPlayed);
5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t numBytesAvailableToWrite =
5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        numFramesAvailableToWrite * state->mAudioTrack->frameSize();
5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t copy = info->mSize;
5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (copy > numBytesAvailableToWrite) {
5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        copy = numBytesAvailableToWrite;
5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (copy == 0) {
5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return;
5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t startTimeUs = ALooper::GetNowUs();
6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t nbytes = state->mAudioTrack->write(
6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            buffer->base() + info->mOffset, copy);
6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(nbytes, (ssize_t)copy);
6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t delayUs = ALooper::GetNowUs() - startTimeUs;
6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t numFramesWritten = nbytes / state->mAudioTrack->frameSize();
6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (delayUs > 2000ll) {
6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ALOGW("AudioTrack::write took %lld us, numFramesAvailableToWrite=%u, "
6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber              "numFramesWritten=%u",
6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber              delayUs, numFramesAvailableToWrite, numFramesWritten);
6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOffset += nbytes;
6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mSize -= nbytes;
6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    state->mNumFramesWritten += numFramesWritten;
6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
624