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