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