codec.cpp revision e98f8c04faf27df3b1829d336299ad51dad569cf
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>
335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <surfaceflinger/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;
1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<RefBase> obj;
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber        while (format->findObject(StringPrintf("csd-%d", j).c_str(), &obj)) {
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber            state->mCSD.push_back(buffer);
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber            ++j;
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mCSDIndex = 0;
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        state->mSawOutputEOS = false;
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ALOGV("got %d pieces of codec specific data.", state->mCSD.size());
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(!stateByTrack.isEmpty());
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < stateByTrack.size(); ++i) {
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &stateByTrack.editValueAt(i);
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<MediaCodec> codec = state->mCodec;
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ((status_t)OK, codec->start());
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ((status_t)OK, codec->getInputBuffers(&state->mInBuffers));
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ((status_t)OK, codec->getOutputBuffers(&state->mOutBuffers));
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ALOGV("got %d input and %d output buffers",
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber              state->mInBuffers.size(), state->mOutBuffers.size());
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        while (state->mCSDIndex < state->mCSD.size()) {
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index;
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = codec->dequeueInputBuffer(&index);
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (err == -EAGAIN) {
1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                usleep(10000);
1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                continue;
1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ABuffer> &srcBuffer =
1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                state->mCSD.itemAt(state->mCSDIndex++);
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const sp<ABuffer> &buffer = state->mInBuffers.itemAt(index);
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            memcpy(buffer->data(), srcBuffer->data(), srcBuffer->size());
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            err = codec->queueInputBuffer(
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    index,
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0 /* offset */,
1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    srcBuffer->size(),
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0ll /* timeUs */,
1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    MediaCodec::BUFFER_FLAG_CODECCONFIG);
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(err, (status_t)OK);
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool sawInputEOS = false;
1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (;;) {
1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (!sawInputEOS) {
1725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t trackIndex;
1735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = extractor->getSampleTrackIndex(&trackIndex);
1745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (err != OK) {
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("signalling EOS.");
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                for (size_t i = 0; i < stateByTrack.size(); ++i) {
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CodecState *state = &stateByTrack.editValueAt(i);
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    for (;;) {
1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        size_t index;
1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        err = state->mCodec->dequeueInputBuffer(&index);
1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (err == -EAGAIN) {
1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            continue;
1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK_EQ(err, (status_t)OK);
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        err = state->mCodec->queueInputBuffer(
1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                index,
1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                0 /* offset */,
1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                0 /* size */,
1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                0ll /* timeUs */,
1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                MediaCodec::BUFFER_FLAG_EOS);
1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK_EQ(err, (status_t)OK);
1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sawInputEOS = true;
2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CodecState *state = &stateByTrack.editValueFor(trackIndex);
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                size_t index;
2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = state->mCodec->dequeueInputBuffer(&index);
2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (err == OK) {
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("filling input buffer %d", index);
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    const sp<ABuffer> &buffer = state->mInBuffers.itemAt(index);
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    err = extractor->readSampleData(buffer);
2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(err, (status_t)OK);
2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int64_t timeUs;
2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    err = extractor->getSampleTime(&timeUs);
2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(err, (status_t)OK);
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    err = state->mCodec->queueInputBuffer(
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            index,
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            0 /* offset */,
2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            buffer->size(),
2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            timeUs,
2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            0 /* flags */);
2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(err, (status_t)OK);
2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    extractor->advance();
2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                } else {
2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(err, -EAGAIN);
2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        bool sawOutputEOSOnAllTracks = true;
2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        for (size_t i = 0; i < stateByTrack.size(); ++i) {
2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CodecState *state = &stateByTrack.editValueAt(i);
2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (!state->mSawOutputEOS) {
2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sawOutputEOSOnAllTracks = false;
2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (sawOutputEOSOnAllTracks) {
2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
2495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        for (size_t i = 0; i < stateByTrack.size(); ++i) {
2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CodecState *state = &stateByTrack.editValueAt(i);
2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (state->mSawOutputEOS) {
2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                continue;
2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t index;
2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t offset;
2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            size_t size;
2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t presentationTimeUs;
2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags;
2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = state->mCodec->dequeueOutputBuffer(
2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    &index, &offset, &size, &presentationTimeUs, &flags,
2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    10000ll);
2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (err == OK) {
2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("draining output buffer %d, time = %lld us",
2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                      index, presentationTimeUs);
2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                err = state->mCodec->releaseOutputBuffer(index);
2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK_EQ(err, (status_t)OK);
2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                if (flags & MediaCodec::BUFFER_FLAG_EOS) {
2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("reached EOS on output.");
2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    state->mSawOutputEOS = true;
2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else if (err == INFO_OUTPUT_BUFFERS_CHANGED) {
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("INFO_OUTPUT_BUFFERS_CHANGED");
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK_EQ((status_t)OK,
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber                         state->mCodec->getOutputBuffers(&state->mOutBuffers));
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("got %d output buffers", state->mOutBuffers.size());
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else if (err == INFO_FORMAT_CHANGED) {
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> format;
2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK_EQ((status_t)OK, state->mCodec->getOutputFormat(&format));
2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                ALOGV("INFO_FORMAT_CHANGED: %s", format->debugString().c_str());
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK_EQ(err, -EAGAIN);
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < stateByTrack.size(); ++i) {
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CodecState *state = &stateByTrack.editValueAt(i);
2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ((status_t)OK, state->mCodec->stop());
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return 0;
3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huberint main(int argc, char **argv) {
3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    using namespace android;
3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    const char *me = argv[0];
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool useAudio = false;
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool useVideo = false;
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool playback = false;
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int res;
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    while ((res = getopt(argc, argv, "havp")) >= 0) {
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        switch (res) {
3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            case 'a':
3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            {
3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                useAudio = true;
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            case 'v':
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            {
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                useVideo = true;
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber            case 'p':
3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            {
3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                playback = true;
3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            case '?':
3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            case 'h':
3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            default:
3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            {
3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                usage(me);
3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    argc -= optind;
3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    argv += optind;
3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (argc != 1) {
3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        usage(me);
3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!useAudio && !useVideo) {
3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        useAudio = useVideo = true;
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ProcessState::self()->startThreadPool();
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    DataSource::RegisterDefaultSniffers();
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<ALooper> looper = new ALooper;
3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    looper->start();
3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (playback) {
3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient;
3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(composerClient->initCheck(), (status_t)OK);
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ssize_t displayWidth = composerClient->getDisplayWidth(0);
3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ssize_t displayHeight = composerClient->getDisplayHeight(0);
3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ALOGV("display is %ld x %ld\n", displayWidth, displayHeight);
3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<SurfaceControl> control =
3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            composerClient->createSurface(
3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    String8("A Surface"),
3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0,
3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    displayWidth,
3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    displayHeight,
3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    PIXEL_FORMAT_RGB_565,
3785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    0);
3795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(control != NULL);
3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(control->isValid());
3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber        SurfaceComposerClient::openGlobalTransaction();
3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(control->setLayer(INT_MAX), (status_t)OK);
3855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(control->show(), (status_t)OK);
3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        SurfaceComposerClient::closeGlobalTransaction();
3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<Surface> surface = control->getSurface();
3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(surface != NULL);
3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<SimplePlayer> player = new SimplePlayer;
3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber        looper->registerHandler(player);
3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        player->setDataSource(argv[0]);
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        player->setSurface(surface->getSurfaceTexture());
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        player->start();
397e98f8c04faf27df3b1829d336299ad51dad569cfAndreas Huber        sleep(60);
3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber        player->stop();
3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        player->reset();
4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber        composerClient->dispose();
4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        decode(looper, argv[0], useAudio, useVideo);
4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    looper->stop();
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return 0;
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
410