MediaCodec.cpp revision 1bd139a2a68690e80398b70b27ca59550fea0e65
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> 30ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/hexdump.h> 315778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/ACodec.h> 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h> 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h> 345778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h> 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 365778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 395778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType( 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder) { 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(mime, true /* nameIsType */, encoder) != OK) { 435778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 505778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName( 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name) { 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) { 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 605778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper) 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber : mState(UNINITIALIZED), 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper(looper), 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec(new ACodec), 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags(0), 655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer(NULL), 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputTimeoutGeneration(0), 675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID(0), 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputTimeoutGeneration(0), 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID(0) { 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 725778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() { 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, UNINITIALIZED); 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 775778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse( 785778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response) { 795778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = msg->postAndAwaitResponse(response); 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!(*response)->findInt32("err", &err)) { 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = OK; 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 925778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) { 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Current video decoders do not return from OMX_FillThisBuffer 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber // quickly, violating the OpenMAX specs, until that is remedied 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber // we need to invest in an extra looper to free the main event 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber // queue. 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool needDedicatedLooper = false; 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType && !strncasecmp(name, "video/", 6)) { 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (!nameIsType && !strncmp(name, "OMX.TI.DUCATI1.VIDEO.", 21)) { 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (needDedicatedLooper) { 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mCodecLooper == NULL) { 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper = new ALooper; 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->setName("CodecLooper"); 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->registerHandler(mCodec); 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(mCodec); 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(this); 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id())); 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatInit, id()); 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setString("name", name); 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("nameIsType", nameIsType); 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("encoder", encoder); 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure( 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<SurfaceTextureClient> &nativeWindow, 1351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags) { 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setMessage("format", format); 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nativeWindow != NULL) { 1431bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setObject( 1441bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber "native-window", 1451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber new NativeWindowWrapper(nativeWindow)); 1461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (crypto != NULL) { 1491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setPointer("crypto", crypto.get()); 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() { 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStart, id()); 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() { 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStop, id()); 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 170c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() { 171c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatRelease, id()); 172c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 173c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response; 174c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return PostAndAwaitResponse(msg, &response); 175c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 176c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer( 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags) { 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("offset", offset); 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("size", size); 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id()); 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2095778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer( 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs) { 2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id()); 2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("offset", offset)); 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("size", size)); 2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt64("timeUs", presentationTimeUs)); 2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt32("flags", (int32_t *)flags)); 2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) { 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("render", true); 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) { 2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2495778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2515778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const { 2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id()); 2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findMessage("format", format)); 2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2655778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const { 2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexInput); 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2745778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const { 2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexOutput); 2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2835778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() { 2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber//////////////////////////////////////////////////////////////////////////////// 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2925778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() { 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3145778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { 3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueInputPending))) { 3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { 3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueOutputPending))) { 3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputBuffersChanged) { 3485778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); 3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputFormatChanged) { 3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_FORMAT_CHANGED); 3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexOutput); 3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[kPortIndexOutput].itemAt(index).mData; 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("offset", buffer->offset()); 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("size", buffer->size()); 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt64("timeUs", timeUs); 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags = 0; 3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 3785778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_SYNCFRAME; 3795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_CODECCONFIG; 3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_EOS) { 3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_EOS; 3855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("flags", flags); 3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3955778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) { 3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatCodecNotify: 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t what; 4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("what", &what)); 4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (what) { 4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatError: 4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxError, internalError; 4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("omx-error", &omxError)); 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("err", &internalError)); 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Codec reported an error. " 4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber "(omx error 0x%08x, internalError %d)", 4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber omxError, internalError); 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sendErrorReponse = true; 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (mState) { 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber case INITIALIZING: 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(UNINITIALIZED); 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber case CONFIGURING: 4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTING: 4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STOPPING: 435c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case RELEASING: 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Ignore the error, assuming we'll still get 4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the shutdown complete notification. 4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber case FLUSHING: 4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTED: 4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sendErrorReponse) { 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", UNKNOWN_ERROR); 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mReplyID); 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatComponentAllocated: 4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, INITIALIZING); 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString componentName; 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("componentName", &componentName)); 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (componentName.startsWith("OMX.google.")) { 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagIsSoftwareCodec; 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagIsSoftwareCodec; 4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (componentName.endsWith(".secure")) { 4931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags |= kFlagIsSecure; 4941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 4951bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags &= ~kFlagIsSecure; 4961bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 4971bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatComponentConfigured: 5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, CONFIGURING); 5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatBuffersAllocated: 5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("%s buffers allocated", 5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput 5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber || portIndex == kPortIndexOutput); 5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[portIndex].clear(); 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0;; ++i) { 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name = StringPrintf("buffer-id_%d", i); 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber void *bufferID; 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findPointer(name.c_str(), &bufferID)) { 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber name = StringPrintf("data_%d", i); 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo info; 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mBufferID = bufferID; 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mOwnedByClient = false; 5382d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer(name.c_str(), &info.mData)); 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (portIndex == kPortIndexInput && mCrypto != NULL) { 541ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mEncryptedData = 542ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber new ABuffer(info.mData->capacity()); 543ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 544ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffers->push_back(info); 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexOutput) { 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTING) { 5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We're always allocating output buffers after 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber // allocating input buffers, so this is a good 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber // indication that now all buffers are allocated. 5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputBuffersChanged; 5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatOutputFormatChanged: 5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("codec output format changed"); 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mFlags & kFlagIsSoftwareCodec) 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mNativeWindow != NULL) { 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp("video/", mime.c_str(), 6)) { 5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("width", &width)); 5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("height", &height)); 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t colorFormat; 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32( 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber "color-format", &colorFormat)); 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = new MetaData; 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyWidth, width); 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyHeight, height); 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyColorFormat, colorFormat); 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber new SoftwareRenderer(mNativeWindow, meta); 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat = msg; 5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputFormatChanged; 5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatFillThisBuffer: 5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexInput, msg); 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 602c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 603c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 604c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); 6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatDrainThisBuffer: 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexOutput, msg); 6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 623c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 624c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 625c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 6275778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6302d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 6312d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", &omxFlags)); 6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->meta()->setInt32("omxFlags", omxFlags); 6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID)); 6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatEOS: 6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We already notify the client of this by using the 6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber // corresponding flag in "onOutputBufferReady". 6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6555778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatShutdownCompleted: 6565778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 657c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == STOPPING) { 658c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(INITIALIZED); 659c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } else { 660c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mState, RELEASING); 661c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(UNINITIALIZED); 662c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatFlushCompleted: 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, FLUSHING); 6715778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 6725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalResume(); 6745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 6805778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 6815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6825778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6855778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatInit: 6865778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6875778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 6885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 6895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 6925778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 6935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6945778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 6955778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6985778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 6995778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZING); 7005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7015778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name; 7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("name", &name)); 7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7045778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t nameIsType; 7055778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder = false; 7060db280176bd3277e3256252d063f3712b1905ba9Andreas Huber CHECK(msg->findInt32("nameIsType", &nameIsType)); 7070db280176bd3277e3256252d063f3712b1905ba9Andreas Huber if (nameIsType) { 7085778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("encoder", &encoder)); 7095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format = new AMessage; 7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("mime", name.c_str()); 7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", encoder); 7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("componentName", name.c_str()); 7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateAllocateComponent(format); 7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatConfigure: 7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7265778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 7275778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 7285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED) { 7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURING); 7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<RefBase> obj; 7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findObject("native-window", &obj)) { 7425778822d86b0337407514b9372562b86edfa91cdAndreas Huber obj.clear(); 7435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 7465778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("format", &format)); 7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (obj != NULL) { 7495778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setObject("native-window", obj); 7501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 7511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mFlags & kFlagIsSoftwareCodec) { 7521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mNativeWindow = 7531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()) 7541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber ->getSurfaceTextureClient(); 7551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 7561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 7571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mNativeWindow.clear(); 7581bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 7591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 7601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *crypto; 7611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!msg->findPointer("crypto", &crypto)) { 7621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber crypto = NULL; 7635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7651bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto = static_cast<ICrypto *>(crypto); 7661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & CONFIGURE_FLAG_ENCODE) { 7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", true); 7725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateConfigureComponent(format); 7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 7795778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7805778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 7815778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 7825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != CONFIGURED) { 7845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 7925778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTING); 7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateStart(); 7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 8015778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 8025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED 8045778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mState != CONFIGURED && mState != STARTED) { 8055778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 8065778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STOPPING); 8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 815c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->initiateShutdown(true /* keepComponentAllocated */); 816c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber returnBuffersToCodec(); 817c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 818c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 819c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 820c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case kWhatRelease: 821c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 822c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber uint32_t replyID; 823c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 824c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 825c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState != INITIALIZED 826c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mState != CONFIGURED && mState != STARTED) { 827c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response = new AMessage; 828c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->setInt32("err", INVALID_OPERATION); 829c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 830c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->postReply(replyID); 831c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 832c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 833c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 834c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mReplyID = replyID; 835c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(RELEASING); 836c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 8375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateShutdown(); 8385778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 8395778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8425778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputBuffer: 8435778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8445778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 8455778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 8465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueInputBuffer(replyID, true /* new request */)) { 8485778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8515778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 8555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 8565778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueInputPending; 8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = replyID; 8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 8655778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 8665778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueInputTimedOut, id()); 8675778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 8685778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueInputTimeoutGeneration); 8695778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8715778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputTimedOut: 8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueInputTimeoutGeneration) { 8805778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 8815778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueInputPending); 8855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8865778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 8875778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 8885778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 8895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8955778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatQueueInputBuffer: 8965778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8975778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9055778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9085778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onQueueInputBuffer(msg); 9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 9125778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9135778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputBuffer: 9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueOutputBuffer(replyID, true /* new request */)) { 9225778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9255778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 9265778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 9275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 9295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9325778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueOutputPending; 9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = replyID; 9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueOutputTimedOut, id()); 9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueOutputTimeoutGeneration); 9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputTimedOut: 9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueOutputTimeoutGeneration) { 9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueOutputPending); 9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9605778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9615778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 9625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 9635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReleaseOutputBuffer: 9705778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onReleaseOutputBuffer(msg); 9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetBuffers: 9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9975778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9995778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10005778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > *dstBuffers; 10075778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffers", (void **)&dstBuffers)); 10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffers->clear(); 10105778822d86b0337407514b9372562b86edfa91cdAndreas Huber const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex]; 10115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10125778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < srcBuffers.size(); ++i) { 10135778822d86b0337407514b9372562b86edfa91cdAndreas Huber const BufferInfo &info = srcBuffers.itemAt(i); 10145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1015ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber dstBuffers->push_back( 10161bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (portIndex == kPortIndexInput && mCrypto != NULL) 1017ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? info.mEncryptedData : info.mData); 10185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10205778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(replyID); 10215778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10245778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatFlush: 10255778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(FLUSHING); 10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalFlush(); 10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10455778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetOutputFormat: 10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mState != STARTED && mState != FLUSHING) 10515778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError)) { 10525778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10535778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 10545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10555778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10565778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10605778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setMessage("format", mOutputFormat); 10615778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10625778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10655778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 10665778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 10675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10685778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 10695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10705778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) { 1071ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (newState == INITIALIZED) { 10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10751bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto.clear(); 10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNativeWindow.clear(); 10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat.clear(); 10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagStickyError; 10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = newState; 10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10895778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() { 10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 10915778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 10925778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 10935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10945778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) { 10955778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 10965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10975778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 10985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10995778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 11005778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 11015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify != NULL) { 11035778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = info->mNotify; 11045778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 11055778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 11065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexInput) { 11085778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("err", ERROR_END_OF_STREAM); 11095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11105778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 11115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].clear(); 11155778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 11165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11175778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers( 11185778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex, const sp<AMessage> &msg) { 11195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber void *bufferID; 11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffer-id", &bufferID)); 11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mBufferID == bufferID) { 11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mNotify == NULL); 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("reply", &info->mNotify)); 11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].push_back(i); 11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return i; 11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 11405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 11425778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 11435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11445778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { 11455778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 11465778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("offset", &offset)); 11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("size", &size)); 11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeUs", &timeUs)); 11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexInput].size()) { 11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index); 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (offset + size > info->mData->capacity()) { 11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> reply = info->mNotify; 11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->setRange(offset, size); 11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_EOS) { 11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("eos", true); 11795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_CODECCONFIG) { 11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("csd", true); 11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11851bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mCrypto != NULL) { 11861bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (size > info->mEncryptedData->capacity()) { 11871bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -ERANGE; 1188ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1189ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 11901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t key[16]; 11911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber uint8_t iv[16]; 11921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 11931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CryptoPlugin::Mode mode; 11941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber CryptoPlugin::SubSample ss; 11951bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (flags & BUFFER_FLAG_ENCRYPTED) { 11961bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode = CryptoPlugin::kMode_AES_WV; 11971bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber ss.mNumBytesOfClearData = 0; 11981bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber ss.mNumBytesOfEncryptedData = size; 11991bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 12001bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode = CryptoPlugin::kMode_Unencrypted; 12011bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber ss.mNumBytesOfClearData = size; 12021bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber ss.mNumBytesOfEncryptedData = 0; 1203ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1204ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 12051bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber status_t err = mCrypto->decrypt( 12061bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (mFlags & kFlagIsSecure) != 0, 12071bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 12081bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 12091bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 12101bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mEncryptedData->base() + offset, 12111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber &ss, 12121bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1 /* numSubSamples */, 12131bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mData->base()); 12141bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 12151bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (err != OK) { 12161bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return err; 1217ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1218ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 12191bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mData->setRange(0, size); 1220ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } else if (flags & BUFFER_FLAG_ENCRYPTED) { 1221ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return -EINVAL; 1222ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1223ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 12242d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", info->mData); 12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->post(); 12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12305778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { 12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t render; 12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("render", &render)) { 12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber render = 0; 12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED) { 12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexOutput].size()) { 12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 12485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (render) { 12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->setInt32("render", true); 12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mSoftRenderer != NULL) { 12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer->render( 12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->data(), info->mData->size(), NULL); 12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->post(); 12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12695778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { 12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> *availBuffers = &mAvailPortBuffers[portIndex]; 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (availBuffers->empty()) { 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EAGAIN; 12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index = *availBuffers->begin(); 12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber availBuffers->erase(availBuffers->begin()); 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index); 12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!info->mOwnedByClient); 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = true; 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber return index; 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 1289