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