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