MediaCodec.cpp revision fc7fca77caa12993dd938d5ff43797d781291027
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/*
25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright 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 "MediaCodec"
195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Log.h>
20fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#include <inttypes.h>
215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
225778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h>
235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "include/SoftwareRenderer.h"
255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
261a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h>
27ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h>
285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h>
295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h>
305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h>
315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h>
32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/hexdump.h>
335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/ACodec.h>
347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h>
356f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen#include <media/stagefright/MediaCodecList.h>
36e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include <media/stagefright/MediaDefs.h>
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h>
385778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h>
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h>
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
41e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include "include/avc_utils.h"
42e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
435778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
465778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType(
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ALooper> &looper, const char *mime, bool encoder) {
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<MediaCodec> codec = new MediaCodec(looper);
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (codec->init(mime, true /* nameIsType */, encoder) != OK) {
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return codec;
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
565778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
575778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName(
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ALooper> &looper, const char *name) {
595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<MediaCodec> codec = new MediaCodec(looper);
605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) {
615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return codec;
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
675778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper)
685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    : mState(UNINITIALIZED),
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mLooper(looper),
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mCodec(new ACodec),
717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden      mReplyID(0),
725778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mFlags(0),
735778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mSoftRenderer(NULL),
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueInputTimeoutGeneration(0),
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueInputReplyID(0),
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueOutputTimeoutGeneration(0),
776507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden      mDequeueOutputReplyID(0),
786507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden      mHaveInputSurface(false) {
795778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
815778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() {
825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, UNINITIALIZED);
835778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
855778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
865778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse(
875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &msg, sp<AMessage> *response) {
885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = msg->postAndAwaitResponse(response);
895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!(*response)->findInt32("err", &err)) {
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = OK;
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return err;
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) {
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // Current video decoders do not return from OMX_FillThisBuffer
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // quickly, violating the OpenMAX specs, until that is remedied
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // we need to invest in an extra looper to free the main event
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // queue.
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool needDedicatedLooper = false;
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType && !strncasecmp(name, "video/", 6)) {
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        needDedicatedLooper = true;
1096f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen    } else {
1106f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        AString tmp = name;
1116f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        if (tmp.endsWith(".secure")) {
1126f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen            tmp.erase(tmp.size() - 7, 7);
1136f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        }
1146f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        const MediaCodecList *mcl = MediaCodecList::getInstance();
1156f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        ssize_t codecIdx = mcl->findCodecByName(tmp.c_str());
1166f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        if (codecIdx >= 0) {
1176f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen            Vector<AString> types;
1186f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen            if (mcl->getSupportedTypes(codecIdx, &types) == OK) {
11984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber                for (size_t i = 0; i < types.size(); i++) {
1206f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                    if (types[i].startsWith("video/")) {
1216f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                        needDedicatedLooper = true;
1226f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                        break;
1236f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                    }
1246f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                }
1256f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen            }
1266f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        }
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (needDedicatedLooper) {
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mCodecLooper == NULL) {
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper = new ALooper;
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->setName("CodecLooper");
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper->registerHandler(mCodec);
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mLooper->registerHandler(mCodec);
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mLooper->registerHandler(this);
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id()));
1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatInit, id());
1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setString("name", name);
1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("nameIsType", nameIsType);
1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType) {
1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        msg->setInt32("encoder", encoder);
1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure(
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &format,
1591a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        const sp<Surface> &nativeWindow,
1601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        const sp<ICrypto> &crypto,
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags) {
1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatConfigure, id());
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setMessage("format", format);
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nativeWindow != NULL) {
1681bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setObject(
1691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                "native-window",
1701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                new NativeWindowWrapper(nativeWindow));
1711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    }
1721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (crypto != NULL) {
1741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setPointer("crypto", crypto.get());
1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface(
1827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<IGraphicBufferProducer>* bufferProducer) {
1837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id());
1847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> response;
1867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t err = PostAndAwaitResponse(msg, &response);
1877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    if (err == NO_ERROR) {
1887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        // unwrap the sp<IGraphicBufferProducer>
1897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<RefBase> obj;
1907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        bool found = response->findObject("input-surface", &obj);
1917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        CHECK(found);
1927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<BufferProducerWrapper> wrapper(
1937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                static_cast<BufferProducerWrapper*>(obj.get()));
1947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        *bufferProducer = wrapper->getBufferProducer();
1957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    } else {
1967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        ALOGW("createInputSurface failed, err=%d", err);
1977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    }
1987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return err;
1997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
2007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() {
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStart, id());
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2085778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() {
2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStop, id());
2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
215c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() {
216c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRelease, id());
217c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
218c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> response;
219c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    return PostAndAwaitResponse(msg, &response);
220c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}
221c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer(
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t index,
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t offset,
2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t size,
2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t presentationTimeUs,
2275b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2285b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2295b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2325b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("offset", offset);
2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("size", size);
2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
2395b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer(
2464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t index,
2474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t offset,
2484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const CryptoPlugin::SubSample *subSamples,
2494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t numSubSamples,
2504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t key[16],
2514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t iv[16],
2524b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CryptoPlugin::Mode mode,
2534b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int64_t presentationTimeUs,
2545b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2555b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2565b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2585b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2595b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2604b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2614b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("index", index);
2624b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("offset", offset);
2634b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("subSamples", (void *)subSamples);
2644b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("numSubSamples", numSubSamples);
2654b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("key", (void *)key);
2664b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("iv", (void *)iv);
2674b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("mode", mode);
2684b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2694b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("flags", flags);
2705b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2714b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> response;
2735b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    status_t err = PostAndAwaitResponse(msg, &response);
2745b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2755b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    return err;
2764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber}
2774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) {
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id());
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer(
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *index,
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *offset,
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *size,
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t *presentationTimeUs,
2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t *flags,
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeoutUs) {
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id());
3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("offset", offset));
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("size", size));
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt64("timeUs", presentationTimeUs));
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt32("flags", (int32_t *)flags));
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3185778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) {
3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("render", true);
3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
327fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnarstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index, int64_t timestampNs) {
328fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
329fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    msg->setSize("index", index);
330fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    msg->setInt32("render", true);
331fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    msg->setInt64("timestampNs", timestampNs);
332fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar
333fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    sp<AMessage> response;
334fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    return PostAndAwaitResponse(msg, &response);
335fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar}
336fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar
3375778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) {
3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() {
3467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id());
3477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> response;
3497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return PostAndAwaitResponse(msg, &response);
3507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
3517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3525778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const {
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id());
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findMessage("format", format));
3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
366e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t MediaCodec::getInputFormat(sp<AMessage> *format) const {
367e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> msg = new AMessage(kWhatGetInputFormat, id());
368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
369e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> response;
370e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    status_t err;
371e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
372e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        return err;
373e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    }
374e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
375e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    CHECK(response->findMessage("format", format));
376e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
377e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    return OK;
378e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar}
379e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
380717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const {
381717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    sp<AMessage> msg = new AMessage(kWhatGetName, id());
382717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
383717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    sp<AMessage> response;
384717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t err;
385717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
386717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        return err;
387717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    }
388717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
389717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    CHECK(response->findString("name", name));
390717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
391717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    return OK;
392717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo}
393717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
3945778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const {
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexInput);
3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4035778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const {
4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexOutput);
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4125778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() {
4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatFlush, id());
4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
419496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() {
420496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    (new AMessage(kWhatRequestIDRFrame, id()))->post();
421496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
422496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    return OK;
423496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber}
424496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
425575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> &notify) {
426575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id());
427575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->setMessage("notify", notify);
428575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->post();
429575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
430575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber////////////////////////////////////////////////////////////////////////////////
4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4335778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() {
4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueInputPending) {
4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueInputReplyID);
4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueInputTimeoutGeneration;
4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueInputReplyID = 0;
4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueInputPending;
4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueOutputPending) {
4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueOutputReplyID);
4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueOutputTimeoutGeneration;
4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueOutputReplyID = 0;
4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueOutputPending;
4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4555778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) {
4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueInputPending))) {
4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(replyID);
4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return true;
4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t index = dequeuePortBuffer(kPortIndexInput);
4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index < 0) {
4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(index, -EAGAIN);
4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return false;
4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->setSize("index", index);
4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4815778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) {
4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueOutputPending))) {
4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputBuffersChanged) {
4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED);
4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputFormatChanged) {
4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_FORMAT_CHANGED);
4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ssize_t index = dequeuePortBuffer(kPortIndexOutput);
4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (index < 0) {
4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(index, -EAGAIN);
4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return false;
5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ABuffer> &buffer =
5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mPortBuffers[kPortIndexOutput].itemAt(index).mData;
5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("index", index);
5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("offset", buffer->offset());
5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("size", buffer->size());
5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeUs;
5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt64("timeUs", timeUs);
5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t omxFlags;
5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags));
5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags = 0;
5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) {
5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_SYNCFRAME;
5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) {
5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_CODECCONFIG;
5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_EOS) {
5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_EOS;
5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("flags", flags);
5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5365778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    switch (msg->what()) {
5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatCodecNotify:
5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t what;
5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("what", &what));
5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            switch (what) {
5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatError:
5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxError, internalError;
5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("omx-error", &omxError));
5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("err", &internalError));
5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGE("Codec reported an error. "
5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          "(omx error 0x%08x, internalError %d)",
5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          omxError, internalError);
5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
554aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                    if (omxError == OMX_ErrorResourcesLost
555aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                            && internalError == DEAD_OBJECT) {
556aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                        mFlags |= kFlagSawMediaServerDie;
557aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                    }
558aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    bool sendErrorReponse = true;
5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    switch (mState) {
5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case INITIALIZING:
5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(UNINITIALIZED);
5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case CONFIGURING:
5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(INITIALIZED);
5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTING:
5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(CONFIGURED);
5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STOPPING:
581c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        case RELEASING:
5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // Ignore the error, assuming we'll still get
5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // the shutdown complete notification.
5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
58703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber
588aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                            if (mFlags & kFlagSawMediaServerDie) {
58903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // MediaServer died, there definitely won't
59003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // be a shutdown complete notification after
59103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // all.
59203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber
59303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // note that we're directly going from
59403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // STOPPING->UNINITIALIZED, instead of the
59503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // usual STOPPING->INITIALIZED state.
59603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                setState(UNINITIALIZED);
59703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber
59803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                (new AMessage)->postReply(mReplyID);
59903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                            }
6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case FLUSHING:
6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTED:
6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
614575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            cancelPendingDequeueOperations();
617ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar                            setState(UNINITIALIZED);
6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        default:
6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
626575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
627ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar                            setState(UNINITIALIZED);
6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (sendErrorReponse) {
6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        sp<AMessage> response = new AMessage;
6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->setInt32("err", UNKNOWN_ERROR);
6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->postReply(mReplyID);
6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatComponentAllocated:
6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, INITIALIZING);
6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(INITIALIZED);
6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
646717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    CHECK(msg->findString("componentName", &mComponentName));
6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
648717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    if (mComponentName.startsWith("OMX.google.")) {
6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags |= kFlagIsSoftwareCodec;
6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    } else {
6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagIsSoftwareCodec;
6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
654717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    if (mComponentName.endsWith(".secure")) {
6551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags |= kFlagIsSecure;
6561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    } else {
6571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags &= ~kFlagIsSecure;
6581bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    }
6591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
6605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatComponentConfigured:
6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, CONFIGURING);
6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(CONFIGURED);
6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6696507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                    // reset input surface flag
6706507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                    mHaveInputSurface = false;
6716507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
672e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                    CHECK(msg->findMessage("input-format", &mInputFormat));
673e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                    CHECK(msg->findMessage("output-format", &mOutputFormat));
674e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                case ACodec::kWhatInputSurfaceCreated:
6807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                {
6817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    // response to ACodec::kWhatCreateInputSurface
6827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    status_t err = NO_ERROR;
6837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    sp<AMessage> response = new AMessage();
6847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    if (!msg->findInt32("err", &err)) {
6857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        sp<RefBase> obj;
6867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        msg->findObject("input-surface", &obj);
6877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        CHECK(obj != NULL);
6887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setObject("input-surface", obj);
6896507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                        mHaveInputSurface = true;
6907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    } else {
6917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setInt32("err", err);
6927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    }
6937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    response->postReply(mReplyID);
6947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    break;
6957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                }
6967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
6977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                case ACodec::kWhatSignaledInputEOS:
6987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                {
6997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    // response to ACodec::kWhatSignalEndOfInputStream
7007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    sp<AMessage> response = new AMessage();
7017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    status_t err;
7027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    if (msg->findInt32("err", &err)) {
7037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setInt32("err", err);
7047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    }
7057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    response->postReply(mReplyID);
7067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    break;
7077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                }
7087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatBuffersAllocated:
7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t portIndex;
7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("portIndex", &portIndex));
7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("%s buffers allocated",
7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          portIndex == kPortIndexInput ? "input" : "output");
7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(portIndex == kPortIndexInput
7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            || portIndex == kPortIndexOutput);
7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mPortBuffers[portIndex].clear();
7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
725eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<RefBase> obj;
726eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    CHECK(msg->findObject("portDesc", &obj));
727eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber
728eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<ACodec::PortDescription> portDesc =
729eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        static_cast<ACodec::PortDescription *>(obj.get());
7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
731eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    size_t numBuffers = portDesc->countBuffers();
7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
733eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    for (size_t i = 0; i < numBuffers; ++i) {
7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        BufferInfo info;
735eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mBufferID = portDesc->bufferIDAt(i);
7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        info.mOwnedByClient = false;
737eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mData = portDesc->bufferAt(i);
7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7391bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        if (portIndex == kPortIndexInput && mCrypto != NULL) {
740ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                            info.mEncryptedData =
741ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                new ABuffer(info.mData->capacity());
742ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                        }
743ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        buffers->push_back(info);
7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (portIndex == kPortIndexOutput) {
7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (mState == STARTING) {
7495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // We're always allocating output buffers after
7505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // allocating input buffers, so this is a good
7515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // indication that now all buffers are allocated.
7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
7535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            (new AMessage)->postReply(mReplyID);
7545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        } else {
7555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagOutputBuffersChanged;
756575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
7575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
7585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatOutputFormatChanged:
7635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("codec output format changed");
7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if ((mFlags & kFlagIsSoftwareCodec)
7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            && mNativeWindow != NULL) {
7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        AString mime;
7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(msg->findString("mime", &mime));
7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (!strncasecmp("video/", mime.c_str(), 6)) {
7725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            delete mSoftRenderer;
7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer = NULL;
7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t width, height;
7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("width", &width));
7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("height", &height));
7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7796539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                            int32_t cropLeft, cropTop, cropRight, cropBottom;
7806539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                            CHECK(msg->findRect("crop",
7816539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                                &cropLeft, &cropTop, &cropRight, &cropBottom));
7826539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo
7835778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t colorFormat;
7845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32(
7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                        "color-format", &colorFormat));
7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sp<MetaData> meta = new MetaData;
7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyWidth, width);
7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyHeight, height);
7906539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                            meta->setRect(kKeyCropRect,
7916539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                                cropLeft, cropTop, cropRight, cropBottom);
7925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyColorFormat, colorFormat);
7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer =
7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                new SoftwareRenderer(mNativeWindow, meta);
7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mOutputFormat = msg;
800e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
801e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    if (mFlags & kFlagIsEncoder) {
802e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // Before we announce the format change we should
803e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // collect codec specific data and amend the output
804e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // format as necessary.
805e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        mFlags |= kFlagGatherCodecSpecificData;
806e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    } else {
807e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        mFlags |= kFlagOutputFormatChanged;
808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        postActivityNotificationIfPossible();
809e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    }
8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatFillThisBuffer:
8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexInput, msg);
8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
817c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
818c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
819c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
8205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexInput);
8215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
8225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
8235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8248ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    if (!mCSD.empty()) {
8258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        ssize_t index = dequeuePortBuffer(kPortIndexInput);
8268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        CHECK_GE(index, 0);
8278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // If codec specific data had been specified as
8298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // part of the format in the call to configure and
8308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // if there's more csd left, we submit it here
8318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // clients only get access to input buffers once
8328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // this data has been exhausted.
8338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        status_t err = queueCSDInputBuffer(index);
8358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        if (err != OK) {
8378ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            ALOGE("queueCSDInputBuffer failed w/ error %d",
8388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                                  err);
8398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            mFlags |= kFlagStickyError;
841575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
842575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
8438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            cancelPendingDequeueOperations();
8448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        }
8458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        break;
8468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    }
8478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueInputPending) {
8495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));
8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueInputTimeoutGeneration;
8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueInputPending;
8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueInputReplyID = 0;
854575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
855575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
8565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatDrainThisBuffer:
8615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexOutput, msg);
8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
864c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
865c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
866c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
8675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexOutput);
8685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
8695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8712d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    sp<ABuffer> buffer;
8722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    CHECK(msg->findBuffer("buffer", &buffer));
8735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxFlags;
8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("flags", &omxFlags));
8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    buffer->meta()->setInt32("omxFlags", omxFlags);
8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
879e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    if (mFlags & kFlagGatherCodecSpecificData) {
880e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // This is the very first output buffer after a
881e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // format change was signalled, it'll either contain
882e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // the one piece of codec specific data we can expect
883e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // or there won't be codec specific data.
884e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) {
885e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                            status_t err =
886e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                                amendOutputFormatWithCodecSpecificData(buffer);
887e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
888e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                            if (err != OK) {
889e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                                ALOGE("Codec spit out malformed codec "
890e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                                      "specific data!");
891e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                            }
892e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        }
893e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
894e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        mFlags &= ~kFlagGatherCodecSpecificData;
895e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        mFlags |= kFlagOutputFormatChanged;
896e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    }
897e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueOutputPending) {
8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID));
9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueOutputTimeoutGeneration;
9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueOutputPending;
9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueOutputReplyID = 0;
904575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
905575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
907575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
9085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatEOS:
9125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
9135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // We already notify the client of this by using the
9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // corresponding flag in "onOutputBufferReady".
9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatShutdownCompleted:
9195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
920c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == STOPPING) {
921c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(INITIALIZED);
922c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    } else {
923c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        CHECK_EQ(mState, RELEASING);
924c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(UNINITIALIZED);
925c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    }
9265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
9285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
9295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatFlushCompleted:
9325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
9335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, FLUSHING);
9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(STARTED);
9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mCodec->signalResume();
9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                default:
9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    TRESPASS();
9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatInit:
9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNINITIALIZED) {
9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
9625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(INITIALIZING);
9635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            AString name;
9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findString("name", &name));
9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t nameIsType;
9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t encoder = false;
9690db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            CHECK(msg->findInt32("nameIsType", &nameIsType));
9700db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            if (nameIsType) {
9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK(msg->findInt32("encoder", &encoder));
9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format = new AMessage;
9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (nameIsType) {
9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("mime", name.c_str());
9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", encoder);
9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("componentName", name.c_str());
9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateAllocateComponent(format);
9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatConfigure:
9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != INITIALIZED) {
9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<RefBase> obj;
10015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (!msg->findObject("native-window", &obj)) {
10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                obj.clear();
10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format;
10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("format", &format));
10075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (obj != NULL) {
10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setObject("native-window", obj);
10101bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
10117541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                status_t err = setNativeWindow(
10127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    static_cast<NativeWindowWrapper *>(obj.get())
10137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                        ->getSurfaceTextureClient());
10147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
10157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                if (err != OK) {
10167541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    sp<AMessage> response = new AMessage;
10177541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->setInt32("err", err);
10187541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
10197541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->postReply(replyID);
10207541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    break;
10211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                }
10221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            } else {
10237541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                setNativeWindow(NULL);
10241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            }
10251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
10267541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            mReplyID = replyID;
10277541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            setState(CONFIGURING);
10287541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
10291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            void *crypto;
10301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            if (!msg->findPointer("crypto", &crypto)) {
10311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                crypto = NULL;
10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            mCrypto = static_cast<ICrypto *>(crypto);
10351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags;
10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("flags", (int32_t *)&flags));
10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (flags & CONFIGURE_FLAG_ENCODE) {
10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", true);
1041e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                mFlags |= kFlagIsEncoder;
10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            extractCSD(format);
10458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateConfigureComponent(format);
10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case kWhatCreateInputSurface:
10517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
10527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            uint32_t replyID;
10537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK(msg->senderAwaitsResponse(&replyID));
10547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
10557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            // Must be configured, but can't have been started yet.
10567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (mState != CONFIGURED) {
10577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                sp<AMessage> response = new AMessage;
10587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->setInt32("err", INVALID_OPERATION);
10597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
10607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->postReply(replyID);
10617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                break;
10627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
10637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
10647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mReplyID = replyID;
10657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mCodec->initiateCreateInputSurface();
10667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            break;
10677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
10687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
10695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStart:
10705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != CONFIGURED) {
10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(STARTING);
10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateStart();
10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStop:
1090c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        case kWhatRelease:
1091c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        {
1092aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            State targetState =
1093aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                (msg->what() == kWhatStop) ? INITIALIZED : UNINITIALIZED;
1094aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
1095c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            uint32_t replyID;
1096c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1097c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1098c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            if (mState != INITIALIZED
1099c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    && mState != CONFIGURED && mState != STARTED) {
110003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // We may be in "UNINITIALIZED" state already without the
110103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // client being aware of this if media server died while
110203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // we were being stopped. The client would assume that
110303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // after stop() returned, it would be safe to call release()
110403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // and it should be in this case, no harm to allow a release()
110503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // if we're already uninitialized.
1106aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                // Similarly stopping a stopped MediaCodec should be benign.
1107c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                sp<AMessage> response = new AMessage;
110803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                response->setInt32(
110903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                        "err",
1110aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                        mState == targetState ? OK : INVALID_OPERATION);
1111c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1112c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                response->postReply(replyID);
1113c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                break;
1114c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            }
1115c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1116aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            if (mFlags & kFlagSawMediaServerDie) {
1117aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                // It's dead, Jim. Don't expect initiateShutdown to yield
1118aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                // any useful results now...
1119aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                setState(UNINITIALIZED);
1120aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                (new AMessage)->postReply(replyID);
1121aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                break;
1122aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            }
1123aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
1124c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            mReplyID = replyID;
1125aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            setState(msg->what() == kWhatStop ? STOPPING : RELEASING);
1126aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
1127aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            mCodec->initiateShutdown(
1128aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                    msg->what() == kWhatStop /* keepComponentAllocated */);
1129c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputBuffer:
11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11396507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden            if (mHaveInputSurface) {
11406507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                ALOGE("dequeueInputBuffer can't be used with input surface");
11416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                sp<AMessage> response = new AMessage;
11426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                response->setInt32("err", INVALID_OPERATION);
11436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                response->postReply(replyID);
11446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                break;
11456507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden            }
11466507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueInputBuffer(replyID, true /* new request */)) {
11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueInputPending;
11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = replyID;
11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueInputTimedOut, id());
11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueInputTimeoutGeneration);
11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputTimedOut:
11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueInputTimeoutGeneration) {
11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueInputPending);
11855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
11885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueInputReplyID);
11895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueInputPending;
11915778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = 0;
11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatQueueInputBuffer:
11965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onQueueInputBuffer(msg);
12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputBuffer:
12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueOutputBuffer(replyID, true /* new request */)) {
12225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueOutputPending;
12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = replyID;
12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueOutputTimedOut, id());
12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueOutputTimeoutGeneration);
12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputTimedOut:
12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueOutputTimeoutGeneration) {
12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueOutputPending);
12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueOutputReplyID);
12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueOutputPending;
12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = 0;
12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatReleaseOutputBuffer:
12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onReleaseOutputBuffer(msg);
12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case kWhatSignalEndOfInputStream:
12917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
12927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            uint32_t replyID;
12937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK(msg->senderAwaitsResponse(&replyID));
12947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
12957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                sp<AMessage> response = new AMessage;
12977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->setInt32("err", INVALID_OPERATION);
12987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
12997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->postReply(replyID);
13007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                break;
13017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
13027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
13037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mReplyID = replyID;
13047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mCodec->signalEndOfInputStream();
13057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            break;
13067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
13077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
13085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetBuffers:
13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
13165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t portIndex;
13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("portIndex", &portIndex));
13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            Vector<sp<ABuffer> > *dstBuffers;
13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findPointer("buffers", (void **)&dstBuffers));
13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            dstBuffers->clear();
13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex];
13295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            for (size_t i = 0; i < srcBuffers.size(); ++i) {
13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                const BufferInfo &info = srcBuffers.itemAt(i);
13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1333ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                dstBuffers->push_back(
13341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        (portIndex == kPortIndexInput && mCrypto != NULL)
1335ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                ? info.mEncryptedData : info.mData);
13365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
13375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            (new AMessage)->postReply(replyID);
13395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
13405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
13415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatFlush:
13435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
13445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
13455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
13465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
13485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
13495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
13505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(FLUSHING);
13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->signalFlush();
13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1363e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        case kWhatGetInputFormat:
13645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetOutputFormat:
13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
1366e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar            sp<AMessage> format =
1367e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                (msg->what() == kWhatGetOutputFormat ? mOutputFormat : mInputFormat);
1368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
13695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1372e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar            if ((mState != CONFIGURED && mState != STARTING &&
1373e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                 mState != STARTED && mState != FLUSHING)
1374972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo                    || (mFlags & kFlagStickyError)
1375e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                    || format == NULL) {
13765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
13775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
1384e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar            response->setMessage("format", format);
13855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1389496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        case kWhatRequestIDRFrame:
1390496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        {
1391496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            mCodec->signalRequestIDRFrame();
1392496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            break;
1393496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        }
1394496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
1395575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        case kWhatRequestActivityNotification:
1396575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        {
1397575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(mActivityNotify == NULL);
1398575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(msg->findMessage("notify", &mActivityNotify));
1399575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1400575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            postActivityNotificationIfPossible();
1401575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            break;
1402575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        }
1403575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1404717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        case kWhatGetName:
1405717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        {
1406717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            uint32_t replyID;
1407717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            CHECK(msg->senderAwaitsResponse(&replyID));
1408717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1409717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            if (mComponentName.empty()) {
1410717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                sp<AMessage> response = new AMessage;
1411717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                response->setInt32("err", INVALID_OPERATION);
1412717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1413717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                response->postReply(replyID);
1414717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                break;
1415717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            }
1416717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1417717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            sp<AMessage> response = new AMessage;
1418717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            response->setString("name", mComponentName.c_str());
1419717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            response->postReply(replyID);
1420717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            break;
1421717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        }
1422717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1423a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        case kWhatSetParameters:
1424a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        {
1425a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            uint32_t replyID;
1426a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1427a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1428a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            sp<AMessage> params;
1429a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            CHECK(msg->findMessage("params", &params));
1430a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1431a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            status_t err = onSetParameters(params);
1432a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1433a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            sp<AMessage> response = new AMessage;
1434a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            response->setInt32("err", err);
1435a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1436a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            response->postReply(replyID);
1437a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            break;
1438a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        }
1439a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
14405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        default:
14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            TRESPASS();
14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14458ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) {
14468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.clear();
14478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    size_t i = 0;
14498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    for (;;) {
14508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        sp<ABuffer> csd;
14518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) {
14528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            break;
14538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        }
14548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        mCSD.push_back(csd);
14568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        ++i;
14578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
14588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    ALOGV("Found %u pieces of codec specific data.", mCSD.size());
14608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
14618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) {
14638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    CHECK(!mCSD.empty());
14648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    BufferInfo *info =
14668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex);
14678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<ABuffer> csd = *mCSD.begin();
14698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.erase(mCSD.begin());
14708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    const sp<ABuffer> &codecInputData =
14728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        (mCrypto != NULL) ? info->mEncryptedData : info->mData;
14738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    if (csd->size() > codecInputData->capacity()) {
14758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        return -EINVAL;
14768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
14778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    memcpy(codecInputData->data(), csd->data(), csd->size());
14798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    AString errorDetailMsg;
14818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
14838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("index", bufferIndex);
14848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("offset", 0);
14858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("size", csd->size());
14868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt64("timeUs", 0ll);
14878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG);
14888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setPointer("errorDetailMsg", &errorDetailMsg);
14898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    return onQueueInputBuffer(msg);
14918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
14928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14935778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) {
14947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (newState == INITIALIZED || newState == UNINITIALIZED) {
14955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        delete mSoftRenderer;
14965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mSoftRenderer = NULL;
14975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14981bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        mCrypto.clear();
14997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        setNativeWindow(NULL);
15005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15015778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mOutputFormat.clear();
15025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
15035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
15045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagStickyError;
1505e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        mFlags &= ~kFlagIsEncoder;
1506e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        mFlags &= ~kFlagGatherCodecSpecificData;
1507575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1508575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
15095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1511717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    if (newState == UNINITIALIZED) {
1512717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        mComponentName.clear();
1513aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
1514aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        // The component is gone, mediaserver's probably back up already
1515aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        // but should definitely be back up should we try to instantiate
1516aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        // another component.. and the cycle continues.
1517aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        mFlags &= ~kFlagSawMediaServerDie;
1518717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    }
1519717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
15205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mState = newState;
15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    cancelPendingDequeueOperations();
15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15255778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() {
15265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexInput);
15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexOutput);
15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15305778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) {
15315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
15365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mNotify != NULL) {
15395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> msg = info->mNotify;
15405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mNotify = NULL;
15415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mOwnedByClient = false;
15425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (portIndex == kPortIndexInput) {
15447fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar                /* no error, just returning buffers */
15457fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar                msg->setInt32("err", OK);
15465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
15475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            msg->post();
15485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
15495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mAvailPortBuffers[portIndex].clear();
15525778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15545778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers(
15555778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t portIndex, const sp<AMessage> &msg) {
15565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
15575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void *bufferID;
15595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findPointer("buffer-id", &bufferID));
15605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
15625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
15645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
15655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15665778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mBufferID == bufferID) {
15675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(info->mNotify == NULL);
15685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("reply", &info->mNotify));
15695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mAvailPortBuffers[portIndex].push_back(i);
15715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return i;
15735778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
15745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    TRESPASS();
15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return 0;
15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15815778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) {
15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t offset;
15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t size;
15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t timeUs;
15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t flags;
15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("offset", &offset));
15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt64("timeUs", &timeUs));
15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt32("flags", (int32_t *)&flags));
15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15924b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const CryptoPlugin::SubSample *subSamples;
15934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    size_t numSubSamples;
15944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *key;
15954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *iv;
15964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted;
15974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // We allow the simpler queueInputBuffer API to be used even in
15994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // secure mode, by fabricating a single unencrypted subSample.
16004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::SubSample ss;
16014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    if (msg->findSize("size", &size)) {
16034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto != NULL) {
16044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfClearData = size;
16054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfEncryptedData = 0;
16064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            subSamples = &ss;
16084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            numSubSamples = 1;
16094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            key = NULL;
16104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            iv = NULL;
16114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
16124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    } else {
16134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto == NULL) {
16144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            return -EINVAL;
16154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
16164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("subSamples", (void **)&subSamples));
16184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findSize("numSubSamples", &numSubSamples));
16194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("key", (void **)&key));
16204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("iv", (void **)&iv));
16214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int32_t tmp;
16234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findInt32("mode", &tmp));
16244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        mode = (CryptoPlugin::Mode)tmp;
16264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size = 0;
16284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        for (size_t i = 0; i < numSubSamples; ++i) {
16294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfClearData;
16304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfEncryptedData;
16314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
16324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    }
16334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexInput].size()) {
16355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
16365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index);
16395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
16415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
16425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (offset + size > info->mData->capacity()) {
16455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
16465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> reply = info->mNotify;
16495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->setRange(offset, size);
16505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->meta()->setInt64("timeUs", timeUs);
16515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_EOS) {
16535778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("eos", true);
16545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_CODECCONFIG) {
16575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("csd", true);
16585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (mCrypto != NULL) {
16611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        if (size > info->mEncryptedData->capacity()) {
16621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            return -ERANGE;
1663ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1664ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
16655b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg;
16665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg));
16675b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
1668fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        ssize_t result = mCrypto->decrypt(
16691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                (mFlags & kFlagIsSecure) != 0,
16701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                key,
16711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                iv,
16721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                mode,
16731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                info->mEncryptedData->base() + offset,
16744b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                subSamples,
16754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                numSubSamples,
16765b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                info->mData->base(),
16775b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                errorDetailMsg);
16781bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1679fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        if (result < 0) {
1680fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            return result;
1681ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1682ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1683fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        info->mData->setRange(0, result);
1684ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
1685ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
16862d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", info->mData);
16875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    reply->post();
16885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16895b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mNotify = NULL;
16905b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mOwnedByClient = false;
16915b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
16925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
16935778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
16945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16955778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) {
16965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
16975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
16985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t render;
17005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!msg->findInt32("render", &render)) {
17015778822d86b0337407514b9372562b86edfa91cdAndreas Huber        render = 0;
17025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED) {
17055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
17065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexOutput].size()) {
17095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
17105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);
17135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
17155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
17165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
171879ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou    if (render && info->mData != NULL && info->mData->size() != 0) {
17195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mNotify->setInt32("render", true);
17205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1721fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar        int64_t timestampNs = 0;
1722fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar        if (msg->findInt64("timestampNs", &timestampNs)) {
1723fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            info->mNotify->setInt64("timestampNs", timestampNs);
1724fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar        } else {
1725fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            // TODO: it seems like we should use the timestamp
1726fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            // in the (media)buffer as it potentially came from
1727fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            // an input surface, but we did not propagate it prior to
1728fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            // API 20.  Perhaps check for target SDK version.
1729fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0
1730fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            if (info->mData->meta()->findInt64("timeUs", &timestampNs)) {
1731fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar                ALOGI("using buffer PTS of %" PRId64, timestampNs);
1732fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar                timestampNs *= 1000;
1733fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            }
1734fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif
1735fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar        }
1736fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar
17375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mSoftRenderer != NULL) {
17385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mSoftRenderer->render(
1739fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar                    info->mData->data(), info->mData->size(), timestampNs, NULL);
17405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify->post();
17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify = NULL;
17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = false;
17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
17485778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17505778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) {
17515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> *availBuffers = &mAvailPortBuffers[portIndex];
17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (availBuffers->empty()) {
17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EAGAIN;
17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index = *availBuffers->begin();
17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    availBuffers->erase(availBuffers->begin());
17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index);
17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(!info->mOwnedByClient);
17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = true;
17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return index;
17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17697541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow(
17701a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        const sp<Surface> &surfaceTextureClient) {
17717541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    status_t err;
17727541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17737541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (mNativeWindow != NULL) {
17747541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_disconnect(
17757541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA);
17767541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17777541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
17787541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGW("native_window_api_disconnect returned an error: %s (%d)",
17797541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
17807541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
17817541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17827541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow.clear();
17837541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
17847541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17857541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (surfaceTextureClient != NULL) {
17867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_connect(
17877541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA);
17887541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17897541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
17907541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGE("native_window_api_connect returned an error: %s (%d)",
17917541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
17927541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17937541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            return err;
17947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
17957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17967541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow = surfaceTextureClient;
17977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
17987541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    return OK;
18007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber}
18017541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
1802575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() {
1803575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if (mActivityNotify == NULL) {
1804575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        return;
1805575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1806575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1807575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if ((mFlags & (kFlagStickyError
1808575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputBuffersChanged
1809575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputFormatChanged))
1810575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexInput].empty()
1811575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexOutput].empty()) {
1812575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify->post();
1813575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
1814575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1815575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
1816575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1817a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> &params) {
1818a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetParameters, id());
1819a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    msg->setMessage("params", params);
1820a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1821a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    sp<AMessage> response;
1822a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    return PostAndAwaitResponse(msg, &response);
1823a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber}
1824a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1825a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> &params) {
1826a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    mCodec->signalSetParameters(params);
1827a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1828a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    return OK;
1829a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber}
1830a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1831e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatus_t MediaCodec::amendOutputFormatWithCodecSpecificData(
1832e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        const sp<ABuffer> &buffer) {
1833e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    AString mime;
1834e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    CHECK(mOutputFormat->findString("mime", &mime));
1835e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1836e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) {
1837e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // Codec specific data should be SPS and PPS in a single buffer,
1838e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // each prefixed by a startcode (0x00 0x00 0x00 0x01).
1839e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // We separate the two and put them into the output format
1840e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // under the keys "csd-0" and "csd-1".
1841e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        unsigned csdIndex = 0;
1843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        const uint8_t *data = buffer->data();
1845e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        size_t size = buffer->size();
1846e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1847e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        const uint8_t *nalStart;
1848e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        size_t nalSize;
1849e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) {
1850e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            sp<ABuffer> csd = new ABuffer(nalSize + 4);
1851e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            memcpy(csd->data(), "\x00\x00\x00\x01", 4);
1852e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            memcpy(csd->data() + 4, nalStart, nalSize);
1853e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1854e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            mOutputFormat->setBuffer(
1855e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    StringPrintf("csd-%u", csdIndex).c_str(), csd);
1856e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1857e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            ++csdIndex;
1858e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        }
1859e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1860e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        if (csdIndex != 2) {
1861e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            return ERROR_MALFORMED;
1862e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        }
1863e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    } else {
1864e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // For everything else we just stash the codec specific data into
1865e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // the output format as a single piece of csd under "csd-0".
1866e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        mOutputFormat->setBuffer("csd-0", buffer);
1867e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    }
1868e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1869e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    return OK;
1870e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}
1871e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
18725778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
1873