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
255778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <gui/SurfaceTextureClient.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>
335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h>
345778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h>
355778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h>
365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
375778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android {
385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
395778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
405778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType(
415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ALooper> &looper, const char *mime, bool encoder) {
425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<MediaCodec> codec = new MediaCodec(looper);
435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (codec->init(mime, true /* nameIsType */, encoder) != OK) {
445778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return codec;
485778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
505778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
515778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName(
525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ALooper> &looper, const char *name) {
535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<MediaCodec> codec = new MediaCodec(looper);
545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) {
555778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return NULL;
565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return codec;
595778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
615778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper)
625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    : mState(UNINITIALIZED),
635778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mLooper(looper),
645778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mCodec(new ACodec),
655778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mFlags(0),
665778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mSoftRenderer(NULL),
675778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueInputTimeoutGeneration(0),
685778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueInputReplyID(0),
695778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueOutputTimeoutGeneration(0),
705778822d86b0337407514b9372562b86edfa91cdAndreas Huber      mDequeueOutputReplyID(0) {
715778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
735778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() {
745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK_EQ(mState, UNINITIALIZED);
755778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
775778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static
785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse(
795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &msg, sp<AMessage> *response) {
805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err = msg->postAndAwaitResponse(response);
815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
825778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (err != OK) {
835778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!(*response)->findInt32("err", &err)) {
875778822d86b0337407514b9372562b86edfa91cdAndreas Huber        err = OK;
885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
895778822d86b0337407514b9372562b86edfa91cdAndreas Huber
905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return err;
915778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
935778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) {
945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // Current video decoders do not return from OMX_FillThisBuffer
955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // quickly, violating the OpenMAX specs, until that is remedied
965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // we need to invest in an extra looper to free the main event
975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    // queue.
985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    bool needDedicatedLooper = false;
995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType && !strncasecmp(name, "video/", 6)) {
1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber        needDedicatedLooper = true;
1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (!nameIsType && !strncmp(name, "OMX.TI.DUCATI1.VIDEO.", 21)) {
1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber        needDedicatedLooper = true;
1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (needDedicatedLooper) {
1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mCodecLooper == NULL) {
1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper = new ALooper;
1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->setName("CodecLooper");
1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mCodecLooper->registerHandler(mCodec);
1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mLooper->registerHandler(mCodec);
1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mLooper->registerHandler(this);
1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id()));
1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatInit, id());
1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setString("name", name);
1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("nameIsType", nameIsType);
1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nameIsType) {
1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        msg->setInt32("encoder", encoder);
1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure(
1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<AMessage> &format,
1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<SurfaceTextureClient> &nativeWindow,
1361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        const sp<ICrypto> &crypto,
1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags) {
1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatConfigure, id());
1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setMessage("format", format);
1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (nativeWindow != NULL) {
1441bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setObject(
1451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                "native-window",
1461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                new NativeWindowWrapper(nativeWindow));
1471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    }
1481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (crypto != NULL) {
1501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        msg->setPointer("crypto", crypto.get());
1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() {
1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStart, id());
1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1645778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() {
1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatStop, id());
1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
171c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() {
172c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRelease, id());
173c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
174c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    sp<AMessage> response;
175c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber    return PostAndAwaitResponse(msg, &response);
176c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}
177c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
1785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer(
1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t index,
1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t offset,
1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t size,
1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t presentationTimeUs,
1835b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
1845b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
1855b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
1865b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
1875b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
1885b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("offset", offset);
1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("size", size);
1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("flags", flags);
1955b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer(
2024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t index,
2034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t offset,
2044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const CryptoPlugin::SubSample *subSamples,
2054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size_t numSubSamples,
2064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t key[16],
2074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        const uint8_t iv[16],
2084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CryptoPlugin::Mode mode,
2094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int64_t presentationTimeUs,
2105b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        uint32_t flags,
2115b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg) {
2125b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    if (errorDetailMsg != NULL) {
2135b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        errorDetailMsg->clear();
2145b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    }
2155b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
2174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("index", index);
2184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("offset", offset);
2194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("subSamples", (void *)subSamples);
2204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setSize("numSubSamples", numSubSamples);
2214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("key", (void *)key);
2224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setPointer("iv", (void *)iv);
2234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("mode", mode);
2244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt64("timeUs", presentationTimeUs);
2254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    msg->setInt32("flags", flags);
2265b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    msg->setPointer("errorDetailMsg", errorDetailMsg);
2274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    sp<AMessage> response;
2295b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    status_t err = PostAndAwaitResponse(msg, &response);
2305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
2315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    return err;
2324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber}
2334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
2345778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) {
2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id());
2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2495778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer(
2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *index,
2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *offset,
2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        size_t *size,
2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t *presentationTimeUs,
2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t *flags,
2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeoutUs) {
2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id());
2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt64("timeoutUs", timeoutUs);
2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("index", index));
2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("offset", offset));
2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findSize("size", size));
2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt64("timeUs", presentationTimeUs));
2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findInt32("flags", (int32_t *)flags));
2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2745778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) {
2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("render", true);
2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2835778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) {
2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id());
2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setSize("index", index);
2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2915778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const {
2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id());
2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    status_t err;
2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return err;
2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(response->findMessage("format", format));
3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3055778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const {
3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexInput);
3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3145778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const {
3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setInt32("portIndex", kPortIndexOutput);
3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber    msg->setPointer("buffers", buffers);
3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3235778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() {
3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> msg = new AMessage(kWhatFlush, id());
3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response;
3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return PostAndAwaitResponse(msg, &response);
3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
330496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() {
331496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    (new AMessage(kWhatRequestIDRFrame, id()))->post();
332496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
333496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber    return OK;
334496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber}
335496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
336575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> &notify) {
337575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id());
338575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->setMessage("notify", notify);
339575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    msg->post();
340575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
341575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber////////////////////////////////////////////////////////////////////////////////
3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3445778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() {
3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueInputPending) {
3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueInputReplyID);
3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueInputTimeoutGeneration;
3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueInputReplyID = 0;
3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueInputPending;
3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mFlags & kFlagDequeueOutputPending) {
3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(mDequeueOutputReplyID);
3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ++mDequeueOutputTimeoutGeneration;
3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mDequeueOutputReplyID = 0;
3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagDequeueOutputPending;
3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3665778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) {
3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueInputPending))) {
3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        sp<AMessage> response = new AMessage;
3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->postReply(replyID);
3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return true;
3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    ssize_t index = dequeuePortBuffer(kPortIndexInput);
3795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index < 0) {
3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK_EQ(index, -EAGAIN);
3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return false;
3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->setSize("index", index);
3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3925778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) {
3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> response = new AMessage;
3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber
3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED
3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (mFlags & kFlagStickyError)
3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            || (newRequest && (mFlags & kFlagDequeueOutputPending))) {
3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INVALID_OPERATION);
3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputBuffersChanged) {
4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED);
4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else if (mFlags & kFlagOutputFormatChanged) {
4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("err", INFO_FORMAT_CHANGED);
4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    } else {
4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber        ssize_t index = dequeuePortBuffer(kPortIndexOutput);
4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (index < 0) {
4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK_EQ(index, -EAGAIN);
4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return false;
4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber        const sp<ABuffer> &buffer =
4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mPortBuffers[kPortIndexOutput].itemAt(index).mData;
4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("index", index);
4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("offset", buffer->offset());
4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setSize("size", buffer->size());
4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int64_t timeUs;
4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt64("timeUs", &timeUs));
4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt64("timeUs", timeUs);
4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t omxFlags;
4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber        CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags));
4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber        uint32_t flags = 0;
4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) {
4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_SYNCFRAME;
4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) {
4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_CODECCONFIG;
4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (omxFlags & OMX_BUFFERFLAG_EOS) {
4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber            flags |= BUFFER_FLAG_EOS;
4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        response->setInt32("flags", flags);
4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber    response->postReply(replyID);
4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return true;
4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4475778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber    switch (msg->what()) {
4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatCodecNotify:
4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t what;
4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("what", &what));
4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            switch (what) {
4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatError:
4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxError, internalError;
4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("omx-error", &omxError));
4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("err", &internalError));
4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGE("Codec reported an error. "
4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          "(omx error 0x%08x, internalError %d)",
4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          omxError, internalError);
4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    bool sendErrorReponse = true;
4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    switch (mState) {
4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case INITIALIZING:
4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(UNINITIALIZED);
4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case CONFIGURING:
4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(INITIALIZED);
4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTING:
4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(CONFIGURED);
4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STOPPING:
487c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        case RELEASING:
4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // Ignore the error, assuming we'll still get
4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // the shutdown complete notification.
4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case FLUSHING:
4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        case STARTED:
5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
507575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            cancelPendingDequeueOperations();
5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        default:
5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        {
5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sendErrorReponse = false;
5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagStickyError;
518575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            break;
5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (sendErrorReponse) {
5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        sp<AMessage> response = new AMessage;
5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->setInt32("err", UNKNOWN_ERROR);
5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        response->postReply(mReplyID);
5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatComponentAllocated:
5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, INITIALIZING);
5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(INITIALIZED);
5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    AString componentName;
5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findString("componentName", &componentName));
5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (componentName.startsWith("OMX.google.")) {
5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags |= kFlagIsSoftwareCodec;
5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    } else {
5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagIsSoftwareCodec;
5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    if (componentName.endsWith(".secure")) {
5471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags |= kFlagIsSecure;
5481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    } else {
5491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        mFlags &= ~kFlagIsSecure;
5501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                    }
5511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatComponentConfigured:
5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, CONFIGURING);
5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(CONFIGURED);
5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatBuffersAllocated:
5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t portIndex;
5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("portIndex", &portIndex));
5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("%s buffers allocated",
5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                          portIndex == kPortIndexInput ? "input" : "output");
5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(portIndex == kPortIndexInput
5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            || portIndex == kPortIndexOutput);
5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mPortBuffers[portIndex].clear();
5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
580eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<RefBase> obj;
581eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    CHECK(msg->findObject("portDesc", &obj));
582eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber
583eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    sp<ACodec::PortDescription> portDesc =
584eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        static_cast<ACodec::PortDescription *>(obj.get());
5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
586eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    size_t numBuffers = portDesc->countBuffers();
5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
588eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                    for (size_t i = 0; i < numBuffers; ++i) {
5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        BufferInfo info;
590eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mBufferID = portDesc->bufferIDAt(i);
5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        info.mOwnedByClient = false;
592eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber                        info.mData = portDesc->bufferAt(i);
5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
5941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        if (portIndex == kPortIndexInput && mCrypto != NULL) {
595ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                            info.mEncryptedData =
596ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                new ABuffer(info.mData->capacity());
597ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                        }
598ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        buffers->push_back(info);
6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (portIndex == kPortIndexOutput) {
6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (mState == STARTING) {
6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // We're always allocating output buffers after
6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // allocating input buffers, so this is a good
6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            // indication that now all buffers are allocated.
6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            setState(STARTED);
6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            (new AMessage)->postReply(mReplyID);
6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        } else {
6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mFlags |= kFlagOutputBuffersChanged;
611575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatOutputFormatChanged:
6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    ALOGV("codec output format changed");
6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if ((mFlags & kFlagIsSoftwareCodec)
6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            && mNativeWindow != NULL) {
6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        AString mime;
6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(msg->findString("mime", &mime));
6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        if (!strncasecmp("video/", mime.c_str(), 6)) {
6275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            delete mSoftRenderer;
6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer = NULL;
6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t width, height;
6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("width", &width));
6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32("height", &height));
6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            int32_t colorFormat;
6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            CHECK(msg->findInt32(
6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                        "color-format", &colorFormat));
6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            sp<MetaData> meta = new MetaData;
6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyWidth, width);
6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyHeight, height);
6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            meta->setInt32(kKeyColorFormat, colorFormat);
6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber                            mSoftRenderer =
6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber                                new SoftwareRenderer(mNativeWindow, meta);
6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        }
6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mOutputFormat = msg;
6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mFlags |= kFlagOutputFormatChanged;
650575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    postActivityNotificationIfPossible();
6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatFillThisBuffer:
6555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
6565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexInput, msg);
6575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
658c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
659c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
660c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexInput);
6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    if (!mCSD.empty()) {
6668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        ssize_t index = dequeuePortBuffer(kPortIndexInput);
6678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        CHECK_GE(index, 0);
6688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
6698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // If codec specific data had been specified as
6708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // part of the format in the call to configure and
6718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // if there's more csd left, we submit it here
6728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // clients only get access to input buffers once
6738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        // this data has been exhausted.
6748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
6758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        status_t err = queueCSDInputBuffer(index);
6768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
6778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        if (err != OK) {
6788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            ALOGE("queueCSDInputBuffer failed w/ error %d",
6798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                                  err);
6808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
6818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            mFlags |= kFlagStickyError;
682575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                            postActivityNotificationIfPossible();
683575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
6848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                            cancelPendingDequeueOperations();
6858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        }
6868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                        break;
6878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber                    }
6888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
6895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueInputPending) {
6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueInputBuffer(mDequeueInputReplyID));
6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
6925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueInputTimeoutGeneration;
6935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueInputPending;
6945778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueInputReplyID = 0;
695575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
696575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
6975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
6985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
6995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatDrainThisBuffer:
7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    /* size_t index = */updateBuffers(kPortIndexOutput, msg);
7045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
705c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == FLUSHING
706c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == STOPPING
707c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                            || mState == RELEASING) {
7085778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        returnBuffersToCodecOnPort(kPortIndexOutput);
7095778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        break;
7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7122d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    sp<ABuffer> buffer;
7132d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber                    CHECK(msg->findBuffer("buffer", &buffer));
7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    int32_t omxFlags;
7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK(msg->findInt32("flags", &omxFlags));
7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    buffer->meta()->setInt32("omxFlags", omxFlags);
7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    if (mFlags & kFlagDequeueOutputPending) {
7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID));
7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        ++mDequeueOutputTimeoutGeneration;
7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mFlags &= ~kFlagDequeueOutputPending;
7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        mDequeueOutputReplyID = 0;
726575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    } else {
727575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                        postActivityNotificationIfPossible();
7285778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    }
729575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatEOS:
7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // We already notify the client of this by using the
7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    // corresponding flag in "onOutputBufferReady".
7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatShutdownCompleted:
7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
742c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    if (mState == STOPPING) {
743c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(INITIALIZED);
744c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    } else {
745c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        CHECK_EQ(mState, RELEASING);
746c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                        setState(UNINITIALIZED);
747c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    }
7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
7505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7535778822d86b0337407514b9372562b86edfa91cdAndreas Huber                case ACodec::kWhatFlushCompleted:
7545778822d86b0337407514b9372562b86edfa91cdAndreas Huber                {
7555778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    CHECK_EQ(mState, FLUSHING);
7565778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    setState(STARTED);
7575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    mCodec->signalResume();
7595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    (new AMessage)->postReply(mReplyID);
7615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    break;
7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                }
7635778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber                default:
7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    TRESPASS();
7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatInit:
7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
7725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != UNINITIALIZED) {
7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7795778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
7805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
7815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
7825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
7845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(INITIALIZING);
7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            AString name;
7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findString("name", &name));
7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t nameIsType;
7905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t encoder = false;
7910db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            CHECK(msg->findInt32("nameIsType", &nameIsType));
7920db280176bd3277e3256252d063f3712b1905ba9Andreas Huber            if (nameIsType) {
7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                CHECK(msg->findInt32("encoder", &encoder));
7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format = new AMessage;
7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (nameIsType) {
7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("mime", name.c_str());
8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", encoder);
8015778822d86b0337407514b9372562b86edfa91cdAndreas Huber            } else {
8025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setString("componentName", name.c_str());
8035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8055778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateAllocateComponent(format);
8065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatConfigure:
8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != INITIALIZED) {
8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8185778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
8195778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
8205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<RefBase> obj;
8235778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (!msg->findObject("native-window", &obj)) {
8245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                obj.clear();
8255778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8265778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8275778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> format;
8285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("format", &format));
8295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (obj != NULL) {
8315778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setObject("native-window", obj);
8321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
8337541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                status_t err = setNativeWindow(
8347541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    static_cast<NativeWindowWrapper *>(obj.get())
8357541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                        ->getSurfaceTextureClient());
8367541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
8377541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                if (err != OK) {
8387541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    sp<AMessage> response = new AMessage;
8397541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->setInt32("err", err);
8407541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
8417541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    response->postReply(replyID);
8427541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    break;
8431bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                }
8441bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            } else {
8457541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                setNativeWindow(NULL);
8461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            }
8471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
8487541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            mReplyID = replyID;
8497541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            setState(CONFIGURING);
8507541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
8511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            void *crypto;
8521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            if (!msg->findPointer("crypto", &crypto)) {
8531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                crypto = NULL;
8545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            mCrypto = static_cast<ICrypto *>(crypto);
8571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t flags;
8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("flags", (int32_t *)&flags));
8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8615778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (flags & CONFIGURE_FLAG_ENCODE) {
8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                format->setInt32("encoder", true);
8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            extractCSD(format);
8668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
8675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateConfigureComponent(format);
8685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
8695778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8715778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStart:
8725778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
8735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != CONFIGURED) {
8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
8795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8805778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
8815778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
8825778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
8835778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
8855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(STARTING);
8865778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8875778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateStart();
8885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
8895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatStop:
8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
8935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
8945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
8955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
8965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != INITIALIZED
8975778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    && mState != CONFIGURED && mState != STARTED) {
8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9055778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(STOPPING);
9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
908c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            mCodec->initiateShutdown(true /* keepComponentAllocated */);
909c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            returnBuffersToCodec();
910c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            break;
911c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        }
912c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
913c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        case kWhatRelease:
914c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber        {
915c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            uint32_t replyID;
916c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
917c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
918c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            if (mState != INITIALIZED
919c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                    && mState != CONFIGURED && mState != STARTED) {
920c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                sp<AMessage> response = new AMessage;
921c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                response->setInt32("err", INVALID_OPERATION);
922c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
923c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                response->postReply(replyID);
924c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber                break;
925c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            }
926c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
927c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            mReplyID = replyID;
928c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber            setState(RELEASING);
929c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber
9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->initiateShutdown();
9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
9325778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9335778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputBuffer:
9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueInputBuffer(replyID, true /* new request */)) {
9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueInputPending;
9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = replyID;
9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueInputTimedOut, id());
9605778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
9615778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueInputTimeoutGeneration);
9625778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
9635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueInputTimedOut:
9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
9705778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueInputTimeoutGeneration) {
9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueInputPending);
9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueInputReplyID);
9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueInputPending;
9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueInputReplyID = 0;
9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatQueueInputBuffer:
9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber
9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
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            status_t err = onQueueInputBuffer(msg);
10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10075778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputBuffer:
10105778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10125778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (handleDequeueOutputBuffer(replyID, true /* new request */)) {
10155778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10165778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10175778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10185778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int64_t timeoutUs;
10195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt64("timeoutUs", &timeoutUs));
10205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10215778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs == 0ll) {
10225778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", -EAGAIN);
10245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
10255778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags |= kFlagDequeueOutputPending;
10295778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = replyID;
10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (timeoutUs > 0ll) {
10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> timeoutMsg =
10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    new AMessage(kWhatDequeueOutputTimedOut, id());
10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->setInt32(
10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber                        "generation", ++mDequeueOutputTimeoutGeneration);
10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber                timeoutMsg->post(timeoutUs);
10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatDequeueOutputTimedOut:
10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t generation;
10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("generation", &generation));
10455778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (generation != mDequeueOutputTimeoutGeneration) {
10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                // Obsolete
10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(mFlags & kFlagDequeueOutputPending);
10525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
10545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", -EAGAIN);
10555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(mDequeueOutputReplyID);
10565778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10575778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mFlags &= ~kFlagDequeueOutputPending;
10585778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mDequeueOutputReplyID = 0;
10595778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10605778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatReleaseOutputBuffer:
10635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10655778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10665778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10675778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
10685778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10695778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
10705778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            status_t err = onReleaseOutputBuffer(msg);
10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setInt32("err", err);
10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetBuffers:
10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
10915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10925778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
10935778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
10945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
10955778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10965778822d86b0337407514b9372562b86edfa91cdAndreas Huber            int32_t portIndex;
10975778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findInt32("portIndex", &portIndex));
10985778822d86b0337407514b9372562b86edfa91cdAndreas Huber
10995778822d86b0337407514b9372562b86edfa91cdAndreas Huber            Vector<sp<ABuffer> > *dstBuffers;
11005778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findPointer("buffers", (void **)&dstBuffers));
11015778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11025778822d86b0337407514b9372562b86edfa91cdAndreas Huber            dstBuffers->clear();
11035778822d86b0337407514b9372562b86edfa91cdAndreas Huber            const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex];
11045778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11055778822d86b0337407514b9372562b86edfa91cdAndreas Huber            for (size_t i = 0; i < srcBuffers.size(); ++i) {
11065778822d86b0337407514b9372562b86edfa91cdAndreas Huber                const BufferInfo &info = srcBuffers.itemAt(i);
11075778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1108ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                dstBuffers->push_back(
11091bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                        (portIndex == kPortIndexInput && mCrypto != NULL)
1110ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber                                ? info.mEncryptedData : info.mData);
11115778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11125778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber            (new AMessage)->postReply(replyID);
11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11155778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11175778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatFlush:
11185778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11195778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (mState != STARTED || (mFlags & kFlagStickyError)) {
11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mReplyID = replyID;
11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber            setState(FLUSHING);
11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mCodec->signalFlush();
11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber            returnBuffersToCodec();
11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        case kWhatGetOutputFormat:
11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber        {
11405778822d86b0337407514b9372562b86edfa91cdAndreas Huber            uint32_t replyID;
11415778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->senderAwaitsResponse(&replyID));
11425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11435778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if ((mState != STARTED && mState != FLUSHING)
1144972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo                    || (mFlags & kFlagStickyError)
1145972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo                    || mOutputFormat == NULL) {
11465778822d86b0337407514b9372562b86edfa91cdAndreas Huber                sp<AMessage> response = new AMessage;
11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->setInt32("err", INVALID_OPERATION);
11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber                response->postReply(replyID);
11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber                break;
11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> response = new AMessage;
11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->setMessage("format", mOutputFormat);
11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber            response->postReply(replyID);
11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber            break;
11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
1159496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        case kWhatRequestIDRFrame:
1160496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        {
1161496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            mCodec->signalRequestIDRFrame();
1162496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber            break;
1163496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber        }
1164496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber
1165575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        case kWhatRequestActivityNotification:
1166575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        {
1167575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(mActivityNotify == NULL);
1168575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            CHECK(msg->findMessage("notify", &mActivityNotify));
1169575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1170575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            postActivityNotificationIfPossible();
1171575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            break;
1172575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        }
1173575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber        default:
11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber            TRESPASS();
11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber
11798ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) {
11808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.clear();
11818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
11828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    size_t i = 0;
11838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    for (;;) {
11848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        sp<ABuffer> csd;
11858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) {
11868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber            break;
11878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        }
11888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
11898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        mCSD.push_back(csd);
11908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        ++i;
11918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
11928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
11938ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    ALOGV("Found %u pieces of codec specific data.", mCSD.size());
11948ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
11958ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
11968ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) {
11978ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    CHECK(!mCSD.empty());
11988ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
11998ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    BufferInfo *info =
12008ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex);
12018ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
12028ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<ABuffer> csd = *mCSD.begin();
12038ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    mCSD.erase(mCSD.begin());
12048ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
12058ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    const sp<ABuffer> &codecInputData =
12068ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        (mCrypto != NULL) ? info->mEncryptedData : info->mData;
12078ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
12088ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    if (csd->size() > codecInputData->capacity()) {
12098ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber        return -EINVAL;
12108ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    }
12118ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
12128ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    memcpy(codecInputData->data(), csd->data(), csd->size());
12138ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
12148ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    AString errorDetailMsg;
12158ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
12168ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id());
12178ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("index", bufferIndex);
12188ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("offset", 0);
12198ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setSize("size", csd->size());
12208ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt64("timeUs", 0ll);
12218ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG);
12228ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    msg->setPointer("errorDetailMsg", &errorDetailMsg);
12238ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
12248ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber    return onQueueInputBuffer(msg);
12258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber}
12268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber
12275778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) {
12287541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (newState == INITIALIZED || newState == UNINITIALIZED) {
12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber        delete mSoftRenderer;
12305778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mSoftRenderer = NULL;
12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        mCrypto.clear();
12337541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        setNativeWindow(NULL);
12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mOutputFormat.clear();
12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputFormatChanged;
12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagOutputBuffersChanged;
12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber        mFlags &= ~kFlagStickyError;
1239575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1240575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mState = newState;
12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber    cancelPendingDequeueOperations();
12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12485778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() {
12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexInput);
12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    returnBuffersToCodecOnPort(kPortIndexOutput);
12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12535778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) {
12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mNotify != NULL) {
12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber            sp<AMessage> msg = info->mNotify;
12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mNotify = NULL;
12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber            info->mOwnedByClient = false;
12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber            if (portIndex == kPortIndexInput) {
12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber                msg->setInt32("err", ERROR_END_OF_STREAM);
12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber            }
12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber            msg->post();
12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber    mAvailPortBuffers[portIndex].clear();
12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12765778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers(
12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber        int32_t portIndex, const sp<AMessage> &msg) {
12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    void *bufferID;
12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findPointer("buffer-id", &bufferID));
12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber    Vector<BufferInfo> *buffers = &mPortBuffers[portIndex];
12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber    for (size_t i = 0; i < buffers->size(); ++i) {
12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber        BufferInfo *info = &buffers->editItemAt(i);
12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (info->mBufferID == bufferID) {
12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(info->mNotify == NULL);
12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber            CHECK(msg->findMessage("reply", &info->mNotify));
12915778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12925778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mAvailPortBuffers[portIndex].push_back(i);
12935778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12945778822d86b0337407514b9372562b86edfa91cdAndreas Huber            return i;
12955778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
12965778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
12975778822d86b0337407514b9372562b86edfa91cdAndreas Huber
12985778822d86b0337407514b9372562b86edfa91cdAndreas Huber    TRESPASS();
12995778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13005778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return 0;
13015778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
13025778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13035778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) {
13045778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
13055778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t offset;
13065778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t size;
13075778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int64_t timeUs;
13085778822d86b0337407514b9372562b86edfa91cdAndreas Huber    uint32_t flags;
13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("offset", &offset));
13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt64("timeUs", &timeUs));
13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findInt32("flags", (int32_t *)&flags));
13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const CryptoPlugin::SubSample *subSamples;
13154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    size_t numSubSamples;
13164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *key;
13174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    const uint8_t *iv;
13184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted;
13194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
13204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // We allow the simpler queueInputBuffer API to be used even in
13214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    // secure mode, by fabricating a single unencrypted subSample.
13224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    CryptoPlugin::SubSample ss;
13234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
13244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    if (msg->findSize("size", &size)) {
13254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto != NULL) {
13264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfClearData = size;
13274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            ss.mNumBytesOfEncryptedData = 0;
13284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
13294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            subSamples = &ss;
13304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            numSubSamples = 1;
13314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            key = NULL;
13324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            iv = NULL;
13334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
13344b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    } else {
13354b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        if (mCrypto == NULL) {
13364b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            return -EINVAL;
13374b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
13384b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
13394b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("subSamples", (void **)&subSamples));
13404b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findSize("numSubSamples", &numSubSamples));
13414b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("key", (void **)&key));
13424b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findPointer("iv", (void **)&iv));
13434b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
13444b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        int32_t tmp;
13454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        CHECK(msg->findInt32("mode", &tmp));
13464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
13474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        mode = (CryptoPlugin::Mode)tmp;
13484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
13494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        size = 0;
13504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        for (size_t i = 0; i < numSubSamples; ++i) {
13514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfClearData;
13524b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber            size += subSamples[i].mNumBytesOfEncryptedData;
13534b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber        }
13544b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber    }
13554b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber
13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexInput].size()) {
13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index);
13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
13635778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
13645778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (offset + size > info->mData->capacity()) {
13675778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
13685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
13695778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    sp<AMessage> reply = info->mNotify;
13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->setRange(offset, size);
13725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mData->meta()->setInt64("timeUs", timeUs);
13735778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13745778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_EOS) {
13755778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("eos", true);
13765778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
13775778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (flags & BUFFER_FLAG_CODECCONFIG) {
13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mData->meta()->setInt32("csd", true);
13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber
13821bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber    if (mCrypto != NULL) {
13831bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber        if (size > info->mEncryptedData->capacity()) {
13841bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber            return -ERANGE;
1385ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1386ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
13875b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        AString *errorDetailMsg;
13885b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber        CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg));
13895b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
1390fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        ssize_t result = mCrypto->decrypt(
13911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                (mFlags & kFlagIsSecure) != 0,
13921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                key,
13931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                iv,
13941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                mode,
13951bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber                info->mEncryptedData->base() + offset,
13964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                subSamples,
13974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber                numSubSamples,
13985b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                info->mData->base(),
13995b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber                errorDetailMsg);
14001bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber
1401fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        if (result < 0) {
1402fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong            return result;
1403ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber        }
1404ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
1405fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong        info->mData->setRange(0, result);
1406ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    }
1407ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
14082d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber    reply->setBuffer("buffer", info->mData);
14095778822d86b0337407514b9372562b86edfa91cdAndreas Huber    reply->post();
14105778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14115b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mNotify = NULL;
14125b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber    info->mOwnedByClient = false;
14135b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber
14145778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
14155778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14165778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14175778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) {
14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index;
14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(msg->findSize("index", &index));
14205778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14215778822d86b0337407514b9372562b86edfa91cdAndreas Huber    int32_t render;
14225778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (!msg->findInt32("render", &render)) {
14235778822d86b0337407514b9372562b86edfa91cdAndreas Huber        render = 0;
14245778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14255778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14265778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (mState != STARTED) {
14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EINVAL;
14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14305778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (index >= mPortBuffers[kPortIndexOutput].size()) {
14315778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -ERANGE;
14325778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14335778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14345778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index);
14355778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14365778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (info->mNotify == NULL || !info->mOwnedByClient) {
14375778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EACCES;
14385778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14395778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14405778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (render) {
14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber        info->mNotify->setInt32("render", true);
14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber        if (mSoftRenderer != NULL) {
14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber            mSoftRenderer->render(
14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber                    info->mData->data(), info->mData->size(), NULL);
14465778822d86b0337407514b9372562b86edfa91cdAndreas Huber        }
14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14485778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14495778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify->post();
14505778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mNotify = NULL;
14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = false;
14525778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14535778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return OK;
14545778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14555778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14565778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) {
14575778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput);
14585778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14595778822d86b0337407514b9372562b86edfa91cdAndreas Huber    List<size_t> *availBuffers = &mAvailPortBuffers[portIndex];
14605778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14615778822d86b0337407514b9372562b86edfa91cdAndreas Huber    if (availBuffers->empty()) {
14625778822d86b0337407514b9372562b86edfa91cdAndreas Huber        return -EAGAIN;
14635778822d86b0337407514b9372562b86edfa91cdAndreas Huber    }
14645778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14655778822d86b0337407514b9372562b86edfa91cdAndreas Huber    size_t index = *availBuffers->begin();
14665778822d86b0337407514b9372562b86edfa91cdAndreas Huber    availBuffers->erase(availBuffers->begin());
14675778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14685778822d86b0337407514b9372562b86edfa91cdAndreas Huber    BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index);
14695778822d86b0337407514b9372562b86edfa91cdAndreas Huber    CHECK(!info->mOwnedByClient);
14705778822d86b0337407514b9372562b86edfa91cdAndreas Huber    info->mOwnedByClient = true;
14715778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14725778822d86b0337407514b9372562b86edfa91cdAndreas Huber    return index;
14735778822d86b0337407514b9372562b86edfa91cdAndreas Huber}
14745778822d86b0337407514b9372562b86edfa91cdAndreas Huber
14757541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow(
14767541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        const sp<SurfaceTextureClient> &surfaceTextureClient) {
14777541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    status_t err;
14787541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
14797541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (mNativeWindow != NULL) {
14807541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_disconnect(
14817541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA);
14827541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
14837541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
14847541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGW("native_window_api_disconnect returned an error: %s (%d)",
14857541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
14867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
14877541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
14887541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow.clear();
14897541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
14907541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
14917541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    if (surfaceTextureClient != NULL) {
14927541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        err = native_window_api_connect(
14937541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA);
14947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
14957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        if (err != OK) {
14967541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            ALOGE("native_window_api_connect returned an error: %s (%d)",
14977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber                    strerror(-err), err);
14987541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
14997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber            return err;
15007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        }
15017541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
15027541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber        mNativeWindow = surfaceTextureClient;
15037541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    }
15047541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
15057541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber    return OK;
15067541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber}
15077541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber
1508575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() {
1509575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if (mActivityNotify == NULL) {
1510575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        return;
1511575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1512575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
1513575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    if ((mFlags & (kFlagStickyError
1514575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputBuffersChanged
1515575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber                    | kFlagOutputFormatChanged))
1516575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexInput].empty()
1517575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber            || !mAvailPortBuffers[kPortIndexOutput].empty()) {
1518575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify->post();
1519575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber        mActivityNotify.clear();
1520575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber    }
1521575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber}
1522575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber
15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber}  // namespace android
1524