MediaCodec.cpp revision 92cd05b8f2e994aabcdda5d7454c96a707dc9579
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> 20fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#include <inttypes.h> 215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h> 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "include/SoftwareRenderer.h" 255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 261a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h> 27ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h> 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h> 305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h> 315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h> 32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/hexdump.h> 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/ACodec.h> 347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 356f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen#include <media/stagefright/MediaCodecList.h> 36e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include <media/stagefright/MediaDefs.h> 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h> 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h> 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h> 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 41e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include "include/avc_utils.h" 42e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 435778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 465778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType( 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder) { 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(mime, true /* nameIsType */, encoder) != OK) { 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 575778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName( 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name) { 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) { 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 655778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 675778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper) 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber : mState(UNINITIALIZED), 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper(looper), 7092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar mCodec(NULL), 717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID(0), 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags(0), 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer(NULL), 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputTimeoutGeneration(0), 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID(0), 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputTimeoutGeneration(0), 776507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mDequeueOutputReplyID(0), 786507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface(false) { 795778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 815778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() { 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, UNINITIALIZED); 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 865778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse( 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response) { 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = msg->postAndAwaitResponse(response); 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!(*response)->findInt32("err", &err)) { 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = OK; 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) { 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Current video decoders do not return from OMX_FillThisBuffer 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber // quickly, violating the OpenMAX specs, until that is remedied 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber // we need to invest in an extra looper to free the main event 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber // queue. 10692cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar mCodec = new ACodec; 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool needDedicatedLooper = false; 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType && !strncasecmp(name, "video/", 6)) { 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1106f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } else { 1116f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen AString tmp = name; 1126f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (tmp.endsWith(".secure")) { 1136f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen tmp.erase(tmp.size() - 7, 7); 1146f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1156f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen const MediaCodecList *mcl = MediaCodecList::getInstance(); 1166f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen ssize_t codecIdx = mcl->findCodecByName(tmp.c_str()); 1176f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (codecIdx >= 0) { 1186f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen Vector<AString> types; 1196f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (mcl->getSupportedTypes(codecIdx, &types) == OK) { 12084333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber for (size_t i = 0; i < types.size(); i++) { 1216f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (types[i].startsWith("video/")) { 1226f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen needDedicatedLooper = true; 1236f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen break; 1246f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1256f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1266f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1276f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (needDedicatedLooper) { 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mCodecLooper == NULL) { 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper = new ALooper; 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->setName("CodecLooper"); 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->registerHandler(mCodec); 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(mCodec); 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(this); 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id())); 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatInit, id()); 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setString("name", name); 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("nameIsType", nameIsType); 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("encoder", encoder); 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure( 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 1601a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 1611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags) { 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setMessage("format", format); 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nativeWindow != NULL) { 1691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setObject( 1701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber "native-window", 1711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber new NativeWindowWrapper(nativeWindow)); 1721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (crypto != NULL) { 1751bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setPointer("crypto", crypto.get()); 1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface( 1837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer>* bufferProducer) { 1847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id()); 1857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 1877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = PostAndAwaitResponse(msg, &response); 1887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == NO_ERROR) { 1897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // unwrap the sp<IGraphicBufferProducer> 1907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 1917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden bool found = response->findObject("input-surface", &obj); 1927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(found); 1937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<BufferProducerWrapper> wrapper( 1947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden static_cast<BufferProducerWrapper*>(obj.get())); 1957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden *bufferProducer = wrapper->getBufferProducer(); 1967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 1977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGW("createInputSurface failed, err=%d", err); 1987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 1997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return err; 2007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 2017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 2025778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() { 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStart, id()); 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2095778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() { 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStop, id()); 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 216c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() { 217c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatRelease, id()); 218c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 219c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response; 220c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return PostAndAwaitResponse(msg, &response); 221c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 222c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer( 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 2285b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 2295b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 2315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 2325b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 2335b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("offset", offset); 2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("size", size); 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 2405b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer( 2474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 2484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 2494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 2504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 2514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 2524b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 2534b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 2544b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 2555b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 2565b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 2585b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 2595b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 2605b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2614b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 2624b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("index", index); 2634b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("offset", offset); 2644b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("subSamples", (void *)subSamples); 2654b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("numSubSamples", numSubSamples); 2664b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("key", (void *)key); 2674b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("iv", (void *)iv); 2684b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("mode", mode); 2694b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 2704b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("flags", flags); 2715b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 2724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 2734b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> response; 2745b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber status_t err = PostAndAwaitResponse(msg, &response); 2755b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2765b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber return err; 2774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber} 2784b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id()); 2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer( 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs) { 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id()); 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("offset", offset)); 3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("size", size)); 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt64("timeUs", presentationTimeUs)); 3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt32("flags", (int32_t *)flags)); 3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3195778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) { 3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("render", true); 3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 328fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnarstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index, int64_t timestampNs) { 329fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 330fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setSize("index", index); 331fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setInt32("render", true); 332fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setInt64("timestampNs", timestampNs); 333fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 334fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar sp<AMessage> response; 335fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar return PostAndAwaitResponse(msg, &response); 336fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar} 337fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 3385778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) { 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() { 3477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id()); 3487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 3507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return PostAndAwaitResponse(msg, &response); 3517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 3527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3535778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const { 3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id()); 3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findMessage("format", format)); 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 367e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t MediaCodec::getInputFormat(sp<AMessage> *format) const { 368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> msg = new AMessage(kWhatGetInputFormat, id()); 369e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 370e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> response; 371e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t err; 372e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 373e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return err; 374e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 375e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 376e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(response->findMessage("format", format)); 377e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 378e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 379e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 380e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 381717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const { 382717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> msg = new AMessage(kWhatGetName, id()); 383717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 384717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response; 385717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t err; 386717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 387717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return err; 388717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 389717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 390717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(response->findString("name", name)); 391717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 392717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return OK; 393717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo} 394717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 3955778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const { 3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexInput); 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4045778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const { 4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexOutput); 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() { 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 420496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() { 421496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 422496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 423496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return OK; 424496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 425496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 426575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> ¬ify) { 427575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id()); 428575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->setMessage("notify", notify); 429575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->post(); 430575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 431575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber//////////////////////////////////////////////////////////////////////////////// 4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4345778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() { 4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4565778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { 4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueInputPending))) { 4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueOutputPending))) { 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputBuffersChanged) { 4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputFormatChanged) { 4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_FORMAT_CHANGED); 4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexOutput); 4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = 5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[kPortIndexOutput].itemAt(index).mData; 5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("offset", buffer->offset()); 5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("size", buffer->size()); 5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt64("timeUs", timeUs); 5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags = 0; 5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_SYNCFRAME; 5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_CODECCONFIG; 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_EOS) { 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_EOS; 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("flags", flags); 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5375778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) { 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatCodecNotify: 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t what; 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("what", &what)); 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (what) { 54592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatError: 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxError, internalError; 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("omx-error", &omxError)); 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("err", &internalError)); 5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Codec reported an error. " 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber "(omx error 0x%08x, internalError %d)", 5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber omxError, internalError); 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 555aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (omxError == OMX_ErrorResourcesLost 556aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber && internalError == DEAD_OBJECT) { 557aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags |= kFlagSawMediaServerDie; 558aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 559aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sendErrorReponse = true; 5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (mState) { 5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber case INITIALIZING: 5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(UNINITIALIZED); 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber case CONFIGURING: 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTING: 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STOPPING: 582c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case RELEASING: 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Ignore the error, assuming we'll still get 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the shutdown complete notification. 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 58803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 589aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 59003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // MediaServer died, there definitely won't 59103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // be a shutdown complete notification after 59203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // all. 59303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 59403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // note that we're directly going from 59503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // STOPPING->UNINITIALIZED, instead of the 59603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // usual STOPPING->INITIALIZED state. 59703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber setState(UNINITIALIZED); 59803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 59903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber (new AMessage)->postReply(mReplyID); 60003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber } 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber case FLUSHING: 6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTED: 6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 615575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 618ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 627575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 628ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sendErrorReponse) { 6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", UNKNOWN_ERROR); 6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mReplyID); 6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 64292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatComponentAllocated: 6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, INITIALIZING); 6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 647717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->findString("componentName", &mComponentName)); 6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 649717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.startsWith("OMX.google.")) { 6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagIsSoftwareCodec; 6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagIsSoftwareCodec; 6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 655717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.endsWith(".secure")) { 6561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags |= kFlagIsSecure; 6571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 6581bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags &= ~kFlagIsSecure; 6591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 6601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 66592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatComponentConfigured: 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, CONFIGURING); 6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6706507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden // reset input surface flag 6716507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = false; 6726507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 673e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("input-format", &mInputFormat)); 674e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("output-format", &mOutputFormat)); 675e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 68092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatInputSurfaceCreated: 6817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 68292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar // response to initiateCreateInputSurface() 6837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = NO_ERROR; 6847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 6857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (!msg->findInt32("err", &err)) { 6867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 6877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden msg->findObject("input-surface", &obj); 6887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(obj != NULL); 6897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setObject("input-surface", obj); 6906507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = true; 6917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 6927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 6937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 6947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 6957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 6967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 6977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 69892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatSignaledInputEOS: 6997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 70092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar // response to signalEndOfInputStream() 7017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 7027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 7037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (msg->findInt32("err", &err)) { 7047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 7057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 7077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 7087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 7107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 71192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatBuffersAllocated: 7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("%s buffers allocated", 7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput 7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber || portIndex == kPortIndexOutput); 7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[portIndex].clear(); 7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 726eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<RefBase> obj; 727eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber CHECK(msg->findObject("portDesc", &obj)); 728eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 72992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase::PortDescription> portDesc = 73092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar static_cast<CodecBase::PortDescription *>(obj.get()); 7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 732eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber size_t numBuffers = portDesc->countBuffers(); 7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 734eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber for (size_t i = 0; i < numBuffers; ++i) { 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo info; 736eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mBufferID = portDesc->bufferIDAt(i); 7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mOwnedByClient = false; 738eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mData = portDesc->bufferAt(i); 7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (portIndex == kPortIndexInput && mCrypto != NULL) { 741ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mEncryptedData = 742ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber new ABuffer(info.mData->capacity()); 743ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 744ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffers->push_back(info); 7465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexOutput) { 7495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTING) { 7505778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We're always allocating output buffers after 7515778822d86b0337407514b9372562b86edfa91cdAndreas Huber // allocating input buffers, so this is a good 7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber // indication that now all buffers are allocated. 7535778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 7545778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 7565778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputBuffersChanged; 757575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 7585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7605778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 76392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatOutputFormatChanged: 7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("codec output format changed"); 7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mFlags & kFlagIsSoftwareCodec) 7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mNativeWindow != NULL) { 7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7725778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp("video/", mime.c_str(), 6)) { 7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("width", &width)); 7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("height", &height)); 7795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7806539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo int32_t cropLeft, cropTop, cropRight, cropBottom; 7816539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo CHECK(msg->findRect("crop", 7826539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo &cropLeft, &cropTop, &cropRight, &cropBottom)); 7836539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo 7845778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t colorFormat; 7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32( 7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber "color-format", &colorFormat)); 7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = new MetaData; 7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyWidth, width); 7905778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyHeight, height); 7916539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo meta->setRect(kKeyCropRect, 7926539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo cropLeft, cropTop, cropRight, cropBottom); 7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyColorFormat, colorFormat); 7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = 7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber new SoftwareRenderer(mNativeWindow, meta); 7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat = msg; 801e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 802e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagIsEncoder) { 803e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Before we announce the format change we should 804e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // collect codec specific data and amend the output 805e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format as necessary. 806e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagGatherCodecSpecificData; 807e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 809e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber postActivityNotificationIfPossible(); 810e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 81492cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatFillThisBuffer: 8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexInput, msg); 8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 818c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 819c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 820c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 8215778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 8225778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!mCSD.empty()) { 8268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 8278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK_GE(index, 0); 8288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // If codec specific data had been specified as 8308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // part of the format in the call to configure and 8318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // if there's more csd left, we submit it here 8328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // clients only get access to input buffers once 8338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // this data has been exhausted. 8348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t err = queueCSDInputBuffer(index); 8368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8378ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (err != OK) { 8388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGE("queueCSDInputBuffer failed w/ error %d", 8398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber err); 8408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mFlags |= kFlagStickyError; 842575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 843575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 8448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber cancelPendingDequeueOperations(); 8458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 8468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 8478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 8488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); 8515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 8545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 855575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 856575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 86192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatDrainThisBuffer: 8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexOutput, msg); 8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 865c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 866c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 867c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 8685778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 8695778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 8732d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", &omxFlags)); 8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->meta()->setInt32("omxFlags", omxFlags); 8795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 880e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagGatherCodecSpecificData) { 881e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // This is the very first output buffer after a 882e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format change was signalled, it'll either contain 883e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the one piece of codec specific data we can expect 884e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // or there won't be codec specific data. 885e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 886e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t err = 887e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber amendOutputFormatWithCodecSpecificData(buffer); 888e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 889e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (err != OK) { 890e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ALOGE("Codec spit out malformed codec " 891e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "specific data!"); 892e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 893e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 894e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 895e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 896e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 897e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 898e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID)); 9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 905575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 906575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 908575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 91292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatEOS: 9135778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We already notify the client of this by using the 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber // corresponding flag in "onOutputBufferReady". 9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 91992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatShutdownCompleted: 9205778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 921c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == STOPPING) { 922c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(INITIALIZED); 923c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } else { 924c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mState, RELEASING); 925c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(UNINITIALIZED); 926c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 9275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9285778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 9295778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 93292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatFlushCompleted: 9335778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, FLUSHING); 9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalResume(); 9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatInit: 9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 9635778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZING); 9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name; 9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("name", &name)); 9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t nameIsType; 9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder = false; 9700db280176bd3277e3256252d063f3712b1905ba9Andreas Huber CHECK(msg->findInt32("nameIsType", &nameIsType)); 9710db280176bd3277e3256252d063f3712b1905ba9Andreas Huber if (nameIsType) { 9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("encoder", &encoder)); 9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format = new AMessage; 9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("mime", name.c_str()); 9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", encoder); 9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("componentName", name.c_str()); 9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateAllocateComponent(format); 9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatConfigure: 9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED) { 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 sp<RefBase> obj; 10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findObject("native-window", &obj)) { 10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber obj.clear(); 10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 10075778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("format", &format)); 10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (obj != NULL) { 10105778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setObject("native-window", obj); 10111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err = setNativeWindow( 10137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()) 10147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ->getSurfaceTextureClient()); 10157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10167541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 10177541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber sp<AMessage> response = new AMessage; 10187541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->setInt32("err", err); 10197541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10207541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->postReply(replyID); 10217541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber break; 10221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 10231bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 10247541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 10251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 10261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10277541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mReplyID = replyID; 10287541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setState(CONFIGURING); 10297541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *crypto; 10311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!msg->findPointer("crypto", &crypto)) { 10321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber crypto = NULL; 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto = static_cast<ICrypto *>(crypto); 10361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & CONFIGURE_FLAG_ENCODE) { 10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", true); 1042e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagIsEncoder; 10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber extractCSD(format); 10468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateConfigureComponent(format); 10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatCreateInputSurface: 10527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 10537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 10547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 10557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Must be configured, but can't have been started yet. 10577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != CONFIGURED) { 10587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage; 10597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", INVALID_OPERATION); 10607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(replyID); 10627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 10637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 10647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 10667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->initiateCreateInputSurface(); 10677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 10687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 10697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10705778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != CONFIGURED) { 10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTING); 10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateStart(); 10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 1091c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case kWhatRelease: 1092c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 1093aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber State targetState = 1094aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (msg->what() == kWhatStop) ? INITIALIZED : UNINITIALIZED; 1095aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1096c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber uint32_t replyID; 1097c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1098c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1099c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState != INITIALIZED 1100c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mState != CONFIGURED && mState != STARTED) { 110103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // We may be in "UNINITIALIZED" state already without the 110203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // client being aware of this if media server died while 110303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // we were being stopped. The client would assume that 110403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // after stop() returned, it would be safe to call release() 110503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // and it should be in this case, no harm to allow a release() 110603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // if we're already uninitialized. 1107aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // Similarly stopping a stopped MediaCodec should be benign. 1108c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response = new AMessage; 110903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber response->setInt32( 111003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber "err", 1111aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mState == targetState ? OK : INVALID_OPERATION); 1112c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1113c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->postReply(replyID); 1114c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 1115c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 1116c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1117aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 1118aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // It's dead, Jim. Don't expect initiateShutdown to yield 1119aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // any useful results now... 1120aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(UNINITIALIZED); 1121aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (new AMessage)->postReply(replyID); 1122aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber break; 1123aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 1124aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1125c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mReplyID = replyID; 1126aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(msg->what() == kWhatStop ? STOPPING : RELEASING); 1127aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1128aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mCodec->initiateShutdown( 1129aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber msg->what() == kWhatStop /* keepComponentAllocated */); 1130c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputBuffer: 11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11406507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (mHaveInputSurface) { 11416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden ALOGE("dequeueInputBuffer can't be used with input surface"); 11426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> response = new AMessage; 11436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden response->setInt32("err", INVALID_OPERATION); 11446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden response->postReply(replyID); 11456507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden break; 11466507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 11476507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueInputBuffer(replyID, true /* new request */)) { 11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueInputPending; 11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = replyID; 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueInputTimedOut, id()); 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueInputTimeoutGeneration); 11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputTimedOut: 11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 11795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueInputTimeoutGeneration) { 11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11855778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueInputPending); 11865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11875778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11885778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 11895778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 11905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 11935778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11965778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatQueueInputBuffer: 11975778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11985778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onQueueInputBuffer(msg); 12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputBuffer: 12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12205778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueOutputBuffer(replyID, true /* new request */)) { 12235778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 12305778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueOutputPending; 12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = replyID; 12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueOutputTimedOut, id()); 12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueOutputTimeoutGeneration); 12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputTimedOut: 12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueOutputTimeoutGeneration) { 12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueOutputPending); 12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReleaseOutputBuffer: 12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onReleaseOutputBuffer(msg); 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatSignalEndOfInputStream: 12927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 12937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 12947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 12957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != STARTED || (mFlags & kFlagStickyError)) { 12977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage; 12987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", INVALID_OPERATION); 12997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(replyID); 13017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 13027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 13037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 13057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalEndOfInputStream(); 13067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 13077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 13087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetBuffers: 13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13165778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > *dstBuffers; 13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffers", (void **)&dstBuffers)); 13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffers->clear(); 13295778822d86b0337407514b9372562b86edfa91cdAndreas Huber const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex]; 13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < srcBuffers.size(); ++i) { 13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber const BufferInfo &info = srcBuffers.itemAt(i); 13335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1334ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber dstBuffers->push_back( 13351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (portIndex == kPortIndexInput && mCrypto != NULL) 1336ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? info.mEncryptedData : info.mData); 13375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13395778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(replyID); 13405778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13435778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatFlush: 13445778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13455778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13465778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 13495778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13505778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(FLUSHING); 13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalFlush(); 13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1364e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case kWhatGetInputFormat: 13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetOutputFormat: 13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1367e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> format = 1368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (msg->what() == kWhatGetOutputFormat ? mOutputFormat : mInputFormat); 1369e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1373e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((mState != CONFIGURED && mState != STARTING && 1374e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mState != STARTED && mState != FLUSHING) 1375972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || (mFlags & kFlagStickyError) 1376e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar || format == NULL) { 13775778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 1385e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar response->setMessage("format", format); 13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1390496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 1391496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 1392496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mCodec->signalRequestIDRFrame(); 1393496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 1394496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 1395496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 1396575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber case kWhatRequestActivityNotification: 1397575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber { 1398575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(mActivityNotify == NULL); 1399575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(msg->findMessage("notify", &mActivityNotify)); 1400575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1401575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 1402575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber break; 1403575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1404575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1405717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo case kWhatGetName: 1406717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo { 1407717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo uint32_t replyID; 1408717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->senderAwaitsResponse(&replyID)); 1409717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1410717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.empty()) { 1411717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1412717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setInt32("err", INVALID_OPERATION); 1413717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1414717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1415717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1416717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1417717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1418717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1419717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setString("name", mComponentName.c_str()); 1420717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1421717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1422717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1423717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1424a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 1425a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 1426a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber uint32_t replyID; 1427a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1428a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1429a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 1430a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 1431a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1432a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = onSetParameters(params); 1433a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1434a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response = new AMessage; 1435a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->setInt32("err", err); 1436a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1437a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->postReply(replyID); 1438a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 1439a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 1440a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14468ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) { 14478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.clear(); 14488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber size_t i = 0; 14508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber for (;;) { 14518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd; 14528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) { 14538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 14548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.push_back(csd); 14578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ++i; 14588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 1460a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("Found %zu pieces of codec specific data.", mCSD.size()); 14618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 14628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) { 14648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK(!mCSD.empty()); 14658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber BufferInfo *info = 14678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex); 14688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd = *mCSD.begin(); 14708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.erase(mCSD.begin()); 14718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber const sp<ABuffer> &codecInputData = 14738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber (mCrypto != NULL) ? info->mEncryptedData : info->mData; 14748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (csd->size() > codecInputData->capacity()) { 14768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return -EINVAL; 14778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber memcpy(codecInputData->data(), csd->data(), csd->size()); 14808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber AString errorDetailMsg; 14828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 14848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("index", bufferIndex); 14858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("offset", 0); 14868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("size", csd->size()); 14878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt64("timeUs", 0ll); 14888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG); 14898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setPointer("errorDetailMsg", &errorDetailMsg); 14908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return onQueueInputBuffer(msg); 14928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 14938ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14945778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) { 14957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (newState == INITIALIZED || newState == UNINITIALIZED) { 14965778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 14975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 14985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14991bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto.clear(); 15007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 15015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15025778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat.clear(); 15035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 15045778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 15055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagStickyError; 1506e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagIsEncoder; 1507e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 1508575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1509575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1512717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (newState == UNINITIALIZED) { 1513717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo mComponentName.clear(); 1514aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1515aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // The component is gone, mediaserver's probably back up already 1516aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // but should definitely be back up should we try to instantiate 1517aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // another component.. and the cycle continues. 1518aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags &= ~kFlagSawMediaServerDie; 1519717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1520717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = newState; 15225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 15245778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15265778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() { 15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15315778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) { 15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15365778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 15385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify != NULL) { 15405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = info->mNotify; 15415778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 15425778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 15435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexInput) { 15457fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* no error, just returning buffers */ 15467fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar msg->setInt32("err", OK); 15475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15485778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 15495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].clear(); 15535778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15555778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers( 15565778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex, const sp<AMessage> &msg) { 15575778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 15585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1559609b815a3131d22da38b2f452faa9f89daad4039Andy Hung uint32_t bufferID; 1560609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 15615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15625778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 15635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15645778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 15655778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 15665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15675778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mBufferID == bufferID) { 15685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mNotify == NULL); 15695778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("reply", &info->mNotify)); 15705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].push_back(i); 15725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return i; 15745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { 15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("offset", &offset)); 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeUs", &timeUs)); 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples; 15944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples; 15954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *key; 15964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *iv; 15974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted; 15984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // We allow the simpler queueInputBuffer API to be used even in 16004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // secure mode, by fabricating a single unencrypted subSample. 16014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::SubSample ss; 16024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (msg->findSize("size", &size)) { 16044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto != NULL) { 16054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfClearData = size; 16064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfEncryptedData = 0; 16074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples = &ss; 16094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples = 1; 16104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = NULL; 16114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = NULL; 16124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } else { 16144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto == NULL) { 16154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber return -EINVAL; 16164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("subSamples", (void **)&subSamples)); 16194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findSize("numSubSamples", &numSubSamples)); 16204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("key", (void **)&key)); 16214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("iv", (void **)&iv)); 16224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int32_t tmp; 16244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findInt32("mode", &tmp)); 16254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber mode = (CryptoPlugin::Mode)tmp; 16274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size = 0; 16294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 16304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfClearData; 16314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfEncryptedData; 16324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16344b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexInput].size()) { 16365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 16375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16395778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index); 16405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 16425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 16435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (offset + size > info->mData->capacity()) { 16465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 16475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16495778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> reply = info->mNotify; 16505778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->setRange(offset, size); 16515778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 16525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_EOS) { 16545778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("eos", true); 16555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_CODECCONFIG) { 16585778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("csd", true); 16595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mCrypto != NULL) { 16621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (size > info->mEncryptedData->capacity()) { 16631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -ERANGE; 1664ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1665ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 16665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg; 16675b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); 16685b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 1669fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = mCrypto->decrypt( 16701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (mFlags & kFlagIsSecure) != 0, 16711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 16721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 16731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 16741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mEncryptedData->base() + offset, 16754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples, 16764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples, 16775b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mData->base(), 16785b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg); 16791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1680fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result < 0) { 1681fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 1682ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1683ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1684fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong info->mData->setRange(0, result); 1685ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1686ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 16872d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", info->mData); 16885778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->post(); 16895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16905b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mNotify = NULL; 16915b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mOwnedByClient = false; 16925b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 16935778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 16945778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16965778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { 16975778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 16985778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 16995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17005778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t render; 17015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("render", &render)) { 17025778822d86b0337407514b9372562b86edfa91cdAndreas Huber render = 0; 17035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED) { 17065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 17075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexOutput].size()) { 17105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 17115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17135778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 17145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 17165778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 17175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 171979ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou if (render && info->mData != NULL && info->mData->size() != 0) { 17205778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->setInt32("render", true); 17215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1722fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 1723fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (msg->findInt64("timestampNs", ×tampNs)) { 1724fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mNotify->setInt64("timestampNs", timestampNs); 1725fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } else { 1726fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 1727fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 1728fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 1729fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 1730fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 1731fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 173247aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 1733fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 1734fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1735fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 1736fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1737fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 17385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mSoftRenderer != NULL) { 17395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer->render( 1740fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mData->data(), info->mData->size(), timestampNs, NULL); 17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->post(); 17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17485778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17515778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { 17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> *availBuffers = &mAvailPortBuffers[portIndex]; 17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (availBuffers->empty()) { 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EAGAIN; 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index = *availBuffers->begin(); 17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber availBuffers->erase(availBuffers->begin()); 17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index); 17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!info->mOwnedByClient); 17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = true; 17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return index; 17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17707541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow( 17711a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &surfaceTextureClient) { 17727541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err; 17737541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17747541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (mNativeWindow != NULL) { 17757541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_disconnect( 17767541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA); 17777541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17787541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 17797541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGW("native_window_api_disconnect returned an error: %s (%d)", 17807541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 17817541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17827541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17837541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.clear(); 17847541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17857541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (surfaceTextureClient != NULL) { 17877541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_connect( 17887541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA); 17897541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17907541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 17917541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGE("native_window_api_connect returned an error: %s (%d)", 17927541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 17937541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return err; 17957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17967541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow = surfaceTextureClient; 17987541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return OK; 18017541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber} 18027541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 1803575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() { 1804575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if (mActivityNotify == NULL) { 1805575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber return; 1806575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1807575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1808575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if ((mFlags & (kFlagStickyError 1809575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputBuffersChanged 1810575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputFormatChanged)) 1811575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexInput].empty() 1812575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexOutput].empty()) { 1813575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify->post(); 1814575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 1815575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1816575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 1817575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1818a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> ¶ms) { 1819a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 1820a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 1821a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1822a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response; 1823a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return PostAndAwaitResponse(msg, &response); 1824a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1825a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1826a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) { 1827a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mCodec->signalSetParameters(params); 1828a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1829a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 1830a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1831a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1832e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatus_t MediaCodec::amendOutputFormatWithCodecSpecificData( 1833e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const sp<ABuffer> &buffer) { 1834e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber AString mime; 1835e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(mOutputFormat->findString("mime", &mime)); 1836e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1837e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) { 1838e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Codec specific data should be SPS and PPS in a single buffer, 1839e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // each prefixed by a startcode (0x00 0x00 0x00 0x01). 1840e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // We separate the two and put them into the output format 1841e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // under the keys "csd-0" and "csd-1". 1842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber unsigned csdIndex = 0; 1844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1845e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *data = buffer->data(); 1846e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t size = buffer->size(); 1847e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1848e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *nalStart; 1849e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t nalSize; 1850e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { 1851e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber sp<ABuffer> csd = new ABuffer(nalSize + 4); 1852e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data(), "\x00\x00\x00\x01", 4); 1853e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data() + 4, nalStart, nalSize); 1854e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1855e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer( 1856e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber StringPrintf("csd-%u", csdIndex).c_str(), csd); 1857e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1858e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++csdIndex; 1859e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1860e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1861e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (csdIndex != 2) { 1862e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_MALFORMED; 1863e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1864e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 1865e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // For everything else we just stash the codec specific data into 1866e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the output format as a single piece of csd under "csd-0". 1867e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer("csd-0", buffer); 1868e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1869e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1870e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 1871e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 1872e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 18735778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 1874