MediaCodec.cpp revision 6507d14c6d10f93d390de62b9eed267f9b544985
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),
726507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden      mDequeueOutputReplyID(0),
736507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden      mHaveInputSurface(false) {
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
765778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() {
775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, UNINITIALIZED);
785778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
815778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse(
825778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &msg, sp<AMessage> *response) {
835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = msg->postAndAwaitResponse(response);
845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!(*response)->findInt32("err", &err)) {
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = OK;
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return err;
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
965778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) {
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // Current video decoders do not return from OMX_FillThisBuffer
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // quickly, violating the OpenMAX specs, until that is remedied
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // we need to invest in an extra looper to free the main event
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // queue.
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool needDedicatedLooper = false;
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType && !strncasecmp(name, "video/", 6)) {
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        needDedicatedLooper = true;
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (!nameIsType && !strncmp(name, "OMX.TI.DUCATI1.VIDEO.", 21)) {
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        needDedicatedLooper = true;
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (needDedicatedLooper) {
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mCodecLooper == NULL) {
1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper = new ALooper;
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->setName("CodecLooper");
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper->registerHandler(mCodec);
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mLooper->registerHandler(mCodec);
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mLooper->registerHandler(this);
1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id()));
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatInit, id());
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setString("name", name);
1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("nameIsType", nameIsType);
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType) {
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        msg->setInt32("encoder", encoder);
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1365778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure(
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &format,
1381a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        const sp<Surface> &nativeWindow,
1391bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        const sp<ICrypto> &crypto,
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags) {
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatConfigure, id());
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setMessage("format", format);
1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nativeWindow != NULL) {
1471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setObject(
1481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                "native-window",
1491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                new NativeWindowWrapper(nativeWindow));
1501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    }
1511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (crypto != NULL) {
1531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setPointer("crypto", crypto.get());
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface(
1617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<IGraphicBufferProducer>* bufferProducer) {
1627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id());
1637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> response;
1657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t err = PostAndAwaitResponse(msg, &response);
1667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    if (err == NO_ERROR) {
1677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        // unwrap the sp<IGraphicBufferProducer>
1687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<RefBase> obj;
1697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        bool found = response->findObject("input-surface", &obj);
1707cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        CHECK(found);
1717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<BufferProducerWrapper> wrapper(
1727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                static_cast<BufferProducerWrapper*>(obj.get()));
1737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        *bufferProducer = wrapper->getBufferProducer();
1747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    } else {
1757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        ALOGW("createInputSurface failed, err=%d", err);
1767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    }
1777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return err;
1787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
1797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() {
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStart, id());
1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1875778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() {
1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStop, id());
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
194c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() {
195c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRelease, id());
196c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
197c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> response;
198c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    return PostAndAwaitResponse(msg, &response);
199c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}
200c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
2015778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer(
2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t index,
2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t offset,
2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t size,
2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t presentationTimeUs,
2065b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2075b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2085b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2095b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2105b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2115b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("offset", offset);
2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("size", size);
2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
2185b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer(
2254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t index,
2264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t offset,
2274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const CryptoPlugin::SubSample *subSamples,
2284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t numSubSamples,
2294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t key[16],
2304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t iv[16],
2314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CryptoPlugin::Mode mode,
2324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int64_t presentationTimeUs,
2335b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2345b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2355b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2365b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2375b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2385b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2394b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2404b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("index", index);
2414b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("offset", offset);
2424b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("subSamples", (void *)subSamples);
2434b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("numSubSamples", numSubSamples);
2444b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("key", (void *)key);
2454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("iv", (void *)iv);
2464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("mode", mode);
2474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("flags", flags);
2495b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> response;
2525b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    status_t err = PostAndAwaitResponse(msg, &response);
2535b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2545b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    return err;
2554b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber}
2564b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) {
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id());
2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2725778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer(
2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *index,
2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *offset,
2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *size,
2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t *presentationTimeUs,
2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t *flags,
2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeoutUs) {
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id());
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("offset", offset));
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("size", size));
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt64("timeUs", presentationTimeUs));
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt32("flags", (int32_t *)flags));
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) {
2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("render", true);
3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3065778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) {
3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() {
3157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id());
3167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    sp<AMessage> response;
3187cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return PostAndAwaitResponse(msg, &response);
3197cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
3207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3215778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const {
3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id());
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findMessage("format", format));
3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
335717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const {
336717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    sp<AMessage> msg = new AMessage(kWhatGetName, id());
337717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
338717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    sp<AMessage> response;
339717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    status_t err;
340717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
341717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        return err;
342717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    }
343717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
344717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    CHECK(response->findString("name", name));
345717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
346717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    return OK;
347717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo}
348717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
3495778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const {
3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexInput);
3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const {
3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexOutput);
3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3675778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() {
3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatFlush, id());
3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
374496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() {
375496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    (new AMessage(kWhatRequestIDRFrame, id()))->post();
376496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
377496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    return OK;
378496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber}
379496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
380575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> &notify) {
381575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id());
382575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->setMessage("notify", notify);
383575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->post();
384575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
385575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber////////////////////////////////////////////////////////////////////////////////
3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3885778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() {
3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueInputPending) {
3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueInputReplyID);
3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueInputTimeoutGeneration;
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueInputReplyID = 0;
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueInputPending;
3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueOutputPending) {
4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueOutputReplyID);
4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueOutputTimeoutGeneration;
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueOutputReplyID = 0;
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueOutputPending;
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4105778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) {
4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueInputPending))) {
4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(replyID);
4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return true;
4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t index = dequeuePortBuffer(kPortIndexInput);
4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index < 0) {
4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(index, -EAGAIN);
4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return false;
4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->setSize("index", index);
4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4365778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) {
4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueOutputPending))) {
4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputBuffersChanged) {
4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED);
4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputFormatChanged) {
4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_FORMAT_CHANGED);
4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ssize_t index = dequeuePortBuffer(kPortIndexOutput);
4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (index < 0) {
4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(index, -EAGAIN);
4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return false;
4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ABuffer> &buffer =
4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mPortBuffers[kPortIndexOutput].itemAt(index).mData;
4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("index", index);
4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("offset", buffer->offset());
4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("size", buffer->size());
4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeUs;
4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt64("timeUs", timeUs);
4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t omxFlags;
4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags));
4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags = 0;
4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) {
4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_SYNCFRAME;
4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) {
4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_CODECCONFIG;
4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_EOS) {
4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_EOS;
4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("flags", flags);
4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4915778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    switch (msg->what()) {
4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatCodecNotify:
4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t what;
4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("what", &what));
4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            switch (what) {
4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatError:
5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxError, internalError;
5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("omx-error", &omxError));
5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("err", &internalError));
5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGE("Codec reported an error. "
5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          "(omx error 0x%08x, internalError %d)",
5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          omxError, internalError);
5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    bool sendErrorReponse = true;
5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    switch (mState) {
5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case INITIALIZING:
5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(UNINITIALIZED);
5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case CONFIGURING:
5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(INITIALIZED);
5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTING:
5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(CONFIGURED);
5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STOPPING:
531c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        case RELEASING:
5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // Ignore the error, assuming we'll still get
5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // the shutdown complete notification.
5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case FLUSHING:
5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTED:
5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
551575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            cancelPendingDequeueOperations();
5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        default:
5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
562575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (sendErrorReponse) {
5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        sp<AMessage> response = new AMessage;
5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->setInt32("err", UNKNOWN_ERROR);
5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->postReply(mReplyID);
5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatComponentAllocated:
5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, INITIALIZING);
5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(INITIALIZED);
5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
581717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    CHECK(msg->findString("componentName", &mComponentName));
5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
583717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    if (mComponentName.startsWith("OMX.google.")) {
5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags |= kFlagIsSoftwareCodec;
5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    } else {
5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagIsSoftwareCodec;
5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
589717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                    if (mComponentName.endsWith(".secure")) {
5901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags |= kFlagIsSecure;
5911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    } else {
5921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags &= ~kFlagIsSecure;
5931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    }
5941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatComponentConfigured:
6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, CONFIGURING);
6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(CONFIGURED);
6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6046507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                    // reset input surface flag
6056507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                    mHaveInputSurface = false;
6066507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
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);
6216507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                        mHaveInputSurface = true;
6227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    } else {
6237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setInt32("err", err);
6247cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    }
6257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    response->postReply(mReplyID);
6267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    break;
6277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                }
6287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
6297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                case ACodec::kWhatSignaledInputEOS:
6307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                {
6317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    // response to ACodec::kWhatSignalEndOfInputStream
6327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    sp<AMessage> response = new AMessage();
6337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    status_t err;
6347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    if (msg->findInt32("err", &err)) {
6357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                        response->setInt32("err", err);
6367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    }
6377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    response->postReply(mReplyID);
6387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                    break;
6397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                }
6407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
6417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatBuffersAllocated:
6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t portIndex;
6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("portIndex", &portIndex));
6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("%s buffers allocated",
6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          portIndex == kPortIndexInput ? "input" : "output");
6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(portIndex == kPortIndexInput
6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            || portIndex == kPortIndexOutput);
6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mPortBuffers[portIndex].clear();
6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
6565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
657eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<RefBase> obj;
658eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    CHECK(msg->findObject("portDesc", &obj));
659eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber
660eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<ACodec::PortDescription> portDesc =
661eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        static_cast<ACodec::PortDescription *>(obj.get());
6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
663eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    size_t numBuffers = portDesc->countBuffers();
6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
665eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    for (size_t i = 0; i < numBuffers; ++i) {
6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        BufferInfo info;
667eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mBufferID = portDesc->bufferIDAt(i);
6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        info.mOwnedByClient = false;
669eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mData = portDesc->bufferAt(i);
6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        if (portIndex == kPortIndexInput && mCrypto != NULL) {
672ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                            info.mEncryptedData =
673ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                new ABuffer(info.mData->capacity());
674ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                        }
675ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        buffers->push_back(info);
6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (portIndex == kPortIndexOutput) {
6805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (mState == STARTING) {
6815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // We're always allocating output buffers after
6825778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // allocating input buffers, so this is a good
6835778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // indication that now all buffers are allocated.
6845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
6855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            (new AMessage)->postReply(mReplyID);
6865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        } else {
6875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagOutputBuffersChanged;
688575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
6895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatOutputFormatChanged:
6955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("codec output format changed");
6975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if ((mFlags & kFlagIsSoftwareCodec)
6995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            && mNativeWindow != NULL) {
7005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        AString mime;
7015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(msg->findString("mime", &mime));
7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (!strncasecmp("video/", mime.c_str(), 6)) {
7045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            delete mSoftRenderer;
7055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer = NULL;
7065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t width, height;
7085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("width", &width));
7095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("height", &height));
7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t colorFormat;
7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32(
7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                        "color-format", &colorFormat));
7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sp<MetaData> meta = new MetaData;
7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyWidth, width);
7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyHeight, height);
7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyColorFormat, colorFormat);
7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer =
7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                new SoftwareRenderer(mNativeWindow, meta);
7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mOutputFormat = msg;
7265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mFlags |= kFlagOutputFormatChanged;
727575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    postActivityNotificationIfPossible();
7285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatFillThisBuffer:
7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexInput, msg);
7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
735c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
736c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
737c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexInput);
7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    if (!mCSD.empty()) {
7438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        ssize_t index = dequeuePortBuffer(kPortIndexInput);
7448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        CHECK_GE(index, 0);
7458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // If codec specific data had been specified as
7478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // part of the format in the call to configure and
7488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // if there's more csd left, we submit it here
7498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // clients only get access to input buffers once
7508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // this data has been exhausted.
7518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        status_t err = queueCSDInputBuffer(index);
7538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        if (err != OK) {
7558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            ALOGE("queueCSDInputBuffer failed w/ error %d",
7568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                                  err);
7578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            mFlags |= kFlagStickyError;
759575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
760575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
7618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            cancelPendingDequeueOperations();
7628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        }
7638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        break;
7648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    }
7658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueInputPending) {
7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));
7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueInputTimeoutGeneration;
7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueInputPending;
7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueInputReplyID = 0;
772575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
773575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatDrainThisBuffer:
7795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexOutput, msg);
7815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
782c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
783c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
784c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexOutput);
7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7892d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    sp<ABuffer> buffer;
7902d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    CHECK(msg->findBuffer("buffer", &buffer));
7915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxFlags;
7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("flags", &omxFlags));
7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    buffer->meta()->setInt32("omxFlags", omxFlags);
7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueOutputPending) {
7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID));
7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueOutputTimeoutGeneration;
8015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueOutputPending;
8025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueOutputReplyID = 0;
803575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
804575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
8055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
806575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatEOS:
8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // We already notify the client of this by using the
8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // corresponding flag in "onOutputBufferReady".
8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatShutdownCompleted:
8185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
819c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == STOPPING) {
820c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(INITIALIZED);
821c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    } else {
822c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        CHECK_EQ(mState, RELEASING);
823c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(UNINITIALIZED);
824c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    }
8255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
8275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatFlushCompleted:
8315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
8325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, FLUSHING);
8335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(STARTED);
8345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mCodec->signalResume();
8365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
8385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
8395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
8405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                default:
8425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    TRESPASS();
8435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
8455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
8465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatInit:
8485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
8495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
8515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNINITIALIZED) {
8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
8545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
8555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
8615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(INITIALIZING);
8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            AString name;
8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findString("name", &name));
8655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t nameIsType;
8675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t encoder = false;
8680db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            CHECK(msg->findInt32("nameIsType", &nameIsType));
8690db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            if (nameIsType) {
8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK(msg->findInt32("encoder", &encoder));
8715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format = new AMessage;
8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (nameIsType) {
8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("mime", name.c_str());
8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", encoder);
8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
8795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("componentName", name.c_str());
8805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateAllocateComponent(format);
8835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
8845778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
8855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatConfigure:
8875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
8885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
8895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != INITIALIZED) {
8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
8935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
8945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
8965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
8975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<RefBase> obj;
9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (!msg->findObject("native-window", &obj)) {
9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                obj.clear();
9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format;
9055778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("format", &format));
9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (obj != NULL) {
9085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setObject("native-window", obj);
9091bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
9107541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                status_t err = setNativeWindow(
9117541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    static_cast<NativeWindowWrapper *>(obj.get())
9127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                        ->getSurfaceTextureClient());
9137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
9147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                if (err != OK) {
9157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    sp<AMessage> response = new AMessage;
9167541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->setInt32("err", err);
9177541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
9187541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->postReply(replyID);
9197541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    break;
9201bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                }
9211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            } else {
9227541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                setNativeWindow(NULL);
9231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            }
9241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
9257541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            mReplyID = replyID;
9267541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            setState(CONFIGURING);
9277541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
9281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            void *crypto;
9291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            if (!msg->findPointer("crypto", &crypto)) {
9301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                crypto = NULL;
9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9331bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            mCrypto = static_cast<ICrypto *>(crypto);
9341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags;
9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("flags", (int32_t *)&flags));
9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (flags & CONFIGURE_FLAG_ENCODE) {
9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", true);
9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            extractCSD(format);
9438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateConfigureComponent(format);
9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case kWhatCreateInputSurface:
9497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
9507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            uint32_t replyID;
9517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK(msg->senderAwaitsResponse(&replyID));
9527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
9537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            // Must be configured, but can't have been started yet.
9547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (mState != CONFIGURED) {
9557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                sp<AMessage> response = new AMessage;
9567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->setInt32("err", INVALID_OPERATION);
9577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
9587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->postReply(replyID);
9597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                break;
9607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
9617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
9627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mReplyID = replyID;
9637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mCodec->initiateCreateInputSurface();
9647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            break;
9657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
9667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStart:
9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != CONFIGURED) {
9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(STARTING);
9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateStart();
9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStop:
9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != INITIALIZED
9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    && mState != CONFIGURED && mState != STARTED) {
9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(STOPPING);
10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1004c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            mCodec->initiateShutdown(true /* keepComponentAllocated */);
1005c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            returnBuffersToCodec();
1006c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            break;
1007c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        }
1008c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1009c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        case kWhatRelease:
1010c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        {
1011c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            uint32_t replyID;
1012c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1013c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1014c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            if (mState != INITIALIZED
1015c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    && mState != CONFIGURED && mState != STARTED) {
1016c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                sp<AMessage> response = new AMessage;
1017c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                response->setInt32("err", INVALID_OPERATION);
1018c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1019c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                response->postReply(replyID);
1020c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                break;
1021c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            }
1022c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1023c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            mReplyID = replyID;
1024c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            setState(RELEASING);
1025c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateShutdown();
10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
10285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputBuffer:
10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10366507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden            if (mHaveInputSurface) {
10376507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                ALOGE("dequeueInputBuffer can't be used with input surface");
10386507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                sp<AMessage> response = new AMessage;
10396507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                response->setInt32("err", INVALID_OPERATION);
10406507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                response->postReply(replyID);
10416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden                break;
10426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden            }
10436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden
10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueInputBuffer(replyID, true /* new request */)) {
10455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
10525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
10545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
10555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueInputPending;
10595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = replyID;
10605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
10625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
10635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueInputTimedOut, id());
10645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
10655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueInputTimeoutGeneration);
10665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
10675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputTimedOut:
10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueInputTimeoutGeneration) {
10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueInputPending);
10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueInputReplyID);
10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueInputPending;
10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = 0;
10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10925778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatQueueInputBuffer:
10935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10955778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
10985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
11005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11055778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onQueueInputBuffer(msg);
11065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
11095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
11105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11115778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputBuffer:
11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11155778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11165778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueOutputBuffer(replyID, true /* new request */)) {
11195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueOutputPending;
11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = replyID;
11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueOutputTimedOut, id());
11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueOutputTimeoutGeneration);
11405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
11415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11455778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputTimedOut:
11465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueOutputTimeoutGeneration) {
11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueOutputPending);
11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueOutputReplyID);
11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueOutputPending;
11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = 0;
11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatReleaseOutputBuffer:
11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onReleaseOutputBuffer(msg);
11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        case kWhatSignalEndOfInputStream:
11887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        {
11897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            uint32_t replyID;
11907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            CHECK(msg->senderAwaitsResponse(&replyID));
11917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
11927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            if (mState != STARTED || (mFlags & kFlagStickyError)) {
11937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                sp<AMessage> response = new AMessage;
11947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->setInt32("err", INVALID_OPERATION);
11957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
11967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                response->postReply(replyID);
11977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden                break;
11987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            }
11997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
12007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mReplyID = replyID;
12017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            mCodec->signalEndOfInputStream();
12027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            break;
12037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        }
12047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetBuffers:
12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t portIndex;
12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("portIndex", &portIndex));
12205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            Vector<sp<ABuffer> > *dstBuffers;
12225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findPointer("buffers", (void **)&dstBuffers));
12235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            dstBuffers->clear();
12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex];
12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            for (size_t i = 0; i < srcBuffers.size(); ++i) {
12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                const BufferInfo &info = srcBuffers.itemAt(i);
12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1230ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                dstBuffers->push_back(
12311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        (portIndex == kPortIndexInput && mCrypto != NULL)
1232ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                ? info.mEncryptedData : info.mData);
12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            (new AMessage)->postReply(replyID);
12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatFlush:
12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(FLUSHING);
12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->signalFlush();
12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetOutputFormat:
12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if ((mState != STARTED && mState != FLUSHING)
1266972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo                    || (mFlags & kFlagStickyError)
1267972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo                    || mOutputFormat == NULL) {
12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setMessage("format", mOutputFormat);
12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1281496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        case kWhatRequestIDRFrame:
1282496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        {
1283496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            mCodec->signalRequestIDRFrame();
1284496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            break;
1285496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        }
1286496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
1287575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        case kWhatRequestActivityNotification:
1288575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        {
1289575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(mActivityNotify == NULL);
1290575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(msg->findMessage("notify", &mActivityNotify));
1291575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1292575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            postActivityNotificationIfPossible();
1293575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            break;
1294575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        }
1295575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1296717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        case kWhatGetName:
1297717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        {
1298717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            uint32_t replyID;
1299717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            CHECK(msg->senderAwaitsResponse(&replyID));
1300717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1301717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            if (mComponentName.empty()) {
1302717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                sp<AMessage> response = new AMessage;
1303717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                response->setInt32("err", INVALID_OPERATION);
1304717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1305717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                response->postReply(replyID);
1306717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo                break;
1307717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            }
1308717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1309717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            sp<AMessage> response = new AMessage;
1310717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            response->setString("name", mComponentName.c_str());
1311717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            response->postReply(replyID);
1312717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo            break;
1313717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        }
1314717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
1315a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        case kWhatSetParameters:
1316a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        {
1317a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            uint32_t replyID;
1318a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
1319a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1320a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            sp<AMessage> params;
1321a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            CHECK(msg->findMessage("params", &params));
1322a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1323a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            status_t err = onSetParameters(params);
1324a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1325a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            sp<AMessage> response = new AMessage;
1326a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            response->setInt32("err", err);
1327a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1328a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            response->postReply(replyID);
1329a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber            break;
1330a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber        }
1331a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        default:
13335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            TRESPASS();
13345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
13355778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
13365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13378ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) {
13388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.clear();
13398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    size_t i = 0;
13418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    for (;;) {
13428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        sp<ABuffer> csd;
13438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) {
13448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            break;
13458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        }
13468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        mCSD.push_back(csd);
13488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        ++i;
13498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
13508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    ALOGV("Found %u pieces of codec specific data.", mCSD.size());
13528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
13538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) {
13558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    CHECK(!mCSD.empty());
13568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    BufferInfo *info =
13588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex);
13598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<ABuffer> csd = *mCSD.begin();
13618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.erase(mCSD.begin());
13628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    const sp<ABuffer> &codecInputData =
13648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        (mCrypto != NULL) ? info->mEncryptedData : info->mData;
13658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    if (csd->size() > codecInputData->capacity()) {
13678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        return -EINVAL;
13688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
13698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    memcpy(codecInputData->data(), csd->data(), csd->size());
13718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    AString errorDetailMsg;
13738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
13758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("index", bufferIndex);
13768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("offset", 0);
13778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("size", csd->size());
13788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt64("timeUs", 0ll);
13798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG);
13808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setPointer("errorDetailMsg", &errorDetailMsg);
13818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    return onQueueInputBuffer(msg);
13838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
13848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
13855778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) {
13867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (newState == INITIALIZED || newState == UNINITIALIZED) {
13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        delete mSoftRenderer;
13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mSoftRenderer = NULL;
13895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        mCrypto.clear();
13917541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        setNativeWindow(NULL);
13925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mOutputFormat.clear();
13945778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
13955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
13965778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagStickyError;
1397575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1398575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
13995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1401717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    if (newState == UNINITIALIZED) {
1402717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo        mComponentName.clear();
1403717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo    }
1404717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo
14055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mState = newState;
14065778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    cancelPendingDequeueOperations();
14085778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14105778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() {
14115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexInput);
14125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexOutput);
14135778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14155778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) {
14165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
14175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
14215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
14225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14235778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mNotify != NULL) {
14245778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> msg = info->mNotify;
14255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mNotify = NULL;
14265778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mOwnedByClient = false;
14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (portIndex == kPortIndexInput) {
14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                msg->setInt32("err", ERROR_END_OF_STREAM);
14305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
14315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            msg->post();
14325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
14335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mAvailPortBuffers[portIndex].clear();
14365778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14385778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers(
14395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t portIndex, const sp<AMessage> &msg) {
14405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void *bufferID;
14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findPointer("buffer-id", &bufferID));
14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
14465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
14485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
14495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mBufferID == bufferID) {
14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(info->mNotify == NULL);
14525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("reply", &info->mNotify));
14535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mAvailPortBuffers[portIndex].push_back(i);
14555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return i;
14575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
14585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    TRESPASS();
14615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return 0;
14635778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14655778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) {
14665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
14675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t offset;
14685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t size;
14695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t timeUs;
14705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t flags;
14715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
14725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("offset", &offset));
14735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt64("timeUs", &timeUs));
14745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt32("flags", (int32_t *)&flags));
14755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const CryptoPlugin::SubSample *subSamples;
14774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    size_t numSubSamples;
14784b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *key;
14794b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *iv;
14804b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted;
14814b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
14824b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // We allow the simpler queueInputBuffer API to be used even in
14834b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // secure mode, by fabricating a single unencrypted subSample.
14844b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::SubSample ss;
14854b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
14864b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    if (msg->findSize("size", &size)) {
14874b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto != NULL) {
14884b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfClearData = size;
14894b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfEncryptedData = 0;
14904b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
14914b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            subSamples = &ss;
14924b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            numSubSamples = 1;
14934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            key = NULL;
14944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            iv = NULL;
14954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
14964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    } else {
14974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto == NULL) {
14984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            return -EINVAL;
14994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
15004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("subSamples", (void **)&subSamples));
15024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findSize("numSubSamples", &numSubSamples));
15034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("key", (void **)&key));
15044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("iv", (void **)&iv));
15054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int32_t tmp;
15074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findInt32("mode", &tmp));
15084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        mode = (CryptoPlugin::Mode)tmp;
15104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size = 0;
15124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        for (size_t i = 0; i < numSubSamples; ++i) {
15134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfClearData;
15144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfEncryptedData;
15154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
15164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    }
15174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
15185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexInput].size()) {
15195778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
15205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index);
15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
15255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
15265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (offset + size > info->mData->capacity()) {
15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
15305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> reply = info->mNotify;
15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->setRange(offset, size);
15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->meta()->setInt64("timeUs", timeUs);
15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_EOS) {
15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("eos", true);
15385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_CODECCONFIG) {
15415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("csd", true);
15425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15441bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (mCrypto != NULL) {
15451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        if (size > info->mEncryptedData->capacity()) {
15461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            return -ERANGE;
1547ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1548ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
15495b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg;
15505b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg));
15515b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
1552fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        ssize_t result = mCrypto->decrypt(
15531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                (mFlags & kFlagIsSecure) != 0,
15541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                key,
15551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                iv,
15561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                mode,
15571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                info->mEncryptedData->base() + offset,
15584b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                subSamples,
15594b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                numSubSamples,
15605b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                info->mData->base(),
15615b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                errorDetailMsg);
15621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1563fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        if (result < 0) {
1564fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            return result;
1565ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1566ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1567fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        info->mData->setRange(0, result);
1568ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
1569ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
15702d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", info->mData);
15715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    reply->post();
15725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15735b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mNotify = NULL;
15745b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mOwnedByClient = false;
15755b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15795778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) {
15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
15815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t render;
15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!msg->findInt32("render", &render)) {
15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber        render = 0;
15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED) {
15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexOutput].size()) {
15935778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
15945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
15955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);
15975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
15985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
15995778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
16005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (render) {
16035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mNotify->setInt32("render", true);
16045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16055778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mSoftRenderer != NULL) {
16065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mSoftRenderer->render(
16075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    info->mData->data(), info->mData->size(), NULL);
16085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
16095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify->post();
16125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify = NULL;
16135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = false;
16145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
16165778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
16175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16185778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) {
16195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
16205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> *availBuffers = &mAvailPortBuffers[portIndex];
16225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (availBuffers->empty()) {
16245778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EAGAIN;
16255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
16265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index = *availBuffers->begin();
16285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    availBuffers->erase(availBuffers->begin());
16295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index);
16315778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(!info->mOwnedByClient);
16325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = true;
16335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return index;
16355778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
16365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
16377541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow(
16381a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian        const sp<Surface> &surfaceTextureClient) {
16397541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    status_t err;
16407541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16417541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (mNativeWindow != NULL) {
16427541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_disconnect(
16437541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA);
16447541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16457541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
16467541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGW("native_window_api_disconnect returned an error: %s (%d)",
16477541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
16487541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
16497541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16507541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow.clear();
16517541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
16527541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16537541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (surfaceTextureClient != NULL) {
16547541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_connect(
16557541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA);
16567541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16577541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
16587541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGE("native_window_api_connect returned an error: %s (%d)",
16597541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
16607541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16617541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            return err;
16627541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
16637541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16647541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow = surfaceTextureClient;
16657541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
16667541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
16677541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    return OK;
16687541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber}
16697541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
1670575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() {
1671575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if (mActivityNotify == NULL) {
1672575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        return;
1673575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1674575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1675575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if ((mFlags & (kFlagStickyError
1676575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputBuffersChanged
1677575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputFormatChanged))
1678575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexInput].empty()
1679575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexOutput].empty()) {
1680575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify->post();
1681575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
1682575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1683575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
1684575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1685a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> &params) {
1686a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    sp<AMessage> msg = new AMessage(kWhatSetParameters, id());
1687a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    msg->setMessage("params", params);
1688a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1689a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    sp<AMessage> response;
1690a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    return PostAndAwaitResponse(msg, &response);
1691a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber}
1692a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1693a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> &params) {
1694a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    mCodec->signalSetParameters(params);
1695a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
1696a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber    return OK;
1697a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber}
1698a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber
16995778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
1700