SimplePlayer.cpp revision 4cf1bdef135d6ebf6ccd404aacc8917f9887a07a
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/* 25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright (C) 2012 The Android Open Source Project 35778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License. 65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at 75778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 85778822d86b0337407514b9372562b86edfa91cdAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software 115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and 145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License. 155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */ 165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 175778822d86b0337407514b9372562b86edfa91cdAndreas Huber//#define LOG_NDEBUG 0 185778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define LOG_TAG "SimplePlayer" 195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Log.h> 205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "SimplePlayer.h" 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <gui/SurfaceTextureClient.h> 245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/AudioTrack.h> 251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber#include <media/ICrypto.h> 265778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 275778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h> 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h> 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h> 305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h> 315778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h> 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NuMediaExtractor.h> 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 345778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 365778822d86b0337407514b9372562b86edfa91cdAndreas HuberSimplePlayer::SimplePlayer() 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber : mState(UNINITIALIZED), 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDoMoreStuffGeneration(0), 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mStartTimeRealUs(-1ll) { 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 425778822d86b0337407514b9372562b86edfa91cdAndreas HuberSimplePlayer::~SimplePlayer() { 435778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 465778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t PostAndAwaitResponse( 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response) { 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = msg->postAndAwaitResponse(response); 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!(*response)->findInt32("err", &err)) { 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = OK; 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 605778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::setDataSource(const char *path) { 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetDataSource, id()); 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setString("path", path); 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 655778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 675778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::setSurface(const sp<ISurfaceTexture> &surfaceTexture) { 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetSurface, id()); 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<SurfaceTextureClient> surfaceTextureClient; 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (surfaceTexture != NULL) { 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber surfaceTextureClient = new SurfaceTextureClient(surfaceTexture); 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setObject( 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber "native-window", new NativeWindowWrapper(surfaceTextureClient)); 775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 785778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::prepare() { 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatPrepare, id()); 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 885778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::start() { 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStart, id()); 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 945778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::stop() { 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStop, id()); 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::reset() { 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReset, id()); 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1065778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid SimplePlayer::onMessageReceived(const sp<AMessage> &msg) { 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatSetDataSource: 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("path", &mPath)); 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = UNPREPARED; 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatSetSurface: 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNPREPARED) { 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<RefBase> obj; 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findObject("native-window", &obj)); 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNativeWindow = static_cast<NativeWindowWrapper *>(obj.get()); 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = OK; 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatPrepare: 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNPREPARED) { 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = onPrepare(); 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = STOPPED; 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = OK; 1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == UNPREPARED) { 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = onPrepare(); 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = STOPPED; 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STOPPED) { 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = onStart(); 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = STARTED; 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED) { 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = onStop(); 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = STOPPED; 2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReset: 2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = OK; 2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTED) { 2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(onStop(), (status_t)OK); 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = STOPPED; 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STOPPED) { 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = onReset(); 2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = UNINITIALIZED; 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 2495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDoMoreStuff: 2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDoMoreStuffGeneration) { 2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onDoMoreStuff(); 2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 263e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber msg->post(10000ll); 2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2735778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onPrepare() { 2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, UNPREPARED); 2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mExtractor = new NuMediaExtractor; 2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mExtractor->setDataSource(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, 3254cf1bdef135d6ebf6ccd404aacc8917f9887a07aAndreas Huber isVideo ? mNativeWindow->getSurfaceTextureClient() : 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; 3332d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber while (format->findBuffer(StringPrintf("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 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &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 3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDoMoreStuff, id()); 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(); 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNativeWindow.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) { 429e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber ALOGV("dequeued input buffer on track %d", 430e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber mStateByTrackIndex.keyAt(i)); 4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 432e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber state->mAvailInputBufferIndices.push_back(index); 433e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber } else { 434e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber ALOGV("dequeueInputBuffer on track %d 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) { 449e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber ALOGV("dequeued output buffer on track %d", 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 { 460e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber ALOGV("dequeueOutputBuffer on track %d 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 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &dstBuffer = 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mBuffers[0].itemAt(index); 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mExtractor->readSampleData(dstBuffer); 4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mExtractor->getSampleTime(&timeUs), (status_t)OK); 4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = state->mCodec->queueInputBuffer( 4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber index, 4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffer->offset(), 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffer->size(), 4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeUs, 5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0); 5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 503e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber ALOGV("enqueued input data on track %d", trackIndex); 504e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber 5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mExtractor->advance(); 5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t nowUs = ALooper::GetNowUs(); 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mStartTimeRealUs < 0ll) { 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mStartTimeRealUs = nowUs + 1000000ll; 5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mStateByTrackIndex.size(); ++i) { 5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state = &mStateByTrackIndex.editValueAt(i); 5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber while (!state->mAvailOutputBufferInfos.empty()) { 5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &*state->mAvailOutputBufferInfos.begin(); 5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t whenRealUs = info->mPresentationTimeUs + mStartTimeRealUs; 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t lateByUs = nowUs - whenRealUs; 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (lateByUs > -10000ll) { 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool release = true; 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (lateByUs > 30000ll) { 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGI("track %d buffer late by %lld us, dropping.", 530e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber mStateByTrackIndex.keyAt(i), lateByUs); 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mCodec->releaseOutputBuffer(info->mIndex); 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (state->mAudioTrack != NULL) { 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &srcBuffer = 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mBuffers[1].itemAt(info->mIndex); 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber renderAudio(state, info, srcBuffer); 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mSize > 0) { 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber release = false; 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (release) { 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mCodec->renderOutputBufferAndRelease( 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mIndex); 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (release) { 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mAvailOutputBufferInfos.erase( 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mAvailOutputBufferInfos.begin()); 5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber info = NULL; 5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 559e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber ALOGV("track %d buffer early by %lld us.", 560e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber mStateByTrackIndex.keyAt(i), -lateByUs); 5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t SimplePlayer::onOutputFormatChanged( 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t trackIndex, CodecState *state) { 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = state->mCodec->getOutputFormat(&format); 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(format->findString("mime", &mime)); 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp(mime.c_str(), "audio/", 6)) { 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t channelCount; 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t sampleRate; 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(format->findInt32("channel-count", &channelCount)); 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(format->findInt32("sample-rate", &sampleRate)); 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mAudioTrack = new AudioTrack( 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber AUDIO_STREAM_MUSIC, 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleRate, 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber AUDIO_FORMAT_PCM_16_BIT, 591ab334fd351ae5a0e18903da123d63e565b536874Glenn Kasten audio_channel_out_mask_from_count(channelCount), 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0); 5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mNumFramesWritten = 0; 5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6005778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid SimplePlayer::renderAudio( 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state, BufferInfo *info, const sp<ABuffer> &buffer) { 6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(state->mAudioTrack != NULL); 6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (state->mAudioTrack->stopped()) { 6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mAudioTrack->start(); 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t numFramesPlayed; 6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(state->mAudioTrack->getPosition(&numFramesPlayed), (status_t)OK); 6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t numFramesAvailableToWrite = 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mAudioTrack->frameCount() 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber - (state->mNumFramesWritten - numFramesPlayed); 6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t numBytesAvailableToWrite = 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber numFramesAvailableToWrite * state->mAudioTrack->frameSize(); 6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t copy = info->mSize; 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (copy > numBytesAvailableToWrite) { 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber copy = numBytesAvailableToWrite; 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (copy == 0) { 6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return; 6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t startTimeUs = ALooper::GetNowUs(); 6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t nbytes = state->mAudioTrack->write( 6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->base() + info->mOffset, copy); 6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(nbytes, (ssize_t)copy); 6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t delayUs = ALooper::GetNowUs() - startTimeUs; 6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t numFramesWritten = nbytes / state->mAudioTrack->frameSize(); 6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (delayUs > 2000ll) { 6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGW("AudioTrack::write took %lld us, numFramesAvailableToWrite=%u, " 6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber "numFramesWritten=%u", 6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber delayUs, numFramesAvailableToWrite, numFramesWritten); 6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOffset += nbytes; 6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mSize -= nbytes; 6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mNumFramesWritten += numFramesWritten; 6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 651