MediaCodec.cpp revision 7bad72237b49ac47e77ffe2a89fd26f3d171324c
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 4137bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getOutputBuffer(size_t index, sp<ABuffer> *buffer) { 4147bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> format; 4157bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexOutput, index, buffer, &format); 4167bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 4177bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4187bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getOutputFormat(size_t index, sp<AMessage> *format) { 4197bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> buffer; 4207bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexOutput, index, &buffer, format); 4217bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 4227bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4237bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getInputBuffer(size_t index, sp<ABuffer> *buffer) { 4247bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> format; 4257bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexInput, index, buffer, &format); 4267bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 4277bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4287bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getBufferAndFormat( 4297bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar size_t portIndex, size_t index, 4307bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> *buffer, sp<AMessage> *format) { 4317bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // use mutex instead of a context switch 4327bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4337bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar buffer->clear(); 4347bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar format->clear(); 4357bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar if (mState != STARTED) { 4367bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return INVALID_OPERATION; 4377bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 4387bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4397bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // we do not want mPortBuffers to change during this section 4407bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // we also don't want mOwnedByClient to change during this 4417bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 4427bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 4437bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar if (index < buffers->size()) { 4447bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar const BufferInfo &info = buffers->itemAt(index); 4457bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar if (info.mOwnedByClient) { 4467bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar *buffer = info.mData; 4477bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar *format = info.mFormat; 4487bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 4497bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 4507bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return OK; 4517bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 4527bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4535778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() { 4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 460496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() { 461496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 462496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 463496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return OK; 464496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 465496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 466575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> ¬ify) { 467575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id()); 468575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->setMessage("notify", notify); 469575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->post(); 470575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 471575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber//////////////////////////////////////////////////////////////////////////////// 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4745778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() { 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4965778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { 4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueInputPending))) { 5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5225778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueOutputPending))) { 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputBuffersChanged) { 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputFormatChanged) { 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_FORMAT_CHANGED); 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexOutput); 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[kPortIndexOutput].itemAt(index).mData; 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("offset", buffer->offset()); 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("size", buffer->size()); 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt64("timeUs", timeUs); 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags = 0; 5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_SYNCFRAME; 5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_CODECCONFIG; 5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_EOS) { 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_EOS; 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("flags", flags); 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5775778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) { 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatCodecNotify: 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t what; 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("what", &what)); 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (what) { 58592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatError: 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxError, internalError; 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("omx-error", &omxError)); 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("err", &internalError)); 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Codec reported an error. " 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber "(omx error 0x%08x, internalError %d)", 5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber omxError, internalError); 5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 595aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (omxError == OMX_ErrorResourcesLost 596aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber && internalError == DEAD_OBJECT) { 597aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags |= kFlagSawMediaServerDie; 598aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 599aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sendErrorReponse = true; 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (mState) { 6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber case INITIALIZING: 6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(UNINITIALIZED); 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber case CONFIGURING: 6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTING: 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STOPPING: 622c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case RELEASING: 6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Ignore the error, assuming we'll still get 6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the shutdown complete notification. 6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6275778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 62803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 629aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 63003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // MediaServer died, there definitely won't 63103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // be a shutdown complete notification after 63203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // all. 63303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 63403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // note that we're directly going from 63503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // STOPPING->UNINITIALIZED, instead of the 63603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // usual STOPPING->INITIALIZED state. 63703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber setState(UNINITIALIZED); 63803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 63903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber (new AMessage)->postReply(mReplyID); 64003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber } 6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber case FLUSHING: 6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTED: 6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 655575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 6565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6575778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 658ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 6595778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 667575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 668ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6735778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sendErrorReponse) { 6745778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", UNKNOWN_ERROR); 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mReplyID); 6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 68292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatComponentAllocated: 6835778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, INITIALIZING); 6855778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 6865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 687717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->findString("componentName", &mComponentName)); 6885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 689717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.startsWith("OMX.google.")) { 6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagIsSoftwareCodec; 6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 6925778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagIsSoftwareCodec; 6935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 695717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.endsWith(".secure")) { 6961bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags |= kFlagIsSecure; 6971bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 6981bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags &= ~kFlagIsSecure; 6991bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 7001bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 7015778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 70592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatComponentConfigured: 7065778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7075778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, CONFIGURING); 7085778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 7095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7106507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden // reset input surface flag 7116507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = false; 7126507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 713e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("input-format", &mInputFormat)); 714e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("output-format", &mOutputFormat)); 715e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 72092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatInputSurfaceCreated: 7217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 72292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar // response to initiateCreateInputSurface() 7237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = NO_ERROR; 7247cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 7257cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (!msg->findInt32("err", &err)) { 7267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 7277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden msg->findObject("input-surface", &obj); 7287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(obj != NULL); 7297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setObject("input-surface", obj); 7306507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = true; 7317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 7327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 7337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 7357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 7367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 73892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatSignaledInputEOS: 7397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 74092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar // response to signalEndOfInputStream() 7417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 7427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 7437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (msg->findInt32("err", &err)) { 7447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 7457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 7477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 7487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 7507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 75192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatBuffersAllocated: 7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7537bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 7545778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 7555778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 7565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7575778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("%s buffers allocated", 7585778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 7595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7605778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput 7615778822d86b0337407514b9372562b86edfa91cdAndreas Huber || portIndex == kPortIndexOutput); 7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[portIndex].clear(); 7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 767eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<RefBase> obj; 768eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber CHECK(msg->findObject("portDesc", &obj)); 769eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 77092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase::PortDescription> portDesc = 77192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar static_cast<CodecBase::PortDescription *>(obj.get()); 7725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 773eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber size_t numBuffers = portDesc->countBuffers(); 7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 775eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber for (size_t i = 0; i < numBuffers; ++i) { 7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo info; 777eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mBufferID = portDesc->bufferIDAt(i); 7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mOwnedByClient = false; 779eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mData = portDesc->bufferAt(i); 7805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (portIndex == kPortIndexInput && mCrypto != NULL) { 782ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mEncryptedData = 783ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber new ABuffer(info.mData->capacity()); 784ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 785ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffers->push_back(info); 7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexOutput) { 7905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTING) { 7915778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We're always allocating output buffers after 7925778822d86b0337407514b9372562b86edfa91cdAndreas Huber // allocating input buffers, so this is a good 7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber // indication that now all buffers are allocated. 7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputBuffersChanged; 798575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8015778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 80492cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatOutputFormatChanged: 8055778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8065778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("codec output format changed"); 8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mFlags & kFlagIsSoftwareCodec) 8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mNativeWindow != NULL) { 8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp("video/", mime.c_str(), 6)) { 8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 8185778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("width", &width)); 8195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("height", &height)); 8205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8216539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo int32_t cropLeft, cropTop, cropRight, cropBottom; 8226539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo CHECK(msg->findRect("crop", 8236539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo &cropLeft, &cropTop, &cropRight, &cropBottom)); 8246539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo 8255778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t colorFormat; 8265778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32( 8275778822d86b0337407514b9372562b86edfa91cdAndreas Huber "color-format", &colorFormat)); 8285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = new MetaData; 8305778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyWidth, width); 8315778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyHeight, height); 8326539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo meta->setRect(kKeyCropRect, 8336539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo cropLeft, cropTop, cropRight, cropBottom); 8345778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyColorFormat, colorFormat); 8355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = 8375778822d86b0337407514b9372562b86edfa91cdAndreas Huber new SoftwareRenderer(mNativeWindow, meta); 8385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat = msg; 842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagIsEncoder) { 844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Before we announce the format change we should 845e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // collect codec specific data and amend the output 846e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format as necessary. 847e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagGatherCodecSpecificData; 848e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 849e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 850e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber postActivityNotificationIfPossible(); 851e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 85592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatFillThisBuffer: 8565778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexInput, msg); 8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 859c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 860c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 861c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!mCSD.empty()) { 8678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 8688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK_GE(index, 0); 8698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // If codec specific data had been specified as 8718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // part of the format in the call to configure and 8728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // if there's more csd left, we submit it here 8738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // clients only get access to input buffers once 8748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // this data has been exhausted. 8758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t err = queueCSDInputBuffer(index); 8778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (err != OK) { 8798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGE("queueCSDInputBuffer failed w/ error %d", 8808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber err); 8818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mFlags |= kFlagStickyError; 883575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 884575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 8858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber cancelPendingDequeueOperations(); 8868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 8878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 8888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 8898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); 8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8935778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 8945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 8955778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 896575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 897575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 90292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatDrainThisBuffer: 9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexOutput, msg); 9055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 906c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 907c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 908c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9132d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 9142d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", &omxFlags)); 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9195778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->meta()->setInt32("omxFlags", omxFlags); 9205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 921e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagGatherCodecSpecificData) { 922e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // This is the very first output buffer after a 923e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format change was signalled, it'll either contain 924e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the one piece of codec specific data we can expect 925e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // or there won't be codec specific data. 926e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 927e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t err = 928e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber amendOutputFormatWithCodecSpecificData(buffer); 929e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 930e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (err != OK) { 931e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ALOGE("Codec spit out malformed codec " 932e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "specific data!"); 933e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 934e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 935e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 936e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 937e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 938e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 939e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID)); 9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 946575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 947575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 949575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 95392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatEOS: 9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We already notify the client of this by using the 9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber // corresponding flag in "onOutputBufferReady". 9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 96092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatShutdownCompleted: 9615778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 962c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == STOPPING) { 963c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(INITIALIZED); 964c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } else { 965c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mState, RELEASING); 966c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(UNINITIALIZED); 967c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 9705778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 97392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatFlushCompleted: 9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, FLUSHING); 9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalResume(); 9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatInit: 9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9975778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9995778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10005778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZING); 10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name; 10075778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("name", &name)); 10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t nameIsType; 10105778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder = false; 10110db280176bd3277e3256252d063f3712b1905ba9Andreas Huber CHECK(msg->findInt32("nameIsType", &nameIsType)); 10120db280176bd3277e3256252d063f3712b1905ba9Andreas Huber if (nameIsType) { 10135778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("encoder", &encoder)); 10145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10165778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format = new AMessage; 10175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 10195778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("mime", name.c_str()); 10205778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", encoder); 10215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 10225778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("componentName", name.c_str()); 10235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateAllocateComponent(format); 10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10295778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatConfigure: 10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED) { 10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<RefBase> obj; 10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findObject("native-window", &obj)) { 10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber obj.clear(); 10455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("format", &format)); 10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (obj != NULL) { 10515778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setObject("native-window", obj); 10521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10537541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err = setNativeWindow( 10547541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()) 10557541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ->getSurfaceTextureClient()); 10567541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10577541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 10587541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber sp<AMessage> response = new AMessage; 10597541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->setInt32("err", err); 10607541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10617541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->postReply(replyID); 10627541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber break; 10631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 10641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 10657541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 10661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 10671bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10687541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mReplyID = replyID; 10697541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setState(CONFIGURING); 10707541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *crypto; 10721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!msg->findPointer("crypto", &crypto)) { 10731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber crypto = NULL; 10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10761bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto = static_cast<ICrypto *>(crypto); 10771bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & CONFIGURE_FLAG_ENCODE) { 10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", true); 1083e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagIsEncoder; 10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber extractCSD(format); 10878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateConfigureComponent(format); 10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatCreateInputSurface: 10937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 10947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 10957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 10967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Must be configured, but can't have been started yet. 10987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != CONFIGURED) { 10997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage; 11007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", INVALID_OPERATION); 11017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 11027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(replyID); 11037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 11047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 11057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 11067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 11077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->initiateCreateInputSurface(); 11087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 11097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 11107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 11115778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 11125778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11165778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != CONFIGURED) { 11175778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11185778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 11195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTING); 11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateStart(); 11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 1132c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case kWhatRelease: 1133c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 1134aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber State targetState = 1135aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (msg->what() == kWhatStop) ? INITIALIZED : UNINITIALIZED; 1136aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1137c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber uint32_t replyID; 1138c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1139c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1140c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState != INITIALIZED 1141c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mState != CONFIGURED && mState != STARTED) { 114203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // We may be in "UNINITIALIZED" state already without the 114303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // client being aware of this if media server died while 114403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // we were being stopped. The client would assume that 114503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // after stop() returned, it would be safe to call release() 114603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // and it should be in this case, no harm to allow a release() 114703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // if we're already uninitialized. 1148aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // Similarly stopping a stopped MediaCodec should be benign. 1149c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response = new AMessage; 115003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber response->setInt32( 115103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber "err", 1152aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mState == targetState ? OK : INVALID_OPERATION); 1153c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1154c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->postReply(replyID); 1155c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 1156c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 1157c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1158aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 1159aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // It's dead, Jim. Don't expect initiateShutdown to yield 1160aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // any useful results now... 1161aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(UNINITIALIZED); 1162aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (new AMessage)->postReply(replyID); 1163aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber break; 1164aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 1165aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1166c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mReplyID = replyID; 1167aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(msg->what() == kWhatStop ? STOPPING : RELEASING); 1168aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1169aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mCodec->initiateShutdown( 1170aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber msg->what() == kWhatStop /* keepComponentAllocated */); 1171c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputBuffer: 11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11795778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11816507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (mHaveInputSurface) { 11826507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden ALOGE("dequeueInputBuffer can't be used with input surface"); 11836507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> response = new AMessage; 11846507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden response->setInt32("err", INVALID_OPERATION); 11856507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden response->postReply(replyID); 11866507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden break; 11876507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 11886507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 11895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueInputBuffer(replyID, true /* new request */)) { 11905778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11935778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 11945778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 11955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 11975778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11985778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 11995778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueInputPending; 12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = replyID; 12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueInputTimedOut, id()); 12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueInputTimeoutGeneration); 12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputTimedOut: 12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 12205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueInputTimeoutGeneration) { 12225778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 12235778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueInputPending); 12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 12305778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatQueueInputBuffer: 12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onQueueInputBuffer(msg); 12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputBuffer: 12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueOutputBuffer(replyID, true /* new request */)) { 12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueOutputPending; 12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = replyID; 12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueOutputTimedOut, id()); 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueOutputTimeoutGeneration); 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputTimedOut: 12915778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12925778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 12935778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 12945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueOutputTimeoutGeneration) { 12965778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 12975778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13005778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueOutputPending); 13015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13035778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 13045778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 13055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 13075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 13085778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReleaseOutputBuffer: 13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13165778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 13175778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13215778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onReleaseOutputBuffer(msg); 13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13295778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatSignalEndOfInputStream: 13337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 13347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 13357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 13367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != STARTED || (mFlags & kFlagStickyError)) { 13387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage; 13397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", INVALID_OPERATION); 13407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(replyID); 13427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 13437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 13447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 13467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalEndOfInputStream(); 13477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 13487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 13497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13505778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetBuffers: 13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13635778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 13645778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > *dstBuffers; 13675778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffers", (void **)&dstBuffers)); 13685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13695778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffers->clear(); 13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex]; 13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13725778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < srcBuffers.size(); ++i) { 13735778822d86b0337407514b9372562b86edfa91cdAndreas Huber const BufferInfo &info = srcBuffers.itemAt(i); 13745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1375ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber dstBuffers->push_back( 13761bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (portIndex == kPortIndexInput && mCrypto != NULL) 1377ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? info.mEncryptedData : info.mData); 13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(replyID); 13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13845778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatFlush: 13855778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 13905778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13915778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13935778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13945778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 13985778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(FLUSHING); 13995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalFlush(); 14015778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 14025778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1405e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case kWhatGetInputFormat: 14065778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetOutputFormat: 14075778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1408e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> format = 1409e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (msg->what() == kWhatGetOutputFormat ? mOutputFormat : mInputFormat); 1410e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 14115778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 14125778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 14135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1414e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((mState != CONFIGURED && mState != STARTING && 1415e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mState != STARTED && mState != FLUSHING) 1416972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || (mFlags & kFlagStickyError) 1417e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar || format == NULL) { 14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 14205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14215778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 14225778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14255778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 1426e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar response->setMessage("format", format); 14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1431496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 1432496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 1433496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mCodec->signalRequestIDRFrame(); 1434496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 1435496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 1436496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 1437575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber case kWhatRequestActivityNotification: 1438575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber { 1439575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(mActivityNotify == NULL); 1440575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(msg->findMessage("notify", &mActivityNotify)); 1441575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1442575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 1443575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber break; 1444575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1445575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1446717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo case kWhatGetName: 1447717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo { 1448717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo uint32_t replyID; 1449717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->senderAwaitsResponse(&replyID)); 1450717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1451717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.empty()) { 1452717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1453717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setInt32("err", INVALID_OPERATION); 1454717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1455717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1456717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1457717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1458717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1459717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1460717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setString("name", mComponentName.c_str()); 1461717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1462717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1463717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1464717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1465a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 1466a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 1467a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber uint32_t replyID; 1468a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1469a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1470a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 1471a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 1472a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1473a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = onSetParameters(params); 1474a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1475a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response = new AMessage; 1476a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->setInt32("err", err); 1477a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1478a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->postReply(replyID); 1479a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 1480a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 1481a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 14825778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 14835778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 14845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14855778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 14865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14878ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) { 14888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.clear(); 14898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber size_t i = 0; 14918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber for (;;) { 14928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd; 14938ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) { 14948ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 14958ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14968ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14978ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.push_back(csd); 14988ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ++i; 14998ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 15008ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 1501a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("Found %zu pieces of codec specific data.", mCSD.size()); 15028ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 15038ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15048ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) { 15058ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK(!mCSD.empty()); 15068ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15077bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar const BufferInfo *info = 15087bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar &mPortBuffers[kPortIndexInput].itemAt(bufferIndex); 15098ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15108ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd = *mCSD.begin(); 15118ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.erase(mCSD.begin()); 15128ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15138ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber const sp<ABuffer> &codecInputData = 15148ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber (mCrypto != NULL) ? info->mEncryptedData : info->mData; 15158ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15168ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (csd->size() > codecInputData->capacity()) { 15178ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return -EINVAL; 15188ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 15198ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15208ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber memcpy(codecInputData->data(), csd->data(), csd->size()); 15218ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15228ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber AString errorDetailMsg; 15238ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15248ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 15258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("index", bufferIndex); 15268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("offset", 0); 15278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("size", csd->size()); 15288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt64("timeUs", 0ll); 15298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG); 15308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setPointer("errorDetailMsg", &errorDetailMsg); 15318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return onQueueInputBuffer(msg); 15338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 15348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15355778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) { 15367541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (newState == INITIALIZED || newState == UNINITIALIZED) { 15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 15385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 15395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto.clear(); 15417541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 15425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat.clear(); 15445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 15455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 15465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagStickyError; 1547e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagIsEncoder; 1548e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 1549575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1550575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 15515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1553717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (newState == UNINITIALIZED) { 1554717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo mComponentName.clear(); 1555aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1556aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // The component is gone, mediaserver's probably back up already 1557aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // but should definitely be back up should we try to instantiate 1558aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // another component.. and the cycle continues. 1559aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags &= ~kFlagSawMediaServerDie; 1560717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1561717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 15625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = newState; 15635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15645778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 15655778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15675778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() { 15685778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 15695778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 15705778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15725778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) { 15735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 15747bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify != NULL) { 15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = info->mNotify; 15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexInput) { 15877fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* no error, just returning buffers */ 15887fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar msg->setInt32("err", OK); 15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].clear(); 15955778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15975778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers( 15985778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex, const sp<AMessage> &msg) { 15995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 16005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1601609b815a3131d22da38b2f452faa9f89daad4039Andy Hung uint32_t bufferID; 1602609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 16035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16045778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 16055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16065778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 16075778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 16085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mBufferID == bufferID) { 16105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mNotify == NULL); 16115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("reply", &info->mNotify)); 16125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].push_back(i); 16145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return i; 16165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16195778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 16205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16215778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 16225778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16245778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { 16255778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 16265778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 16275778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 16285778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 16295778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 16305778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 16315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("offset", &offset)); 16325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeUs", &timeUs)); 16335778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 16345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16354b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples; 16364b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples; 16374b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *key; 16384b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *iv; 16394b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted; 16404b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16414b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // We allow the simpler queueInputBuffer API to be used even in 16424b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // secure mode, by fabricating a single unencrypted subSample. 16434b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::SubSample ss; 16444b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (msg->findSize("size", &size)) { 16464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto != NULL) { 16474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfClearData = size; 16484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfEncryptedData = 0; 16494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples = &ss; 16514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples = 1; 16524b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = NULL; 16534b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = NULL; 16544b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16554b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } else { 16564b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto == NULL) { 16574b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber return -EINVAL; 16584b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16594b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16604b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("subSamples", (void **)&subSamples)); 16614b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findSize("numSubSamples", &numSubSamples)); 16624b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("key", (void **)&key)); 16634b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("iv", (void **)&iv)); 16644b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16654b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int32_t tmp; 16664b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findInt32("mode", &tmp)); 16674b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16684b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber mode = (CryptoPlugin::Mode)tmp; 16694b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16704b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size = 0; 16714b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 16724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfClearData; 16734b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfEncryptedData; 16744b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16775778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexInput].size()) { 16785778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 16795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16815778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index); 16825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 16845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 16855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (offset + size > info->mData->capacity()) { 16885778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 16895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16915778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> reply = info->mNotify; 16925778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->setRange(offset, size); 16935778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 16945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_EOS) { 16965778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("eos", true); 16975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_CODECCONFIG) { 17005778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("csd", true); 17015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17031bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mCrypto != NULL) { 17041bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (size > info->mEncryptedData->capacity()) { 17051bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -ERANGE; 1706ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1707ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 17085b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg; 17095b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); 17105b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 1711fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = mCrypto->decrypt( 17121bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (mFlags & kFlagIsSecure) != 0, 17131bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 17141bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 17151bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 17161bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mEncryptedData->base() + offset, 17174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples, 17184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples, 17195b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mData->base(), 17205b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg); 17211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1722fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result < 0) { 1723fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 1724ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1725ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1726fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong info->mData->setRange(0, result); 1727ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1728ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 17297bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // synchronization boundary for getBufferAndFormat 17307bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 17317bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 17327bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = false; 17337bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 17342d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", info->mData); 17355778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->post(); 17365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17375b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mNotify = NULL; 17385b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 17395778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 17405778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17425778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { 17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t render; 17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("render", &render)) { 17485778822d86b0337407514b9372562b86edfa91cdAndreas Huber render = 0; 17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17515778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED) { 17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexOutput].size()) { 17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17657bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // synchronization boundary for getBufferAndFormat 17667bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 17677bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 17687bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = false; 17697bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 17707bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 177179ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou if (render && info->mData != NULL && info->mData->size() != 0) { 17725778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->setInt32("render", true); 17735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1774fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 1775fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (msg->findInt64("timestampNs", ×tampNs)) { 1776fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mNotify->setInt64("timestampNs", timestampNs); 1777fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } else { 1778fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 1779fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 1780fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 1781fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 1782fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 1783fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 178447aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 1785fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 1786fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1787fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 1788fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1789fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 17905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mSoftRenderer != NULL) { 17915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer->render( 1792fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mData->data(), info->mData->size(), timestampNs, NULL); 17935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17965778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->post(); 17975778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 17985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17995778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 18005778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 18015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18025778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { 18035778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 18045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18055778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> *availBuffers = &mAvailPortBuffers[portIndex]; 18065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (availBuffers->empty()) { 18085778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EAGAIN; 18095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18115778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index = *availBuffers->begin(); 18125778822d86b0337407514b9372562b86edfa91cdAndreas Huber availBuffers->erase(availBuffers->begin()); 18135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18145778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index); 18155778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!info->mOwnedByClient); 18167bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 18177bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 18187bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mFormat = portIndex == kPortIndexInput ? mInputFormat : mOutputFormat; 18197bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = true; 18207bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 18215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18225778822d86b0337407514b9372562b86edfa91cdAndreas Huber return index; 18235778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 18245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18257541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow( 18261a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &surfaceTextureClient) { 18277541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err; 18287541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18297541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (mNativeWindow != NULL) { 18307541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_disconnect( 18317541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA); 18327541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18337541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 18347541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGW("native_window_api_disconnect returned an error: %s (%d)", 18357541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 18367541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 18377541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18387541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.clear(); 18397541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 18407541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18417541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (surfaceTextureClient != NULL) { 18427541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_connect( 18437541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA); 18447541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18457541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 18467541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGE("native_window_api_connect returned an error: %s (%d)", 18477541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 18487541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18497541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return err; 18507541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 18517541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18527541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow = surfaceTextureClient; 18537541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 18547541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18557541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return OK; 18567541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber} 18577541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 1858575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() { 1859575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if (mActivityNotify == NULL) { 1860575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber return; 1861575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1862575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1863575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if ((mFlags & (kFlagStickyError 1864575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputBuffersChanged 1865575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputFormatChanged)) 1866575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexInput].empty() 1867575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexOutput].empty()) { 1868575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify->post(); 1869575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 1870575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1871575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 1872575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1873a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> ¶ms) { 1874a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 1875a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 1876a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1877a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response; 1878a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return PostAndAwaitResponse(msg, &response); 1879a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1880a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1881a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) { 1882a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mCodec->signalSetParameters(params); 1883a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1884a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 1885a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1886a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1887e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatus_t MediaCodec::amendOutputFormatWithCodecSpecificData( 1888e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const sp<ABuffer> &buffer) { 1889e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber AString mime; 1890e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(mOutputFormat->findString("mime", &mime)); 1891e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1892e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) { 1893e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Codec specific data should be SPS and PPS in a single buffer, 1894e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // each prefixed by a startcode (0x00 0x00 0x00 0x01). 1895e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // We separate the two and put them into the output format 1896e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // under the keys "csd-0" and "csd-1". 1897e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1898e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber unsigned csdIndex = 0; 1899e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1900e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *data = buffer->data(); 1901e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t size = buffer->size(); 1902e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1903e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *nalStart; 1904e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t nalSize; 1905e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { 1906e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber sp<ABuffer> csd = new ABuffer(nalSize + 4); 1907e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data(), "\x00\x00\x00\x01", 4); 1908e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data() + 4, nalStart, nalSize); 1909e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1910e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer( 1911e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber StringPrintf("csd-%u", csdIndex).c_str(), csd); 1912e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1913e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++csdIndex; 1914e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1915e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1916e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (csdIndex != 2) { 1917e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_MALFORMED; 1918e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1919e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 1920e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // For everything else we just stash the codec specific data into 1921e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the output format as a single piece of csd under "csd-0". 1922e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer("csd-0", buffer); 1923e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1924e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1925e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 1926e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 1927e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 19285778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 1929