codec.cpp revision df712ea86e6350f7005a02ab0e1c60c28a343ed0
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 "codec" 195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Log.h> 205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "SimplePlayer.h" 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <binder/ProcessState.h> 245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 255778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 265778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h> 275778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ALooper.h> 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h> 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/DataSource.h> 305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h> 315778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaDefs.h> 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NuMediaExtractor.h> 33df712ea86e6350f7005a02ab0e1c60c28a343ed0Mathias Agopian#include <gui/SurfaceComposerClient.h> 345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 355778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic void usage(const char *me) { 365778822d86b0337407514b9372562b86edfa91cdAndreas Huber fprintf(stderr, "usage: %s [-a] use audio\n" 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber "\t\t[-v] use video\n" 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber "\t\t[-p] playback\n", me); 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber exit(1); 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 435778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 455778822d86b0337407514b9372562b86edfa91cdAndreas Huberstruct CodecState { 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> mCodec; 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > mCSD; 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t mCSDIndex; 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > mInBuffers; 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > mOutBuffers; 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mSawOutputEOS; 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber}; 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 565778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic int decode( 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber const android::sp<android::ALooper> &looper, 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *path, 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool useAudio, 605778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool useVideo) { 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber using namespace android; 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<NuMediaExtractor> extractor = new NuMediaExtractor; 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (extractor->setDataSource(path) != OK) { 655778822d86b0337407514b9372562b86edfa91cdAndreas Huber fprintf(stderr, "unable to instantiate extractor.\n"); 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 1; 675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber KeyedVector<size_t, CodecState> stateByTrack; 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool haveAudio = false; 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool haveVideo = false; 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < extractor->countTracks(); ++i) { 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = extractor->getTrackFormat(i, &format); 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 785778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 795778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(format->findString("mime", &mime)); 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (useAudio && !haveAudio 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber && !strncasecmp(mime.c_str(), "audio/", 6)) { 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber haveAudio = true; 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (useVideo && !haveVideo 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber && !strncasecmp(mime.c_str(), "video/", 6)) { 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber haveVideo = true; 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber continue; 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("selecting track %d", i); 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = extractor->selectTrack(i); 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state = 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber &stateByTrack.editValueAt(stateByTrack.add(i, CodecState())); 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mCodec = MediaCodec::CreateByType( 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber looper, mime.c_str(), false /* encoder */); 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(state->mCodec != NULL); 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = state->mCodec->configure( 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber format, NULL /* surfaceTexture */, 0 /* flags */); 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t j = 0; 110bf6c85a013fb14960bac147c1ffd0a02a8d5f148Andreas Huber sp<ABuffer> buffer; 111bf6c85a013fb14960bac147c1ffd0a02a8d5f148Andreas Huber while (format->findBuffer(StringPrintf("csd-%d", j).c_str(), &buffer)) { 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mCSD.push_back(buffer); 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++j; 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mCSDIndex = 0; 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mSawOutputEOS = false; 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("got %d pieces of codec specific data.", state->mCSD.size()); 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!stateByTrack.isEmpty()); 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < stateByTrack.size(); ++i) { 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state = &stateByTrack.editValueAt(i); 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = state->mCodec; 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ((status_t)OK, codec->start()); 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ((status_t)OK, codec->getInputBuffers(&state->mInBuffers)); 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ((status_t)OK, codec->getOutputBuffers(&state->mOutBuffers)); 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("got %d input and %d output buffers", 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mInBuffers.size(), state->mOutBuffers.size()); 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber while (state->mCSDIndex < state->mCSD.size()) { 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = codec->dequeueInputBuffer(&index); 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == -EAGAIN) { 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber usleep(10000); 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber continue; 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &srcBuffer = 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mCSD.itemAt(state->mCSDIndex++); 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = state->mInBuffers.itemAt(index); 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber memcpy(buffer->data(), srcBuffer->data(), srcBuffer->size()); 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = codec->queueInputBuffer( 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber index, 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0 /* offset */, 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber srcBuffer->size(), 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0ll /* timeUs */, 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber MediaCodec::BUFFER_FLAG_CODECCONFIG); 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sawInputEOS = false; 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (;;) { 1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!sawInputEOS) { 1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t trackIndex; 1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = extractor->getSampleTrackIndex(&trackIndex); 1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("signalling EOS."); 1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < stateByTrack.size(); ++i) { 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state = &stateByTrack.editValueAt(i); 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (;;) { 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = state->mCodec->dequeueInputBuffer(&index); 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == -EAGAIN) { 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber continue; 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = state->mCodec->queueInputBuffer( 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber index, 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0 /* offset */, 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0 /* size */, 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0ll /* timeUs */, 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber MediaCodec::BUFFER_FLAG_EOS); 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sawInputEOS = true; 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state = &stateByTrack.editValueFor(trackIndex); 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = state->mCodec->dequeueInputBuffer(&index); 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("filling input buffer %d", index); 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = state->mInBuffers.itemAt(index); 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = extractor->readSampleData(buffer); 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = extractor->getSampleTime(&timeUs); 2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = state->mCodec->queueInputBuffer( 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber index, 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0 /* offset */, 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->size(), 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeUs, 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0 /* flags */); 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber extractor->advance(); 2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, -EAGAIN); 2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sawOutputEOSOnAllTracks = true; 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < stateByTrack.size(); ++i) { 2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state = &stateByTrack.editValueAt(i); 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!state->mSawOutputEOS) { 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber sawOutputEOSOnAllTracks = false; 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sawOutputEOSOnAllTracks) { 2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < stateByTrack.size(); ++i) { 2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state = &stateByTrack.editValueAt(i); 2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (state->mSawOutputEOS) { 2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber continue; 2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs; 2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = state->mCodec->dequeueOutputBuffer( 2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber &index, &offset, &size, &presentationTimeUs, &flags, 2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10000ll); 2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("draining output buffer %d, time = %lld us", 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber index, presentationTimeUs); 2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = state->mCodec->releaseOutputBuffer(index); 2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, (status_t)OK); 2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & MediaCodec::BUFFER_FLAG_EOS) { 2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("reached EOS on output."); 2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mSawOutputEOS = true; 2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (err == INFO_OUTPUT_BUFFERS_CHANGED) { 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("INFO_OUTPUT_BUFFERS_CHANGED"); 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ((status_t)OK, 2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber state->mCodec->getOutputBuffers(&state->mOutBuffers)); 2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("got %d output buffers", state->mOutBuffers.size()); 2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (err == INFO_FORMAT_CHANGED) { 2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ((status_t)OK, state->mCodec->getOutputFormat(&format)); 2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("INFO_FORMAT_CHANGED: %s", format->debugString().c_str()); 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(err, -EAGAIN); 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < stateByTrack.size(); ++i) { 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber CodecState *state = &stateByTrack.editValueAt(i); 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ((status_t)OK, state->mCodec->stop()); 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huberint main(int argc, char **argv) { 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber using namespace android; 3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *me = argv[0]; 3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool useAudio = false; 3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool useVideo = false; 3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool playback = false; 3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber int res; 3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber while ((res = getopt(argc, argv, "havp")) >= 0) { 3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (res) { 3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber case 'a': 3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber useAudio = true; 3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber case 'v': 3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber useVideo = true; 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber case 'p': 3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber playback = true; 3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber case '?': 3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber case 'h': 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber usage(me); 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber argc -= optind; 3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber argv += optind; 3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (argc != 1) { 3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber usage(me); 3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!useAudio && !useVideo) { 3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber useAudio = useVideo = true; 3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber ProcessState::self()->startThreadPool(); 3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber DataSource::RegisterDefaultSniffers(); 3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<ALooper> looper = new ALooper; 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber looper->start(); 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (playback) { 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient; 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(composerClient->initCheck(), (status_t)OK); 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t displayWidth = composerClient->getDisplayWidth(0); 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t displayHeight = composerClient->getDisplayHeight(0); 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("display is %ld x %ld\n", displayWidth, displayHeight); 3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<SurfaceControl> control = 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber composerClient->createSurface( 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber String8("A Surface"), 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0, 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber displayWidth, 3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber displayHeight, 3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber PIXEL_FORMAT_RGB_565, 3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0); 3785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3795778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(control != NULL); 3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(control->isValid()); 3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber SurfaceComposerClient::openGlobalTransaction(); 3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK); 3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(control->show(), (status_t)OK); 3855778822d86b0337407514b9372562b86edfa91cdAndreas Huber SurfaceComposerClient::closeGlobalTransaction(); 3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<Surface> surface = control->getSurface(); 3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(surface != NULL); 3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<SimplePlayer> player = new SimplePlayer; 3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber looper->registerHandler(player); 3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber player->setDataSource(argv[0]); 3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber player->setSurface(surface->getSurfaceTexture()); 3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber player->start(); 396e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber sleep(60); 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber player->stop(); 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber player->reset(); 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber composerClient->dispose(); 4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber decode(looper, argv[0], useAudio, useVideo); 4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber looper->stop(); 4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 409