SimplePlayer.cpp revision 7e34bf5af26f8752d4786d3098740cdf51e2438f
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
231a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h>
2431de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar
255778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/AudioTrack.h>
261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber#include <media/ICrypto.h>
271b86fe063badb5f28c467ade39be0f4008688947Andreas Huber#include <media/IMediaHTTPService.h>
287e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim#include <media/MediaCodecBuffer.h>
295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h>
305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h>
315778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h>
325778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h>
335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h>
345778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NuMediaExtractor.h>
355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
365778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
385778822d86b0337407514b9372562b86edfa91cdAndreas HuberSimplePlayer::SimplePlayer()
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    : mState(UNINITIALIZED),
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDoMoreStuffGeneration(0),
415778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mStartTimeRealUs(-1ll) {
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
445778822d86b0337407514b9372562b86edfa91cdAndreas HuberSimplePlayer::~SimplePlayer() {
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
485778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t PostAndAwaitResponse(
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &msg, sp<AMessage> *response) {
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = msg->postAndAwaitResponse(response);
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!(*response)->findInt32("err", &err)) {
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = OK;
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return err;
615778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
625778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::setDataSource(const char *path) {
631d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatSetDataSource, this);
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setString("path", path);
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
675778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
698ba01021b573889802e67e029225a96f0dfa471aAndy McFaddenstatus_t SimplePlayer::setSurface(const sp<IGraphicBufferProducer> &bufferProducer) {
701d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatSetSurface, this);
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
721a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian    sp<Surface> surface;
738ba01021b573889802e67e029225a96f0dfa471aAndy McFadden    if (bufferProducer != NULL) {
741a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        surface = new Surface(bufferProducer);
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
771de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar    msg->setObject("surface", surface);
785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
815778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
835778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::prepare() {
841d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatPrepare, this);
855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
875778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
895778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::start() {
901d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatStart, this);
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
955778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::stop() {
961d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatStop, this);
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::reset() {
1021d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatReset, this);
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1075778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid SimplePlayer::onMessageReceived(const sp<AMessage> &msg) {
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    switch (msg->what()) {
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatSetDataSource:
1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err;
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNINITIALIZED) {
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = INVALID_OPERATION;
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK(msg->findString("path", &mPath));
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mState = UNPREPARED;
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1193f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar            sp<AReplyToken> replyID;
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatSetSurface:
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err;
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNPREPARED) {
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = INVALID_OPERATION;
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<RefBase> obj;
1351de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar                CHECK(msg->findObject("surface", &obj));
1361de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar                mSurface = static_cast<Surface *>(obj.get());
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = OK;
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1403f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar            sp<AReplyToken> 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
1623f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar            sp<AReplyToken> 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
1953f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar            sp<AReplyToken> 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
2183f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar            sp<AReplyToken> 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
2413f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar            sp<AReplyToken> 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) {
262e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                msg->post(10000ll);
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
2771b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    status_t err = mExtractor->setDataSource(
2781b86fe063badb5f28c467ade39be0f4008688947Andreas Huber            NULL /* httpService */, mPath.c_str());
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mExtractor.clear();
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mCodecLooper == NULL) {
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper = new ALooper;
2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper->start();
2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool haveAudio = false;
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool haveVideo = false;
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mExtractor->countTracks(); ++i) {
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> format;
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        status_t err = mExtractor->getTrackFormat(i, &format);
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        AString mime;
2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(format->findString("mime", &mime));
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3004cf1bdef135d6ebf6ccd404aacc8917f9887a07aAndreas Huber        bool isVideo = !strncasecmp(mime.c_str(), "video/", 6);
3014cf1bdef135d6ebf6ccd404aacc8917f9887a07aAndreas Huber
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (!haveAudio && !strncasecmp(mime.c_str(), "audio/", 6)) {
3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            haveAudio = true;
3044cf1bdef135d6ebf6ccd404aacc8917f9887a07aAndreas Huber        } else if (!haveVideo && isVideo) {
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber            haveVideo = true;
3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        } else {
3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            continue;
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = mExtractor->selectTrack(i);
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state =
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            &mStateByTrackIndex.editValueAt(
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mStateByTrackIndex.add(i, CodecState()));
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mNumFramesWritten = 0;
3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mCodec = MediaCodec::CreateByType(
3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                mCodecLooper, mime.c_str(), false /* encoder */);
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(state->mCodec != NULL);
3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = state->mCodec->configure(
3241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                format,
3251de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar                isVideo ? mSurface : NULL,
3261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                NULL /* crypto */,
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                0 /* flags */);
3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t j = 0;
3322d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber        sp<ABuffer> buffer;
333a1e8944a21e5833b7aadc451776f11797f5f9273Elliott Hughes        while (format->findBuffer(AStringPrintf("csd-%d", j).c_str(), &buffer)) {
3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            state->mCSD.push_back(buffer);
3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            ++j;
3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &mStateByTrackIndex.editValueAt(i);
3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        status_t err = state->mCodec->start();
3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = state->mCodec->getInputBuffers(&state->mBuffers[0]);
3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = state->mCodec->getOutputBuffers(&state->mBuffers[1]);
3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(err, (status_t)OK);
3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        for (size_t j = 0; j < state->mCSD.size(); ++j) {
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ABuffer> &srcBuffer = state->mCSD.itemAt(j);
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index;
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = state->mCodec->dequeueInputBuffer(&index, -1ll);
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3597e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim            const sp<MediaCodecBuffer> &dstBuffer = state->mBuffers[0].itemAt(index);
3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_LE(srcBuffer->size(), dstBuffer->capacity());
3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            dstBuffer->setRange(0, srcBuffer->size());
3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            memcpy(dstBuffer->data(), srcBuffer->data(), srcBuffer->size());
3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = state->mCodec->queueInputBuffer(
3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    index,
3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0,
3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    dstBuffer->size(),
3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0ll,
3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    MediaCodec::BUFFER_FLAG_CODECCONFIG);
3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onStart() {
3795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, STOPPED);
3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mStartTimeRealUs = -1ll;
3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3831d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatDoMoreStuff, this);
3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("generation", ++mDoMoreStuffGeneration);
3855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->post();
3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3905778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onStop() {
3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, STARTED);
3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ++mDoMoreStuffGeneration;
3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3985778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onReset() {
3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, STOPPED);
4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &mStateByTrackIndex.editValueAt(i);
4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
404c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        CHECK_EQ(state->mCodec->release(), (status_t)OK);
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mStartTimeRealUs = -1ll;
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mStateByTrackIndex.clear();
4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mCodecLooper.clear();
4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mExtractor.clear();
4121de1e25cba872bd4c077c2e394f8ca9c70b65856Lajos Molnar    mSurface.clear();
4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mPath.clear();
4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4185778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onDoMoreStuff() {
419e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber    ALOGV("onDoMoreStuff");
4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &mStateByTrackIndex.editValueAt(i);
4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
423e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber        status_t err;
424e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber        do {
425e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            size_t index;
426e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            err = state->mCodec->dequeueInputBuffer(&index);
4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
428e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            if (err == OK) {
42931de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar                ALOGV("dequeued input buffer on track %zu",
430e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                      mStateByTrackIndex.keyAt(i));
4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
432e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                state->mAvailInputBufferIndices.push_back(index);
433e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            } else {
43431de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar                ALOGV("dequeueInputBuffer on track %zu returned %d",
435e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                      mStateByTrackIndex.keyAt(i), err);
436e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            }
437e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber        } while (err == OK);
438e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber
439e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber        do {
440e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            BufferInfo info;
441e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            err = state->mCodec->dequeueOutputBuffer(
442e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                    &info.mIndex,
443e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                    &info.mOffset,
444e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                    &info.mSize,
445e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                    &info.mPresentationTimeUs,
446e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                    &info.mFlags);
447e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber
448e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            if (err == OK) {
44931de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar                ALOGV("dequeued output buffer on track %zu",
450e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                      mStateByTrackIndex.keyAt(i));
451e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber
452e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                state->mAvailOutputBufferInfos.push_back(info);
453e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            } else if (err == INFO_FORMAT_CHANGED) {
454e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                err = onOutputFormatChanged(mStateByTrackIndex.keyAt(i), state);
455e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                CHECK_EQ(err, (status_t)OK);
456e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            } else if (err == INFO_OUTPUT_BUFFERS_CHANGED) {
457e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                err = state->mCodec->getOutputBuffers(&state->mBuffers[1]);
458e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                CHECK_EQ(err, (status_t)OK);
459e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            } else {
46031de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar                ALOGV("dequeueOutputBuffer on track %zu returned %d",
461e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                      mStateByTrackIndex.keyAt(i), err);
462e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber            }
463e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber        } while (err == OK
464e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                || err == INFO_FORMAT_CHANGED
465e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber                || err == INFO_OUTPUT_BUFFERS_CHANGED);
4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (;;) {
4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t trackIndex;
4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        status_t err = mExtractor->getSampleTrackIndex(&trackIndex);
4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (err != OK) {
4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            ALOGI("encountered input EOS.");
4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        } else {
4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CodecState *state = &mStateByTrackIndex.editValueFor(trackIndex);
4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (state->mAvailInputBufferIndices.empty()) {
4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index = *state->mAvailInputBufferIndices.begin();
4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            state->mAvailInputBufferIndices.erase(
4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    state->mAvailInputBufferIndices.begin());
4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4867e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim            const sp<MediaCodecBuffer> &dstBuffer =
4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                state->mBuffers[0].itemAt(index);
4887e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim            sp<ABuffer> abuffer = new ABuffer(dstBuffer->base(), dstBuffer->capacity());
4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4907e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim            err = mExtractor->readSampleData(abuffer);
4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
4927e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim            dstBuffer->setRange(abuffer->offset(), abuffer->size());
4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeUs;
4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(mExtractor->getSampleTime(&timeUs), (status_t)OK);
4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = state->mCodec->queueInputBuffer(
4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    index,
4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    dstBuffer->offset(),
5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    dstBuffer->size(),
5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    timeUs,
5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0);
5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
50531de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar            ALOGV("enqueued input data on track %zu", trackIndex);
506e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber
5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = mExtractor->advance();
5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t nowUs = ALooper::GetNowUs();
5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mStartTimeRealUs < 0ll) {
5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mStartTimeRealUs = nowUs + 1000000ll;
5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) {
5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &mStateByTrackIndex.editValueAt(i);
5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        while (!state->mAvailOutputBufferInfos.empty()) {
5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            BufferInfo *info = &*state->mAvailOutputBufferInfos.begin();
5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t whenRealUs = info->mPresentationTimeUs + mStartTimeRealUs;
5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t lateByUs = nowUs - whenRealUs;
5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (lateByUs > -10000ll) {
5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                bool release = true;
5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (lateByUs > 30000ll) {
53131de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar                    ALOGI("track %zu buffer late by %lld us, dropping.",
53231de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar                          mStateByTrackIndex.keyAt(i), (long long)lateByUs);
5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    state->mCodec->releaseOutputBuffer(info->mIndex);
5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                } else {
5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (state->mAudioTrack != NULL) {
5367e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim                        const sp<MediaCodecBuffer> &srcBuffer =
5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            state->mBuffers[1].itemAt(info->mIndex);
5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        renderAudio(state, info, srcBuffer);
5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (info->mSize > 0) {
5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            release = false;
5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (release) {
5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        state->mCodec->renderOutputBufferAndRelease(
5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                info->mIndex);
5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (release) {
5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    state->mAvailOutputBufferInfos.erase(
5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            state->mAvailOutputBufferInfos.begin());
5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    info = NULL;
5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                } else {
5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
56131de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar                ALOGV("track %zu buffer early by %lld us.",
56231de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar                      mStateByTrackIndex.keyAt(i), (long long)-lateByUs);
5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5715778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onOutputFormatChanged(
57231de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar        size_t trackIndex __unused, CodecState *state) {
5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> format;
5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = state->mCodec->getOutputFormat(&format);
5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    AString mime;
5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(format->findString("mime", &mime));
5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!strncasecmp(mime.c_str(), "audio/", 6)) {
5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t channelCount;
5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t sampleRate;
5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(format->findInt32("channel-count", &channelCount));
5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(format->findInt32("sample-rate", &sampleRate));
5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mAudioTrack = new AudioTrack(
5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                AUDIO_STREAM_MUSIC,
5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sampleRate,
5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                AUDIO_FORMAT_PCM_16_BIT,
593ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten                audio_channel_out_mask_from_count(channelCount),
5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                0);
5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mNumFramesWritten = 0;
5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6025778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid SimplePlayer::renderAudio(
6037e34bf5af26f8752d4786d3098740cdf51e2438fWonsik Kim        CodecState *state, BufferInfo *info, const sp<MediaCodecBuffer> &buffer) {
6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(state->mAudioTrack != NULL);
6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (state->mAudioTrack->stopped()) {
6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mAudioTrack->start();
6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t numFramesPlayed;
6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(state->mAudioTrack->getPosition(&numFramesPlayed), (status_t)OK);
6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t numFramesAvailableToWrite =
6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mAudioTrack->frameCount()
6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber            - (state->mNumFramesWritten - numFramesPlayed);
6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t numBytesAvailableToWrite =
6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        numFramesAvailableToWrite * state->mAudioTrack->frameSize();
6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t copy = info->mSize;
6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (copy > numBytesAvailableToWrite) {
6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber        copy = numBytesAvailableToWrite;
6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (copy == 0) {
6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return;
6275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t startTimeUs = ALooper::GetNowUs();
6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t nbytes = state->mAudioTrack->write(
6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            buffer->base() + info->mOffset, copy);
6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(nbytes, (ssize_t)copy);
6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t delayUs = ALooper::GetNowUs() - startTimeUs;
6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t numFramesWritten = nbytes / state->mAudioTrack->frameSize();
6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (delayUs > 2000ll) {
6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ALOGW("AudioTrack::write took %lld us, numFramesAvailableToWrite=%u, "
6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber              "numFramesWritten=%u",
64331de88566257d5546cf4eee9064d96926a4b0c24Lajos Molnar              (long long)delayUs, numFramesAvailableToWrite, numFramesWritten);
6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOffset += nbytes;
6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mSize -= nbytes;
6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    state->mNumFramesWritten += numFramesWritten;
6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
653