MediaCodec.cpp revision 7cd58537932ef6f481f68be0b9c597a89cebdfec
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>
205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h>
225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "include/SoftwareRenderer.h"
245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
251a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h>
26ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h>
275778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h>
285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h>
295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h>
305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h>
31ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/hexdump.h>
325778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/ACodec.h>
337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h>
345778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h>
355778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h>
365778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h>
375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
385778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
405778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
415778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType(
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ALooper> &looper, const char *mime, bool encoder) {
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<MediaCodec> codec = new MediaCodec(looper);
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (codec->init(mime, true /* nameIsType */, encoder) != OK) {
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return codec;
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
515778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
525778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName(
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ALooper> &looper, const char *name) {
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<MediaCodec> codec = new MediaCodec(looper);
555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) {
565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return codec;
605778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
625778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper)
635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    : mState(UNINITIALIZED),
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mLooper(looper),
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mCodec(new ACodec),
667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden      mReplyID(0),
675778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mFlags(0),
685778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mSoftRenderer(NULL),
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueInputTimeoutGeneration(0),
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueInputReplyID(0),
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueOutputTimeoutGeneration(0),
725778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueOutputReplyID(0) {
735778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
755778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() {
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, UNINITIALIZED);
775778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
795778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
805778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse(
815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &msg, sp<AMessage> *response) {
825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = msg->postAndAwaitResponse(response);
835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!(*response)->findInt32("err", &err)) {
895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = OK;
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return err;
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
955778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) {
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // Current video decoders do not return from OMX_FillThisBuffer
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // quickly, violating the OpenMAX specs, until that is remedied
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // we need to invest in an extra looper to free the main event
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // queue.
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool needDedicatedLooper = false;
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType && !strncasecmp(name, "video/", 6)) {
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        needDedicatedLooper = true;
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (!nameIsType && !strncmp(name, "OMX.TI.DUCATI1.VIDEO.", 21)) {
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        needDedicatedLooper = true;
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (needDedicatedLooper) {
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mCodecLooper == NULL) {
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper = new ALooper;
1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->setName("CodecLooper");
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper->registerHandler(mCodec);
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mLooper->registerHandler(mCodec);
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mLooper->registerHandler(this);
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id()));
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatInit, id());
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setString("name", name);
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("nameIsType", nameIsType);
1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType) {
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        msg->setInt32("encoder", encoder);
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure(
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &format,
1371a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        const sp<Surface> &nativeWindow,
1381bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        const sp<ICrypto> &crypto,
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags) {
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatConfigure, id());
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setMessage("format", format);
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nativeWindow != NULL) {
1461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setObject(
1471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                "native-window",
1481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                new NativeWindowWrapper(nativeWindow));
1491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    }
1501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (crypto != NULL) {
1521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setPointer("crypto", crypto.get());
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface(
1607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<IGraphicBufferProducer>* bufferProducer) {
1617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id());
1627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    // TODO(fadden): require MediaFormat colorFormat == AndroidOpaque
1647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> response;
1667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t err = PostAndAwaitResponse(msg, &response);
1677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    if (err == NO_ERROR) {
1687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        // unwrap the sp<IGraphicBufferProducer>
1697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<RefBase> obj;
1707cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        bool found = response->findObject("input-surface", &obj);
1717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        CHECK(found);
1727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<BufferProducerWrapper> wrapper(
1737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                static_cast<BufferProducerWrapper*>(obj.get()));
1747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        *bufferProducer = wrapper->getBufferProducer();
1757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    } else {
1767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        ALOGW("createInputSurface failed, err=%d", err);
1777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    }
1787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return err;
1797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
1807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() {
1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStart, id());
1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1885778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() {
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStop, id());
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
195c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() {
196c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRelease, id());
197c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
198c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> response;
199c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    return PostAndAwaitResponse(msg, &response);
200c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}
201c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer(
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t index,
2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t offset,
2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t size,
2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t presentationTimeUs,
2075b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2085b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2095b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2105b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2115b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2125b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("offset", offset);
2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("size", size);
2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
2195b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer(
2264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t index,
2274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t offset,
2284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const CryptoPlugin::SubSample *subSamples,
2294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t numSubSamples,
2304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t key[16],
2314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t iv[16],
2324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CryptoPlugin::Mode mode,
2334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int64_t presentationTimeUs,
2345b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2355b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2365b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2375b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2385b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2395b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2404b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2414b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("index", index);
2424b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("offset", offset);
2434b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("subSamples", (void *)subSamples);
2444b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("numSubSamples", numSubSamples);
2454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("key", (void *)key);
2464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("iv", (void *)iv);
2474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("mode", mode);
2484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("flags", flags);
2505b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2524b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> response;
2535b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    status_t err = PostAndAwaitResponse(msg, &response);
2545b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2555b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    return err;
2564b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber}
2574b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) {
2597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    // TODO(fadden): fail if an input Surface has been configured
2607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id());
2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2755778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer(
2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *index,
2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *offset,
2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *size,
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t *presentationTimeUs,
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t *flags,
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeoutUs) {
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id());
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("offset", offset));
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("size", size));
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt64("timeUs", presentationTimeUs));
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt32("flags", (int32_t *)flags));
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) {
3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("render", true);
3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) {
3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() {
3187cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id());
3197cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> response;
3217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return PostAndAwaitResponse(msg, &response);
3227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
3237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const {
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id());
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findMessage("format", format));
3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
338717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const {
339717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    sp<AMessage> msg = new AMessage(kWhatGetName, id());
340717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
341717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    sp<AMessage> response;
342717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t err;
343717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
344717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        return err;
345717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    }
346717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
347717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    CHECK(response->findString("name", name));
348717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
349717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    return OK;
350717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo}
351717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
3525778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const {
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexInput);
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3615778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const {
3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexOutput);
3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3705778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() {
3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatFlush, id());
3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
377496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() {
378496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    (new AMessage(kWhatRequestIDRFrame, id()))->post();
379496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
380496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    return OK;
381496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber}
382496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
383575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> &notify) {
384575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id());
385575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->setMessage("notify", notify);
386575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->post();
387575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
388575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber////////////////////////////////////////////////////////////////////////////////
3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3915778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() {
3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueInputPending) {
3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueInputReplyID);
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueInputTimeoutGeneration;
3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueInputReplyID = 0;
3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueInputPending;
4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueOutputPending) {
4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueOutputReplyID);
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueOutputTimeoutGeneration;
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueOutputReplyID = 0;
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueOutputPending;
4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4135778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) {
4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueInputPending))) {
4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(replyID);
4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return true;
4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t index = dequeuePortBuffer(kPortIndexInput);
4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index < 0) {
4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(index, -EAGAIN);
4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return false;
4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->setSize("index", index);
4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4395778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) {
4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueOutputPending))) {
4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputBuffersChanged) {
4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED);
4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputFormatChanged) {
4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_FORMAT_CHANGED);
4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ssize_t index = dequeuePortBuffer(kPortIndexOutput);
4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (index < 0) {
4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(index, -EAGAIN);
4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return false;
4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ABuffer> &buffer =
4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mPortBuffers[kPortIndexOutput].itemAt(index).mData;
4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("index", index);
4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("offset", buffer->offset());
4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("size", buffer->size());
4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeUs;
4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt64("timeUs", timeUs);
4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t omxFlags;
4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags));
4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags = 0;
4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) {
4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_SYNCFRAME;
4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) {
4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_CODECCONFIG;
4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_EOS) {
4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_EOS;
4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("flags", flags);
4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4945778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    switch (msg->what()) {
4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatCodecNotify:
4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t what;
4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("what", &what));
5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            switch (what) {
5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatError:
5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxError, internalError;
5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("omx-error", &omxError));
5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("err", &internalError));
5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGE("Codec reported an error. "
5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          "(omx error 0x%08x, internalError %d)",
5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          omxError, internalError);
5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    bool sendErrorReponse = true;
5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    switch (mState) {
5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case INITIALIZING:
5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(UNINITIALIZED);
5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case CONFIGURING:
5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(INITIALIZED);
5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTING:
5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(CONFIGURED);
5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STOPPING:
534c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        case RELEASING:
5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // Ignore the error, assuming we'll still get
5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // the shutdown complete notification.
5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case FLUSHING:
5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTED:
5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
554575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            cancelPendingDequeueOperations();
5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        default:
5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
565575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (sendErrorReponse) {
5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        sp<AMessage> response = new AMessage;
5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->setInt32("err", UNKNOWN_ERROR);
5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->postReply(mReplyID);
5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatComponentAllocated:
5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, INITIALIZING);
5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(INITIALIZED);
5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
584717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    CHECK(msg->findString("componentName", &mComponentName));
5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
586717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    if (mComponentName.startsWith("OMX.google.")) {
5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags |= kFlagIsSoftwareCodec;
5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    } else {
5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagIsSoftwareCodec;
5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
592717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    if (mComponentName.endsWith(".secure")) {
5931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags |= kFlagIsSecure;
5941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    } else {
5951bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags &= ~kFlagIsSecure;
5961bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    }
5971bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatComponentConfigured:
6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, CONFIGURING);
6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(CONFIGURED);
6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                case ACodec::kWhatInputSurfaceCreated:
6127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                {
6137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    // response to ACodec::kWhatCreateInputSurface
6147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    status_t err = NO_ERROR;
6157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    sp<AMessage> response = new AMessage();
6167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    if (!msg->findInt32("err", &err)) {
6177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        sp<RefBase> obj;
6187cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        msg->findObject("input-surface", &obj);
6197cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        CHECK(obj != NULL);
6207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setObject("input-surface", obj);
6217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    } else {
6227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setInt32("err", err);
6237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    }
6247cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    response->postReply(mReplyID);
6257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    break;
6267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                }
6277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
6287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                case ACodec::kWhatSignaledInputEOS:
6297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                {
6307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    // response to ACodec::kWhatSignalEndOfInputStream
6317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    sp<AMessage> response = new AMessage();
6327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    status_t err;
6337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    if (msg->findInt32("err", &err)) {
6347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setInt32("err", err);
6357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    }
6367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    response->postReply(mReplyID);
6377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    break;
6387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                }
6397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
6407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatBuffersAllocated:
6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t portIndex;
6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("portIndex", &portIndex));
6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("%s buffers allocated",
6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          portIndex == kPortIndexInput ? "input" : "output");
6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(portIndex == kPortIndexInput
6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            || portIndex == kPortIndexOutput);
6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mPortBuffers[portIndex].clear();
6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
6555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
656eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<RefBase> obj;
657eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    CHECK(msg->findObject("portDesc", &obj));
658eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber
659eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<ACodec::PortDescription> portDesc =
660eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        static_cast<ACodec::PortDescription *>(obj.get());
6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
662eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    size_t numBuffers = portDesc->countBuffers();
6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
664eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    for (size_t i = 0; i < numBuffers; ++i) {
6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        BufferInfo info;
666eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mBufferID = portDesc->bufferIDAt(i);
6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        info.mOwnedByClient = false;
668eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mData = portDesc->bufferAt(i);
6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        if (portIndex == kPortIndexInput && mCrypto != NULL) {
671ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                            info.mEncryptedData =
672ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                new ABuffer(info.mData->capacity());
673ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                        }
674ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        buffers->push_back(info);
6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (portIndex == kPortIndexOutput) {
6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (mState == STARTING) {
6805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // We're always allocating output buffers after
6815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // allocating input buffers, so this is a good
6825778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // indication that now all buffers are allocated.
6835778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
6845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            (new AMessage)->postReply(mReplyID);
6855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        } else {
6865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagOutputBuffersChanged;
687575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
6885778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatOutputFormatChanged:
6945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("codec output format changed");
6965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if ((mFlags & kFlagIsSoftwareCodec)
6985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            && mNativeWindow != NULL) {
6995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        AString mime;
7005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(msg->findString("mime", &mime));
7015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (!strncasecmp("video/", mime.c_str(), 6)) {
7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            delete mSoftRenderer;
7045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer = NULL;
7055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t width, height;
7075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("width", &width));
7085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("height", &height));
7095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t colorFormat;
7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32(
7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                        "color-format", &colorFormat));
7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sp<MetaData> meta = new MetaData;
7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyWidth, width);
7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyHeight, height);
7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyColorFormat, colorFormat);
7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer =
7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                new SoftwareRenderer(mNativeWindow, meta);
7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mOutputFormat = msg;
7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mFlags |= kFlagOutputFormatChanged;
726575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    postActivityNotificationIfPossible();
7275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatFillThisBuffer:
7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexInput, msg);
7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
734c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
735c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
736c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexInput);
7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    if (!mCSD.empty()) {
7428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        ssize_t index = dequeuePortBuffer(kPortIndexInput);
7438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        CHECK_GE(index, 0);
7448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // If codec specific data had been specified as
7468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // part of the format in the call to configure and
7478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // if there's more csd left, we submit it here
7488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // clients only get access to input buffers once
7498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // this data has been exhausted.
7508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        status_t err = queueCSDInputBuffer(index);
7528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        if (err != OK) {
7548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            ALOGE("queueCSDInputBuffer failed w/ error %d",
7558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                                  err);
7568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            mFlags |= kFlagStickyError;
758575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
759575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
7608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            cancelPendingDequeueOperations();
7618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        }
7628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        break;
7638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    }
7648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueInputPending) {
7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));
7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueInputTimeoutGeneration;
7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueInputPending;
7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueInputReplyID = 0;
771575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
772575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatDrainThisBuffer:
7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexOutput, msg);
7805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
781c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
782c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
783c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
7845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexOutput);
7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7882d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    sp<ABuffer> buffer;
7892d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    CHECK(msg->findBuffer("buffer", &buffer));
7905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxFlags;
7925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("flags", &omxFlags));
7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    buffer->meta()->setInt32("omxFlags", omxFlags);
7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueOutputPending) {
7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID));
7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueOutputTimeoutGeneration;
8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueOutputPending;
8015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueOutputReplyID = 0;
802575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
803575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
8045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
805575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
8065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatEOS:
8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // We already notify the client of this by using the
8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // corresponding flag in "onOutputBufferReady".
8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatShutdownCompleted:
8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
818c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == STOPPING) {
819c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(INITIALIZED);
820c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    } else {
821c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        CHECK_EQ(mState, RELEASING);
822c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(UNINITIALIZED);
823c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    }
8245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
8265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatFlushCompleted:
8305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
8315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, FLUSHING);
8325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(STARTED);
8335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mCodec->signalResume();
8355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
8375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                default:
8415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    TRESPASS();
8425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
8445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
8455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatInit:
8475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
8485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
8495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNINITIALIZED) {
8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
8545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
8565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(INITIALIZING);
8615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            AString name;
8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findString("name", &name));
8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t nameIsType;
8665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t encoder = false;
8670db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            CHECK(msg->findInt32("nameIsType", &nameIsType));
8680db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            if (nameIsType) {
8695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK(msg->findInt32("encoder", &encoder));
8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format = new AMessage;
8735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (nameIsType) {
8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("mime", name.c_str());
8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", encoder);
8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("componentName", name.c_str());
8795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateAllocateComponent(format);
8825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
8835778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
8845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatConfigure:
8865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
8875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
8885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
8895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != INITIALIZED) {
8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
8935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
8955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
8965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<RefBase> obj;
8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (!msg->findObject("native-window", &obj)) {
9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                obj.clear();
9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format;
9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("format", &format));
9055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (obj != NULL) {
9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setObject("native-window", obj);
9081bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
9097541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                status_t err = setNativeWindow(
9107541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    static_cast<NativeWindowWrapper *>(obj.get())
9117541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                        ->getSurfaceTextureClient());
9127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
9137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                if (err != OK) {
9147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    sp<AMessage> response = new AMessage;
9157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->setInt32("err", err);
9167541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
9177541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->postReply(replyID);
9187541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    break;
9191bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                }
9201bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            } else {
9217541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                setNativeWindow(NULL);
9221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            }
9231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
9247541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            mReplyID = replyID;
9257541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            setState(CONFIGURING);
9267541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
9271bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            void *crypto;
9281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            if (!msg->findPointer("crypto", &crypto)) {
9291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                crypto = NULL;
9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            mCrypto = static_cast<ICrypto *>(crypto);
9331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags;
9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("flags", (int32_t *)&flags));
9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (flags & CONFIGURE_FLAG_ENCODE) {
9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", true);
9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            extractCSD(format);
9428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateConfigureComponent(format);
9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case kWhatCreateInputSurface:
9487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
9497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            uint32_t replyID;
9507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK(msg->senderAwaitsResponse(&replyID));
9517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
9527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            // Must be configured, but can't have been started yet.
9537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (mState != CONFIGURED) {
9547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                sp<AMessage> response = new AMessage;
9557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->setInt32("err", INVALID_OPERATION);
9567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
9577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->postReply(replyID);
9587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                break;
9597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
9607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
9617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mReplyID = replyID;
9627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mCodec->initiateCreateInputSurface();
9637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            break;
9647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
9657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStart:
9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != CONFIGURED) {
9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(STARTING);
9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateStart();
9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStop:
9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != INITIALIZED
9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    && mState != CONFIGURED && mState != STARTED) {
9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
10015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(STOPPING);
10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1003c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            mCodec->initiateShutdown(true /* keepComponentAllocated */);
1004c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            returnBuffersToCodec();
1005c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            break;
1006c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        }
1007c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1008c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        case kWhatRelease:
1009c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        {
1010c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            uint32_t replyID;
1011c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1012c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1013c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            if (mState != INITIALIZED
1014c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    && mState != CONFIGURED && mState != STARTED) {
1015c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                sp<AMessage> response = new AMessage;
1016c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                response->setInt32("err", INVALID_OPERATION);
1017c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1018c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                response->postReply(replyID);
1019c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                break;
1020c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            }
1021c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1022c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            mReplyID = replyID;
1023c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            setState(RELEASING);
1024c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
10255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateShutdown();
10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputBuffer:
10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            // TODO(fadden): make this fail if we're using an input Surface
10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueInputBuffer(replyID, true /* new request */)) {
10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueInputPending;
10515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = replyID;
10525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
10545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
10555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueInputTimedOut, id());
10565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
10575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueInputTimeoutGeneration);
10585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
10595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputTimedOut:
10645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
10665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
10675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueInputTimeoutGeneration) {
10695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
10705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueInputPending);
10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueInputReplyID);
10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueInputPending;
10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = 0;
10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatQueueInputBuffer:
10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
10925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
10945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onQueueInputBuffer(msg);
10985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
11015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
11025778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputBuffer:
11065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueOutputBuffer(replyID, true /* new request */)) {
11115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
11155778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
11165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
11185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
11195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueOutputPending;
11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = replyID;
11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueOutputTimedOut, id());
11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueOutputTimeoutGeneration);
11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputTimedOut:
11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
11405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
11415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueOutputTimeoutGeneration) {
11435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
11445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueOutputPending);
11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueOutputReplyID);
11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueOutputPending;
11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = 0;
11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatReleaseOutputBuffer:
11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onReleaseOutputBuffer(msg);
11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case kWhatSignalEndOfInputStream:
11807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
11817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            uint32_t replyID;
11827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK(msg->senderAwaitsResponse(&replyID));
11837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
11847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (mState != STARTED || (mFlags & kFlagStickyError)) {
11857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                sp<AMessage> response = new AMessage;
11867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->setInt32("err", INVALID_OPERATION);
11877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
11887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->postReply(replyID);
11897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                break;
11907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
11917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
11927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mReplyID = replyID;
11937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mCodec->signalEndOfInputStream();
11947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            break;
11957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
11967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
11975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetBuffers:
11985778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t portIndex;
12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("portIndex", &portIndex));
12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber            Vector<sp<ABuffer> > *dstBuffers;
12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findPointer("buffers", (void **)&dstBuffers));
12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber            dstBuffers->clear();
12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex];
12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            for (size_t i = 0; i < srcBuffers.size(); ++i) {
12205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                const BufferInfo &info = srcBuffers.itemAt(i);
12215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1222ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                dstBuffers->push_back(
12231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        (portIndex == kPortIndexInput && mCrypto != NULL)
1224ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                ? info.mEncryptedData : info.mData);
12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            (new AMessage)->postReply(replyID);
12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatFlush:
12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(FLUSHING);
12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->signalFlush();
12485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetOutputFormat:
12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if ((mState != STARTED && mState != FLUSHING)
1258972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo                    || (mFlags & kFlagStickyError)
1259972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo                    || mOutputFormat == NULL) {
12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setMessage("format", mOutputFormat);
12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1273496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        case kWhatRequestIDRFrame:
1274496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        {
1275496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            mCodec->signalRequestIDRFrame();
1276496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            break;
1277496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        }
1278496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
1279575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        case kWhatRequestActivityNotification:
1280575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        {
1281575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(mActivityNotify == NULL);
1282575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(msg->findMessage("notify", &mActivityNotify));
1283575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1284575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            postActivityNotificationIfPossible();
1285575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            break;
1286575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        }
1287575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1288717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        case kWhatGetName:
1289717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        {
1290717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            uint32_t replyID;
1291717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            CHECK(msg->senderAwaitsResponse(&replyID));
1292717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1293717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            if (mComponentName.empty()) {
1294717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                sp<AMessage> response = new AMessage;
1295717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                response->setInt32("err", INVALID_OPERATION);
1296717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1297717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                response->postReply(replyID);
1298717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                break;
1299717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            }
1300717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1301717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            sp<AMessage> response = new AMessage;
1302717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            response->setString("name", mComponentName.c_str());
1303717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            response->postReply(replyID);
1304717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            break;
1305717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        }
1306717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1307a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        case kWhatSetParameters:
1308a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        {
1309a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            uint32_t replyID;
1310a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1311a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1312a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            sp<AMessage> params;
1313a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            CHECK(msg->findMessage("params", &params));
1314a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1315a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            status_t err = onSetParameters(params);
1316a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1317a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            sp<AMessage> response = new AMessage;
1318a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            response->setInt32("err", err);
1319a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1320a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            response->postReply(replyID);
1321a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            break;
1322a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        }
1323a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        default:
13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            TRESPASS();
13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13298ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) {
13308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.clear();
13318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    size_t i = 0;
13338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    for (;;) {
13348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        sp<ABuffer> csd;
13358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) {
13368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            break;
13378ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        }
13388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        mCSD.push_back(csd);
13408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        ++i;
13418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
13428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    ALOGV("Found %u pieces of codec specific data.", mCSD.size());
13448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
13458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) {
13478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    CHECK(!mCSD.empty());
13488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    BufferInfo *info =
13508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex);
13518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<ABuffer> csd = *mCSD.begin();
13538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.erase(mCSD.begin());
13548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    const sp<ABuffer> &codecInputData =
13568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        (mCrypto != NULL) ? info->mEncryptedData : info->mData;
13578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    if (csd->size() > codecInputData->capacity()) {
13598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        return -EINVAL;
13608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
13618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    memcpy(codecInputData->data(), csd->data(), csd->size());
13638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    AString errorDetailMsg;
13658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
13678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("index", bufferIndex);
13688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("offset", 0);
13698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("size", csd->size());
13708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt64("timeUs", 0ll);
13718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG);
13728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setPointer("errorDetailMsg", &errorDetailMsg);
13738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    return onQueueInputBuffer(msg);
13758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
13768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13775778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) {
13787541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (newState == INITIALIZED || newState == UNINITIALIZED) {
13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        delete mSoftRenderer;
13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mSoftRenderer = NULL;
13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13821bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        mCrypto.clear();
13837541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        setNativeWindow(NULL);
13845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mOutputFormat.clear();
13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagStickyError;
1389575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1390575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
13915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
13925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1393717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    if (newState == UNINITIALIZED) {
1394717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        mComponentName.clear();
1395717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    }
1396717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
13975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mState = newState;
13985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    cancelPendingDequeueOperations();
14005778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14025778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() {
14035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexInput);
14045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexOutput);
14055778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14075778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) {
14085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
14095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
14115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
14135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
14145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mNotify != NULL) {
14165778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> msg = info->mNotify;
14175778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mNotify = NULL;
14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mOwnedByClient = false;
14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (portIndex == kPortIndexInput) {
14215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                msg->setInt32("err", ERROR_END_OF_STREAM);
14225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
14235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            msg->post();
14245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
14255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mAvailPortBuffers[portIndex].clear();
14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14305778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers(
14315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t portIndex, const sp<AMessage> &msg) {
14325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
14335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void *bufferID;
14355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findPointer("buffer-id", &bufferID));
14365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
14385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
14405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mBufferID == bufferID) {
14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(info->mNotify == NULL);
14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("reply", &info->mNotify));
14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mAvailPortBuffers[portIndex].push_back(i);
14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return i;
14495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
14505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    TRESPASS();
14535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return 0;
14555778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) {
14585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
14595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t offset;
14605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t size;
14615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t timeUs;
14625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t flags;
14635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
14645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("offset", &offset));
14655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt64("timeUs", &timeUs));
14665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt32("flags", (int32_t *)&flags));
14675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14684b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const CryptoPlugin::SubSample *subSamples;
14694b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    size_t numSubSamples;
14704b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *key;
14714b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *iv;
14724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted;
14734b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
14744b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // We allow the simpler queueInputBuffer API to be used even in
14754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // secure mode, by fabricating a single unencrypted subSample.
14764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::SubSample ss;
14774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
14784b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    if (msg->findSize("size", &size)) {
14794b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto != NULL) {
14804b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfClearData = size;
14814b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfEncryptedData = 0;
14824b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
14834b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            subSamples = &ss;
14844b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            numSubSamples = 1;
14854b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            key = NULL;
14864b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            iv = NULL;
14874b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
14884b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    } else {
14894b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto == NULL) {
14904b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            return -EINVAL;
14914b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
14924b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
14934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("subSamples", (void **)&subSamples));
14944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findSize("numSubSamples", &numSubSamples));
14954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("key", (void **)&key));
14964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("iv", (void **)&iv));
14974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
14984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int32_t tmp;
14994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findInt32("mode", &tmp));
15004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        mode = (CryptoPlugin::Mode)tmp;
15024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size = 0;
15044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        for (size_t i = 0; i < numSubSamples; ++i) {
15054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfClearData;
15064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfEncryptedData;
15074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
15084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    }
15094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexInput].size()) {
15115778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
15125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index);
15155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
15175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
15185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (offset + size > info->mData->capacity()) {
15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
15225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> reply = info->mNotify;
15255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->setRange(offset, size);
15265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->meta()->setInt64("timeUs", timeUs);
15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_EOS) {
15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("eos", true);
15305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_CODECCONFIG) {
15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("csd", true);
15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (mCrypto != NULL) {
15371bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        if (size > info->mEncryptedData->capacity()) {
15381bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            return -ERANGE;
1539ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1540ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
15415b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg;
15425b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg));
15435b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
1544fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        ssize_t result = mCrypto->decrypt(
15451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                (mFlags & kFlagIsSecure) != 0,
15461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                key,
15471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                iv,
15481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                mode,
15491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                info->mEncryptedData->base() + offset,
15504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                subSamples,
15514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                numSubSamples,
15525b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                info->mData->base(),
15535b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                errorDetailMsg);
15541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1555fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        if (result < 0) {
1556fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            return result;
1557ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1558ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1559fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        info->mData->setRange(0, result);
1560ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
1561ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
15622d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", info->mData);
15635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    reply->post();
15645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15655b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mNotify = NULL;
15665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mOwnedByClient = false;
15675b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
15685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
15695778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15715778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) {
15725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
15735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
15745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t render;
15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!msg->findInt32("render", &render)) {
15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber        render = 0;
15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED) {
15815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexOutput].size()) {
15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);
15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (render) {
15955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mNotify->setInt32("render", true);
15965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mSoftRenderer != NULL) {
15985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mSoftRenderer->render(
15995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    info->mData->data(), info->mData->size(), NULL);
16005778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
16015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify->post();
16045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify = NULL;
16055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = false;
16065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
16085778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
16095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16105778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) {
16115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
16125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> *availBuffers = &mAvailPortBuffers[portIndex];
16145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (availBuffers->empty()) {
16165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EAGAIN;
16175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index = *availBuffers->begin();
16205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    availBuffers->erase(availBuffers->begin());
16215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index);
16235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(!info->mOwnedByClient);
16245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = true;
16255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return index;
16275778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
16285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16297541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow(
16301a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        const sp<Surface> &surfaceTextureClient) {
16317541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    status_t err;
16327541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16337541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (mNativeWindow != NULL) {
16347541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_disconnect(
16357541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA);
16367541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16377541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
16387541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGW("native_window_api_disconnect returned an error: %s (%d)",
16397541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
16407541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
16417541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16427541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow.clear();
16437541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
16447541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16457541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (surfaceTextureClient != NULL) {
16467541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_connect(
16477541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA);
16487541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16497541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
16507541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGE("native_window_api_connect returned an error: %s (%d)",
16517541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
16527541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16537541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            return err;
16547541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
16557541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16567541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow = surfaceTextureClient;
16577541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
16587541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16597541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    return OK;
16607541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber}
16617541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
1662575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() {
1663575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if (mActivityNotify == NULL) {
1664575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        return;
1665575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1666575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1667575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if ((mFlags & (kFlagStickyError
1668575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputBuffersChanged
1669575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputFormatChanged))
1670575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexInput].empty()
1671575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexOutput].empty()) {
1672575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify->post();
1673575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
1674575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1675575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
1676575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1677a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> &params) {
1678a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetParameters, id());
1679a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    msg->setMessage("params", params);
1680a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1681a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    sp<AMessage> response;
1682a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    return PostAndAwaitResponse(msg, &response);
1683a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber}
1684a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1685a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> &params) {
1686a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    mCodec->signalSetParameters(params);
1687a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1688a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    return OK;
1689a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber}
1690a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
16915778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
1692