MediaCodec.cpp revision 92cd05b8f2e994aabcdda5d7454c96a707dc9579
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),
7092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar      mCodec(NULL),
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.
10692cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar    mCodec = new ACodec;
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool needDedicatedLooper = false;
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType && !strncasecmp(name, "video/", 6)) {
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        needDedicatedLooper = true;
1106f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen    } else {
1116f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        AString tmp = name;
1126f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        if (tmp.endsWith(".secure")) {
1136f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen            tmp.erase(tmp.size() - 7, 7);
1146f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        }
1156f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        const MediaCodecList *mcl = MediaCodecList::getInstance();
1166f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        ssize_t codecIdx = mcl->findCodecByName(tmp.c_str());
1176f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        if (codecIdx >= 0) {
1186f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen            Vector<AString> types;
1196f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen            if (mcl->getSupportedTypes(codecIdx, &types) == OK) {
12084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber                for (size_t i = 0; i < types.size(); i++) {
1216f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                    if (types[i].startsWith("video/")) {
1226f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                        needDedicatedLooper = true;
1236f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                        break;
1246f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                    }
1256f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen                }
1266f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen            }
1276f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen        }
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (needDedicatedLooper) {
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mCodecLooper == NULL) {
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper = new ALooper;
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->setName("CodecLooper");
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper->registerHandler(mCodec);
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mLooper->registerHandler(mCodec);
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mLooper->registerHandler(this);
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id()));
1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatInit, id());
1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setString("name", name);
1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("nameIsType", nameIsType);
1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType) {
1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        msg->setInt32("encoder", encoder);
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure(
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &format,
1601a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        const sp<Surface> &nativeWindow,
1611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        const sp<ICrypto> &crypto,
1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags) {
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatConfigure, id());
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setMessage("format", format);
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nativeWindow != NULL) {
1691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setObject(
1701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                "native-window",
1711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                new NativeWindowWrapper(nativeWindow));
1721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    }
1731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (crypto != NULL) {
1751bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setPointer("crypto", crypto.get());
1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface(
1837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<IGraphicBufferProducer>* bufferProducer) {
1847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id());
1857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> response;
1877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t err = PostAndAwaitResponse(msg, &response);
1887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    if (err == NO_ERROR) {
1897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        // unwrap the sp<IGraphicBufferProducer>
1907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<RefBase> obj;
1917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        bool found = response->findObject("input-surface", &obj);
1927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        CHECK(found);
1937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<BufferProducerWrapper> wrapper(
1947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                static_cast<BufferProducerWrapper*>(obj.get()));
1957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        *bufferProducer = wrapper->getBufferProducer();
1967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    } else {
1977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        ALOGW("createInputSurface failed, err=%d", err);
1987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    }
1997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return err;
2007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
2017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() {
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStart, id());
2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2095778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() {
2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStop, id());
2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
216c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() {
217c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRelease, id());
218c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
219c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> response;
220c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    return PostAndAwaitResponse(msg, &response);
221c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}
222c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer(
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t index,
2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t offset,
2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t size,
2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t presentationTimeUs,
2285b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2295b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2325b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2335b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("offset", offset);
2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("size", size);
2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
2405b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer(
2474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t index,
2484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t offset,
2494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const CryptoPlugin::SubSample *subSamples,
2504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t numSubSamples,
2514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t key[16],
2524b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t iv[16],
2534b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CryptoPlugin::Mode mode,
2544b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int64_t presentationTimeUs,
2555b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2565b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2585b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2595b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2605b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2614b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2624b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("index", index);
2634b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("offset", offset);
2644b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("subSamples", (void *)subSamples);
2654b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("numSubSamples", numSubSamples);
2664b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("key", (void *)key);
2674b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("iv", (void *)iv);
2684b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("mode", mode);
2694b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2704b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("flags", flags);
2715b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2734b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> response;
2745b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    status_t err = PostAndAwaitResponse(msg, &response);
2755b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2765b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    return err;
2774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber}
2784b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) {
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id());
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer(
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *index,
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *offset,
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *size,
2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t *presentationTimeUs,
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t *flags,
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeoutUs) {
3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id());
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("offset", offset));
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("size", size));
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt64("timeUs", presentationTimeUs));
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt32("flags", (int32_t *)flags));
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3195778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) {
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("render", true);
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
328fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnarstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index, int64_t timestampNs) {
329fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
330fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    msg->setSize("index", index);
331fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    msg->setInt32("render", true);
332fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    msg->setInt64("timestampNs", timestampNs);
333fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar
334fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    sp<AMessage> response;
335fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar    return PostAndAwaitResponse(msg, &response);
336fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar}
337fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar
3385778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) {
3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() {
3477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id());
3487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> response;
3507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return PostAndAwaitResponse(msg, &response);
3517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
3527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const {
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id());
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findMessage("format", format));
3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
367e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t MediaCodec::getInputFormat(sp<AMessage> *format) const {
368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> msg = new AMessage(kWhatGetInputFormat, id());
369e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
370e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    sp<AMessage> response;
371e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    status_t err;
372e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
373e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        return err;
374e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    }
375e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
376e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    CHECK(response->findMessage("format", format));
377e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
378e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar    return OK;
379e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar}
380e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
381717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const {
382717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    sp<AMessage> msg = new AMessage(kWhatGetName, id());
383717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
384717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    sp<AMessage> response;
385717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t err;
386717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
387717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        return err;
388717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    }
389717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
390717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    CHECK(response->findString("name", name));
391717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
392717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    return OK;
393717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo}
394717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const {
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexInput);
3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4045778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const {
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexOutput);
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4135778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() {
4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatFlush, id());
4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
420496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() {
421496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    (new AMessage(kWhatRequestIDRFrame, id()))->post();
422496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
423496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    return OK;
424496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber}
425496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
426575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> &notify) {
427575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id());
428575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->setMessage("notify", notify);
429575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->post();
430575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
431575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber////////////////////////////////////////////////////////////////////////////////
4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4345778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() {
4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueInputPending) {
4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueInputReplyID);
4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueInputTimeoutGeneration;
4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueInputReplyID = 0;
4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueInputPending;
4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueOutputPending) {
4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueOutputReplyID);
4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueOutputTimeoutGeneration;
4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueOutputReplyID = 0;
4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueOutputPending;
4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4565778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) {
4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueInputPending))) {
4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(replyID);
4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return true;
4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t index = dequeuePortBuffer(kPortIndexInput);
4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index < 0) {
4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(index, -EAGAIN);
4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return false;
4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->setSize("index", index);
4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4825778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) {
4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueOutputPending))) {
4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputBuffersChanged) {
4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED);
4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputFormatChanged) {
4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_FORMAT_CHANGED);
4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ssize_t index = dequeuePortBuffer(kPortIndexOutput);
4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (index < 0) {
4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(index, -EAGAIN);
5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return false;
5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ABuffer> &buffer =
5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mPortBuffers[kPortIndexOutput].itemAt(index).mData;
5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("index", index);
5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("offset", buffer->offset());
5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("size", buffer->size());
5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeUs;
5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt64("timeUs", timeUs);
5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t omxFlags;
5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags));
5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags = 0;
5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) {
5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_SYNCFRAME;
5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) {
5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_CODECCONFIG;
5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_EOS) {
5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_EOS;
5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("flags", flags);
5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5375778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    switch (msg->what()) {
5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatCodecNotify:
5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t what;
5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("what", &what));
5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            switch (what) {
54592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatError:
5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxError, internalError;
5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("omx-error", &omxError));
5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("err", &internalError));
5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGE("Codec reported an error. "
5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          "(omx error 0x%08x, internalError %d)",
5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          omxError, internalError);
5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
555aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                    if (omxError == OMX_ErrorResourcesLost
556aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                            && internalError == DEAD_OBJECT) {
557aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                        mFlags |= kFlagSawMediaServerDie;
558aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                    }
559aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    bool sendErrorReponse = true;
5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    switch (mState) {
5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case INITIALIZING:
5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(UNINITIALIZED);
5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case CONFIGURING:
5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(INITIALIZED);
5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTING:
5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(CONFIGURED);
5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STOPPING:
582c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        case RELEASING:
5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // Ignore the error, assuming we'll still get
5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // the shutdown complete notification.
5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
58803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber
589aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                            if (mFlags & kFlagSawMediaServerDie) {
59003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // MediaServer died, there definitely won't
59103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // be a shutdown complete notification after
59203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // all.
59303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber
59403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // note that we're directly going from
59503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // STOPPING->UNINITIALIZED, instead of the
59603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                // usual STOPPING->INITIALIZED state.
59703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                setState(UNINITIALIZED);
59803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber
59903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                                (new AMessage)->postReply(mReplyID);
60003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                            }
6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case FLUSHING:
6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTED:
6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
615575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            cancelPendingDequeueOperations();
618ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar                            setState(UNINITIALIZED);
6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        default:
6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
627575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
628ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar                            setState(UNINITIALIZED);
6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (sendErrorReponse) {
6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        sp<AMessage> response = new AMessage;
6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->setInt32("err", UNKNOWN_ERROR);
6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->postReply(mReplyID);
6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
64292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatComponentAllocated:
6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, INITIALIZING);
6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(INITIALIZED);
6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
647717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    CHECK(msg->findString("componentName", &mComponentName));
6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
649717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    if (mComponentName.startsWith("OMX.google.")) {
6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags |= kFlagIsSoftwareCodec;
6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    } else {
6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagIsSoftwareCodec;
6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
655717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    if (mComponentName.endsWith(".secure")) {
6561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags |= kFlagIsSecure;
6571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    } else {
6581bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags &= ~kFlagIsSecure;
6591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    }
6601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
66592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatComponentConfigured:
6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, CONFIGURING);
6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(CONFIGURED);
6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6706507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                    // reset input surface flag
6716507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                    mHaveInputSurface = false;
6726507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
673e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                    CHECK(msg->findMessage("input-format", &mInputFormat));
674e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                    CHECK(msg->findMessage("output-format", &mOutputFormat));
675e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
68092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatInputSurfaceCreated:
6817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                {
68292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                    // response to initiateCreateInputSurface()
6837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    status_t err = NO_ERROR;
6847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    sp<AMessage> response = new AMessage();
6857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    if (!msg->findInt32("err", &err)) {
6867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        sp<RefBase> obj;
6877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        msg->findObject("input-surface", &obj);
6887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        CHECK(obj != NULL);
6897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setObject("input-surface", obj);
6906507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                        mHaveInputSurface = true;
6917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    } else {
6927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setInt32("err", err);
6937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    }
6947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    response->postReply(mReplyID);
6957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    break;
6967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                }
6977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
69892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatSignaledInputEOS:
6997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                {
70092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                    // response to signalEndOfInputStream()
7017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    sp<AMessage> response = new AMessage();
7027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    status_t err;
7037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    if (msg->findInt32("err", &err)) {
7047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setInt32("err", err);
7057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    }
7067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    response->postReply(mReplyID);
7077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    break;
7087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                }
7097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
7107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
71192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatBuffersAllocated:
7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t portIndex;
7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("portIndex", &portIndex));
7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("%s buffers allocated",
7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          portIndex == kPortIndexInput ? "input" : "output");
7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(portIndex == kPortIndexInput
7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            || portIndex == kPortIndexOutput);
7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mPortBuffers[portIndex].clear();
7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
726eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<RefBase> obj;
727eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    CHECK(msg->findObject("portDesc", &obj));
728eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber
72992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                    sp<CodecBase::PortDescription> portDesc =
73092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                        static_cast<CodecBase::PortDescription *>(obj.get());
7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
732eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    size_t numBuffers = portDesc->countBuffers();
7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
734eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    for (size_t i = 0; i < numBuffers; ++i) {
7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        BufferInfo info;
736eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mBufferID = portDesc->bufferIDAt(i);
7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        info.mOwnedByClient = false;
738eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mData = portDesc->bufferAt(i);
7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        if (portIndex == kPortIndexInput && mCrypto != NULL) {
741ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                            info.mEncryptedData =
742ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                new ABuffer(info.mData->capacity());
743ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                        }
744ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        buffers->push_back(info);
7465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (portIndex == kPortIndexOutput) {
7495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (mState == STARTING) {
7505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // We're always allocating output buffers after
7515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // allocating input buffers, so this is a good
7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // indication that now all buffers are allocated.
7535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
7545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            (new AMessage)->postReply(mReplyID);
7555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        } else {
7565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagOutputBuffersChanged;
757575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
7585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
7595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
76392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatOutputFormatChanged:
7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("codec output format changed");
7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if ((mFlags & kFlagIsSoftwareCodec)
7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            && mNativeWindow != NULL) {
7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        AString mime;
7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(msg->findString("mime", &mime));
7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (!strncasecmp("video/", mime.c_str(), 6)) {
7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            delete mSoftRenderer;
7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer = NULL;
7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t width, height;
7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("width", &width));
7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("height", &height));
7795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7806539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                            int32_t cropLeft, cropTop, cropRight, cropBottom;
7816539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                            CHECK(msg->findRect("crop",
7826539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                                &cropLeft, &cropTop, &cropRight, &cropBottom));
7836539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo
7845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t colorFormat;
7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32(
7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                        "color-format", &colorFormat));
7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sp<MetaData> meta = new MetaData;
7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyWidth, width);
7905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyHeight, height);
7916539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                            meta->setRect(kKeyCropRect,
7926539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo                                cropLeft, cropTop, cropRight, cropBottom);
7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyColorFormat, colorFormat);
7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer =
7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                new SoftwareRenderer(mNativeWindow, meta);
7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mOutputFormat = msg;
801e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
802e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    if (mFlags & kFlagIsEncoder) {
803e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // Before we announce the format change we should
804e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // collect codec specific data and amend the output
805e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // format as necessary.
806e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        mFlags |= kFlagGatherCodecSpecificData;
807e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    } else {
808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        mFlags |= kFlagOutputFormatChanged;
809e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        postActivityNotificationIfPossible();
810e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    }
8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
81492cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatFillThisBuffer:
8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexInput, msg);
8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
818c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
819c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
820c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
8215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexInput);
8225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
8235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
8245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    if (!mCSD.empty()) {
8268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        ssize_t index = dequeuePortBuffer(kPortIndexInput);
8278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        CHECK_GE(index, 0);
8288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // If codec specific data had been specified as
8308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // part of the format in the call to configure and
8318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // if there's more csd left, we submit it here
8328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // clients only get access to input buffers once
8338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // this data has been exhausted.
8348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        status_t err = queueCSDInputBuffer(index);
8368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8378ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        if (err != OK) {
8388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            ALOGE("queueCSDInputBuffer failed w/ error %d",
8398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                                  err);
8408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            mFlags |= kFlagStickyError;
842575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
843575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
8448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            cancelPendingDequeueOperations();
8458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        }
8468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        break;
8478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    }
8488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueInputPending) {
8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));
8515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueInputTimeoutGeneration;
8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueInputPending;
8545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueInputReplyID = 0;
855575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
856575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
86192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatDrainThisBuffer:
8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexOutput, msg);
8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
865c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
866c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
867c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
8685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexOutput);
8695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
8715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    sp<ABuffer> buffer;
8732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    CHECK(msg->findBuffer("buffer", &buffer));
8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxFlags;
8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("flags", &omxFlags));
8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    buffer->meta()->setInt32("omxFlags", omxFlags);
8795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
880e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    if (mFlags & kFlagGatherCodecSpecificData) {
881e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // This is the very first output buffer after a
882e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // format change was signalled, it'll either contain
883e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // the one piece of codec specific data we can expect
884e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        // or there won't be codec specific data.
885e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) {
886e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                            status_t err =
887e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                                amendOutputFormatWithCodecSpecificData(buffer);
888e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
889e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                            if (err != OK) {
890e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                                ALOGE("Codec spit out malformed codec "
891e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                                      "specific data!");
892e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                            }
893e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        }
894e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
895e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        mFlags &= ~kFlagGatherCodecSpecificData;
896e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                        mFlags |= kFlagOutputFormatChanged;
897e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    }
898e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueOutputPending) {
9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID));
9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueOutputTimeoutGeneration;
9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueOutputPending;
9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueOutputReplyID = 0;
905575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
906575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
908575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
91292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatEOS:
9135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // We already notify the client of this by using the
9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // corresponding flag in "onOutputBufferReady".
9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
91992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatShutdownCompleted:
9205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
921c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == STOPPING) {
922c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(INITIALIZED);
923c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    } else {
924c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        CHECK_EQ(mState, RELEASING);
925c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(UNINITIALIZED);
926c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    }
9275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
9295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
93292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar                case CodecBase::kWhatFlushCompleted:
9335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, FLUSHING);
9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(STARTED);
9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mCodec->signalResume();
9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                default:
9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    TRESPASS();
9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatInit:
9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNINITIALIZED) {
9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
9635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(INITIALIZING);
9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            AString name;
9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findString("name", &name));
9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t nameIsType;
9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t encoder = false;
9700db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            CHECK(msg->findInt32("nameIsType", &nameIsType));
9710db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            if (nameIsType) {
9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK(msg->findInt32("encoder", &encoder));
9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format = new AMessage;
9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (nameIsType) {
9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("mime", name.c_str());
9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", encoder);
9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("componentName", name.c_str());
9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateAllocateComponent(format);
9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatConfigure:
9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != INITIALIZED) {
9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<RefBase> obj;
10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (!msg->findObject("native-window", &obj)) {
10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                obj.clear();
10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format;
10075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("format", &format));
10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (obj != NULL) {
10105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setObject("native-window", obj);
10111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
10127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                status_t err = setNativeWindow(
10137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    static_cast<NativeWindowWrapper *>(obj.get())
10147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                        ->getSurfaceTextureClient());
10157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
10167541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                if (err != OK) {
10177541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    sp<AMessage> response = new AMessage;
10187541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->setInt32("err", err);
10197541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
10207541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->postReply(replyID);
10217541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    break;
10221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                }
10231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            } else {
10247541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                setNativeWindow(NULL);
10251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            }
10261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
10277541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            mReplyID = replyID;
10287541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            setState(CONFIGURING);
10297541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
10301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            void *crypto;
10311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            if (!msg->findPointer("crypto", &crypto)) {
10321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                crypto = NULL;
10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            mCrypto = static_cast<ICrypto *>(crypto);
10361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags;
10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("flags", (int32_t *)&flags));
10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (flags & CONFIGURE_FLAG_ENCODE) {
10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", true);
1042e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                mFlags |= kFlagIsEncoder;
10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            extractCSD(format);
10468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateConfigureComponent(format);
10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case kWhatCreateInputSurface:
10527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
10537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            uint32_t replyID;
10547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK(msg->senderAwaitsResponse(&replyID));
10557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
10567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            // Must be configured, but can't have been started yet.
10577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (mState != CONFIGURED) {
10587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                sp<AMessage> response = new AMessage;
10597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->setInt32("err", INVALID_OPERATION);
10607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
10617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->postReply(replyID);
10627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                break;
10637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
10647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
10657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mReplyID = replyID;
10667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mCodec->initiateCreateInputSurface();
10677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            break;
10687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
10697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
10705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStart:
10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != CONFIGURED) {
10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(STARTING);
10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateStart();
10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStop:
1091c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        case kWhatRelease:
1092c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        {
1093aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            State targetState =
1094aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                (msg->what() == kWhatStop) ? INITIALIZED : UNINITIALIZED;
1095aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
1096c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            uint32_t replyID;
1097c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1098c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1099c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            if (mState != INITIALIZED
1100c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    && mState != CONFIGURED && mState != STARTED) {
110103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // We may be in "UNINITIALIZED" state already without the
110203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // client being aware of this if media server died while
110303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // we were being stopped. The client would assume that
110403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // after stop() returned, it would be safe to call release()
110503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // and it should be in this case, no harm to allow a release()
110603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                // if we're already uninitialized.
1107aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                // Similarly stopping a stopped MediaCodec should be benign.
1108c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                sp<AMessage> response = new AMessage;
110903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                response->setInt32(
111003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber                        "err",
1111aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                        mState == targetState ? OK : INVALID_OPERATION);
1112c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1113c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                response->postReply(replyID);
1114c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                break;
1115c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            }
1116c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1117aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            if (mFlags & kFlagSawMediaServerDie) {
1118aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                // It's dead, Jim. Don't expect initiateShutdown to yield
1119aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                // any useful results now...
1120aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                setState(UNINITIALIZED);
1121aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                (new AMessage)->postReply(replyID);
1122aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                break;
1123aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            }
1124aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
1125c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            mReplyID = replyID;
1126aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            setState(msg->what() == kWhatStop ? STOPPING : RELEASING);
1127aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
1128aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber            mCodec->initiateShutdown(
1129aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber                    msg->what() == kWhatStop /* keepComponentAllocated */);
1130c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputBuffer:
11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11406507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden            if (mHaveInputSurface) {
11416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                ALOGE("dequeueInputBuffer can't be used with input surface");
11426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                sp<AMessage> response = new AMessage;
11436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                response->setInt32("err", INVALID_OPERATION);
11446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                response->postReply(replyID);
11456507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                break;
11466507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden            }
11476507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueInputBuffer(replyID, true /* new request */)) {
11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueInputPending;
11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = replyID;
11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueInputTimedOut, id());
11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueInputTimeoutGeneration);
11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputTimedOut:
11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
11795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueInputTimeoutGeneration) {
11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueInputPending);
11865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
11895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueInputReplyID);
11905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11915778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueInputPending;
11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = 0;
11935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatQueueInputBuffer:
11975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onQueueInputBuffer(msg);
12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputBuffer:
12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueOutputBuffer(replyID, true /* new request */)) {
12235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
12305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueOutputPending;
12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = replyID;
12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueOutputTimedOut, id());
12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueOutputTimeoutGeneration);
12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputTimedOut:
12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueOutputTimeoutGeneration) {
12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueOutputPending);
12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueOutputReplyID);
12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueOutputPending;
12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = 0;
12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatReleaseOutputBuffer:
12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onReleaseOutputBuffer(msg);
12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case kWhatSignalEndOfInputStream:
12927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
12937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            uint32_t replyID;
12947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK(msg->senderAwaitsResponse(&replyID));
12957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
12967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                sp<AMessage> response = new AMessage;
12987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->setInt32("err", INVALID_OPERATION);
12997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
13007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->postReply(replyID);
13017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                break;
13027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
13037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
13047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mReplyID = replyID;
13057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mCodec->signalEndOfInputStream();
13067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            break;
13077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
13087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetBuffers:
13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
13165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
13175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
13215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t portIndex;
13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("portIndex", &portIndex));
13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            Vector<sp<ABuffer> > *dstBuffers;
13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findPointer("buffers", (void **)&dstBuffers));
13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            dstBuffers->clear();
13295778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex];
13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            for (size_t i = 0; i < srcBuffers.size(); ++i) {
13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                const BufferInfo &info = srcBuffers.itemAt(i);
13335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1334ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                dstBuffers->push_back(
13351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        (portIndex == kPortIndexInput && mCrypto != NULL)
1336ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                ? info.mEncryptedData : info.mData);
13375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
13385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            (new AMessage)->postReply(replyID);
13405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
13415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
13425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatFlush:
13445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
13455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
13465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
13475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
13495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
13505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(FLUSHING);
13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->signalFlush();
13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
13635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1364e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar        case kWhatGetInputFormat:
13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetOutputFormat:
13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
1367e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar            sp<AMessage> format =
1368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                (msg->what() == kWhatGetOutputFormat ? mOutputFormat : mInputFormat);
1369e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar
13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
13725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1373e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar            if ((mState != CONFIGURED && mState != STARTING &&
1374e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                 mState != STARTED && mState != FLUSHING)
1375972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo                    || (mFlags & kFlagStickyError)
1376e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar                    || format == NULL) {
13775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
1385e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar            response->setMessage("format", format);
13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
13895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1390496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        case kWhatRequestIDRFrame:
1391496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        {
1392496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            mCodec->signalRequestIDRFrame();
1393496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            break;
1394496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        }
1395496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
1396575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        case kWhatRequestActivityNotification:
1397575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        {
1398575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(mActivityNotify == NULL);
1399575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(msg->findMessage("notify", &mActivityNotify));
1400575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1401575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            postActivityNotificationIfPossible();
1402575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            break;
1403575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        }
1404575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1405717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        case kWhatGetName:
1406717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        {
1407717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            uint32_t replyID;
1408717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            CHECK(msg->senderAwaitsResponse(&replyID));
1409717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1410717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            if (mComponentName.empty()) {
1411717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                sp<AMessage> response = new AMessage;
1412717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                response->setInt32("err", INVALID_OPERATION);
1413717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1414717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                response->postReply(replyID);
1415717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                break;
1416717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            }
1417717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1418717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            sp<AMessage> response = new AMessage;
1419717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            response->setString("name", mComponentName.c_str());
1420717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            response->postReply(replyID);
1421717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            break;
1422717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        }
1423717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1424a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        case kWhatSetParameters:
1425a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        {
1426a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            uint32_t replyID;
1427a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1428a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1429a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            sp<AMessage> params;
1430a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            CHECK(msg->findMessage("params", &params));
1431a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1432a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            status_t err = onSetParameters(params);
1433a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1434a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            sp<AMessage> response = new AMessage;
1435a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            response->setInt32("err", err);
1436a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1437a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            response->postReply(replyID);
1438a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            break;
1439a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        }
1440a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        default:
14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            TRESPASS();
14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14468ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) {
14478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.clear();
14488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    size_t i = 0;
14508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    for (;;) {
14518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        sp<ABuffer> csd;
14528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) {
14538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            break;
14548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        }
14558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        mCSD.push_back(csd);
14578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        ++i;
14588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
14598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
1460a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn    ALOGV("Found %zu pieces of codec specific data.", mCSD.size());
14618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
14628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) {
14648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    CHECK(!mCSD.empty());
14658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    BufferInfo *info =
14678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex);
14688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<ABuffer> csd = *mCSD.begin();
14708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.erase(mCSD.begin());
14718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    const sp<ABuffer> &codecInputData =
14738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        (mCrypto != NULL) ? info->mEncryptedData : info->mData;
14748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    if (csd->size() > codecInputData->capacity()) {
14768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        return -EINVAL;
14778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
14788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    memcpy(codecInputData->data(), csd->data(), csd->size());
14808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    AString errorDetailMsg;
14828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
14848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("index", bufferIndex);
14858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("offset", 0);
14868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("size", csd->size());
14878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt64("timeUs", 0ll);
14888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG);
14898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setPointer("errorDetailMsg", &errorDetailMsg);
14908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    return onQueueInputBuffer(msg);
14928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
14938ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
14945778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) {
14957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (newState == INITIALIZED || newState == UNINITIALIZED) {
14965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        delete mSoftRenderer;
14975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mSoftRenderer = NULL;
14985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14991bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        mCrypto.clear();
15007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        setNativeWindow(NULL);
15015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mOutputFormat.clear();
15035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
15045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
15055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagStickyError;
1506e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        mFlags &= ~kFlagIsEncoder;
1507e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        mFlags &= ~kFlagGatherCodecSpecificData;
1508575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1509575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1512717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    if (newState == UNINITIALIZED) {
1513717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        mComponentName.clear();
1514aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber
1515aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        // The component is gone, mediaserver's probably back up already
1516aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        // but should definitely be back up should we try to instantiate
1517aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        // another component.. and the cycle continues.
1518aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber        mFlags &= ~kFlagSawMediaServerDie;
1519717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    }
1520717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mState = newState;
15225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    cancelPendingDequeueOperations();
15245778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15265778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() {
15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexInput);
15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexOutput);
15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15315778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) {
15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
15385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mNotify != NULL) {
15405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> msg = info->mNotify;
15415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mNotify = NULL;
15425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mOwnedByClient = false;
15435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (portIndex == kPortIndexInput) {
15457fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar                /* no error, just returning buffers */
15467fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar                msg->setInt32("err", OK);
15475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
15485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            msg->post();
15495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
15505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mAvailPortBuffers[portIndex].clear();
15535778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15555778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers(
15565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t portIndex, const sp<AMessage> &msg) {
15575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
15585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1559609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    uint32_t bufferID;
1560609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID));
15615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
15635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
15655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
15665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mBufferID == bufferID) {
15685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(info->mNotify == NULL);
15695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("reply", &info->mNotify));
15705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mAvailPortBuffers[portIndex].push_back(i);
15725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return i;
15745778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    TRESPASS();
15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return 0;
15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) {
15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t offset;
15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t size;
15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t timeUs;
15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t flags;
15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("offset", &offset));
15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt64("timeUs", &timeUs));
15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt32("flags", (int32_t *)&flags));
15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const CryptoPlugin::SubSample *subSamples;
15944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    size_t numSubSamples;
15954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *key;
15964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *iv;
15974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted;
15984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // We allow the simpler queueInputBuffer API to be used even in
16004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // secure mode, by fabricating a single unencrypted subSample.
16014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::SubSample ss;
16024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    if (msg->findSize("size", &size)) {
16044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto != NULL) {
16054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfClearData = size;
16064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfEncryptedData = 0;
16074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            subSamples = &ss;
16094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            numSubSamples = 1;
16104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            key = NULL;
16114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            iv = NULL;
16124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
16134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    } else {
16144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto == NULL) {
16154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            return -EINVAL;
16164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
16174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("subSamples", (void **)&subSamples));
16194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findSize("numSubSamples", &numSubSamples));
16204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("key", (void **)&key));
16214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("iv", (void **)&iv));
16224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int32_t tmp;
16244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findInt32("mode", &tmp));
16254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        mode = (CryptoPlugin::Mode)tmp;
16274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size = 0;
16294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        for (size_t i = 0; i < numSubSamples; ++i) {
16304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfClearData;
16314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfEncryptedData;
16324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
16334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    }
16344b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
16355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexInput].size()) {
16365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
16375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index);
16405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
16425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
16435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (offset + size > info->mData->capacity()) {
16465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
16475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> reply = info->mNotify;
16505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->setRange(offset, size);
16515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->meta()->setInt64("timeUs", timeUs);
16525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_EOS) {
16545778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("eos", true);
16555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_CODECCONFIG) {
16585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("csd", true);
16595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (mCrypto != NULL) {
16621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        if (size > info->mEncryptedData->capacity()) {
16631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            return -ERANGE;
1664ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1665ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
16665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg;
16675b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg));
16685b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
1669fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        ssize_t result = mCrypto->decrypt(
16701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                (mFlags & kFlagIsSecure) != 0,
16711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                key,
16721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                iv,
16731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                mode,
16741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                info->mEncryptedData->base() + offset,
16754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                subSamples,
16764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                numSubSamples,
16775b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                info->mData->base(),
16785b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                errorDetailMsg);
16791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1680fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        if (result < 0) {
1681fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            return result;
1682ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1683ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1684fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        info->mData->setRange(0, result);
1685ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
1686ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
16872d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", info->mData);
16885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    reply->post();
16895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16905b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mNotify = NULL;
16915b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mOwnedByClient = false;
16925b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
16935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
16945778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
16955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16965778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) {
16975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
16985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
16995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t render;
17015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!msg->findInt32("render", &render)) {
17025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        render = 0;
17035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED) {
17065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
17075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexOutput].size()) {
17105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
17115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);
17145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
17165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
17175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
171979ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou    if (render && info->mData != NULL && info->mData->size() != 0) {
17205778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mNotify->setInt32("render", true);
17215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1722fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar        int64_t timestampNs = 0;
1723fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar        if (msg->findInt64("timestampNs", &timestampNs)) {
1724fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            info->mNotify->setInt64("timestampNs", timestampNs);
1725fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar        } else {
1726fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            // TODO: it seems like we should use the timestamp
1727fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            // in the (media)buffer as it potentially came from
1728fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            // an input surface, but we did not propagate it prior to
1729fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            // API 20.  Perhaps check for target SDK version.
1730fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0
1731fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            if (info->mData->meta()->findInt64("timeUs", &timestampNs)) {
173247aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar                ALOGV("using buffer PTS of %" PRId64, timestampNs);
1733fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar                timestampNs *= 1000;
1734fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar            }
1735fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif
1736fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar        }
1737fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar
17385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mSoftRenderer != NULL) {
17395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mSoftRenderer->render(
1740fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar                    info->mData->data(), info->mData->size(), timestampNs, NULL);
17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify->post();
17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify = NULL;
17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = false;
17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
17505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17515778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) {
17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> *availBuffers = &mAvailPortBuffers[portIndex];
17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (availBuffers->empty()) {
17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EAGAIN;
17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index = *availBuffers->begin();
17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    availBuffers->erase(availBuffers->begin());
17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index);
17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(!info->mOwnedByClient);
17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = true;
17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return index;
17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
17695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
17707541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow(
17711a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        const sp<Surface> &surfaceTextureClient) {
17727541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    status_t err;
17737541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17747541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (mNativeWindow != NULL) {
17757541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_disconnect(
17767541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA);
17777541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17787541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
17797541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGW("native_window_api_disconnect returned an error: %s (%d)",
17807541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
17817541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
17827541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17837541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow.clear();
17847541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
17857541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (surfaceTextureClient != NULL) {
17877541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_connect(
17887541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA);
17897541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17907541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
17917541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGE("native_window_api_connect returned an error: %s (%d)",
17927541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
17937541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            return err;
17957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
17967541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
17977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow = surfaceTextureClient;
17987541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
17997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
18007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    return OK;
18017541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber}
18027541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
1803575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() {
1804575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if (mActivityNotify == NULL) {
1805575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        return;
1806575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1807575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1808575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if ((mFlags & (kFlagStickyError
1809575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputBuffersChanged
1810575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputFormatChanged))
1811575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexInput].empty()
1812575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexOutput].empty()) {
1813575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify->post();
1814575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
1815575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1816575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
1817575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1818a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> &params) {
1819a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetParameters, id());
1820a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    msg->setMessage("params", params);
1821a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1822a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    sp<AMessage> response;
1823a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    return PostAndAwaitResponse(msg, &response);
1824a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber}
1825a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1826a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> &params) {
1827a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    mCodec->signalSetParameters(params);
1828a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1829a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    return OK;
1830a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber}
1831a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1832e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatus_t MediaCodec::amendOutputFormatWithCodecSpecificData(
1833e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        const sp<ABuffer> &buffer) {
1834e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    AString mime;
1835e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    CHECK(mOutputFormat->findString("mime", &mime));
1836e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1837e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) {
1838e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // Codec specific data should be SPS and PPS in a single buffer,
1839e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // each prefixed by a startcode (0x00 0x00 0x00 0x01).
1840e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // We separate the two and put them into the output format
1841e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // under the keys "csd-0" and "csd-1".
1842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        unsigned csdIndex = 0;
1844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1845e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        const uint8_t *data = buffer->data();
1846e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        size_t size = buffer->size();
1847e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1848e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        const uint8_t *nalStart;
1849e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        size_t nalSize;
1850e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) {
1851e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            sp<ABuffer> csd = new ABuffer(nalSize + 4);
1852e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            memcpy(csd->data(), "\x00\x00\x00\x01", 4);
1853e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            memcpy(csd->data() + 4, nalStart, nalSize);
1854e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1855e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            mOutputFormat->setBuffer(
1856e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber                    StringPrintf("csd-%u", csdIndex).c_str(), csd);
1857e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1858e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            ++csdIndex;
1859e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        }
1860e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1861e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        if (csdIndex != 2) {
1862e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber            return ERROR_MALFORMED;
1863e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        }
1864e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    } else {
1865e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // For everything else we just stash the codec specific data into
1866e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        // the output format as a single piece of csd under "csd-0".
1867e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber        mOutputFormat->setBuffer("csd-0", buffer);
1868e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    }
1869e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
1870e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber    return OK;
1871e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}
1872e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber
18735778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
1874