MediaCodec.cpp revision fc7fca77caa12993dd938d5ff43797d781291027
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), 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec(new ACodec), 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. 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool needDedicatedLooper = false; 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType && !strncasecmp(name, "video/", 6)) { 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1096f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } else { 1106f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen AString tmp = name; 1116f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (tmp.endsWith(".secure")) { 1126f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen tmp.erase(tmp.size() - 7, 7); 1136f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1146f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen const MediaCodecList *mcl = MediaCodecList::getInstance(); 1156f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen ssize_t codecIdx = mcl->findCodecByName(tmp.c_str()); 1166f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (codecIdx >= 0) { 1176f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen Vector<AString> types; 1186f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (mcl->getSupportedTypes(codecIdx, &types) == OK) { 11984333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber for (size_t i = 0; i < types.size(); i++) { 1206f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (types[i].startsWith("video/")) { 1216f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen needDedicatedLooper = true; 1226f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen break; 1236f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1246f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1256f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1266f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (needDedicatedLooper) { 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mCodecLooper == NULL) { 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper = new ALooper; 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->setName("CodecLooper"); 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->registerHandler(mCodec); 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(mCodec); 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(this); 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id())); 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatInit, id()); 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setString("name", name); 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("nameIsType", nameIsType); 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("encoder", encoder); 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure( 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 1591a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 1601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags) { 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setMessage("format", format); 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nativeWindow != NULL) { 1681bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setObject( 1691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber "native-window", 1701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber new NativeWindowWrapper(nativeWindow)); 1711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (crypto != NULL) { 1741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setPointer("crypto", crypto.get()); 1755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1775778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface( 1827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer>* bufferProducer) { 1837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id()); 1847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 1867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = PostAndAwaitResponse(msg, &response); 1877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == NO_ERROR) { 1887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // unwrap the sp<IGraphicBufferProducer> 1897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 1907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden bool found = response->findObject("input-surface", &obj); 1917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(found); 1927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<BufferProducerWrapper> wrapper( 1937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden static_cast<BufferProducerWrapper*>(obj.get())); 1947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden *bufferProducer = wrapper->getBufferProducer(); 1957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 1967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGW("createInputSurface failed, err=%d", err); 1977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 1987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return err; 1997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 2007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 2015778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() { 2025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStart, id()); 2035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() { 2095778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStop, id()); 2105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 215c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() { 216c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatRelease, id()); 217c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 218c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response; 219c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return PostAndAwaitResponse(msg, &response); 220c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 221c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer( 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 2275b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 2285b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2295b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 2305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 2315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 2325b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("offset", offset); 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("size", size); 2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 2395b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer( 2464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 2474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 2484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 2494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 2504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 2514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 2524b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 2534b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 2545b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 2555b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2565b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 2575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 2585b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 2595b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2604b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 2614b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("index", index); 2624b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("offset", offset); 2634b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("subSamples", (void *)subSamples); 2644b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("numSubSamples", numSubSamples); 2654b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("key", (void *)key); 2664b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("iv", (void *)iv); 2674b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("mode", mode); 2684b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 2694b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("flags", flags); 2705b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 2714b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 2724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> response; 2735b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber status_t err = PostAndAwaitResponse(msg, &response); 2745b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2755b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber return err; 2764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber} 2774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 2785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id()); 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer( 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs) { 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id()); 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3095778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("offset", offset)); 3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("size", size)); 3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt64("timeUs", presentationTimeUs)); 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt32("flags", (int32_t *)flags)); 3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3185778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) { 3195778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("render", true); 3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 327fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnarstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index, int64_t timestampNs) { 328fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 329fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setSize("index", index); 330fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setInt32("render", true); 331fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setInt64("timestampNs", timestampNs); 332fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 333fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar sp<AMessage> response; 334fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar return PostAndAwaitResponse(msg, &response); 335fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar} 336fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) { 3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() { 3467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id()); 3477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 3497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return PostAndAwaitResponse(msg, &response); 3507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 3517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3525778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const { 3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id()); 3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findMessage("format", format)); 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 366e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t MediaCodec::getInputFormat(sp<AMessage> *format) const { 367e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> msg = new AMessage(kWhatGetInputFormat, id()); 368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 369e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> response; 370e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t err; 371e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 372e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return err; 373e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 374e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 375e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(response->findMessage("format", format)); 376e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 377e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 378e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 379e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 380717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const { 381717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> msg = new AMessage(kWhatGetName, id()); 382717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 383717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response; 384717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t err; 385717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 386717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return err; 387717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 388717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 389717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(response->findString("name", name)); 390717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 391717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return OK; 392717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo} 393717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 3945778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const { 3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexInput); 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4035778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const { 4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexOutput); 4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() { 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 419496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() { 420496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 421496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 422496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return OK; 423496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 424496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 425575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> ¬ify) { 426575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id()); 427575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->setMessage("notify", notify); 428575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->post(); 429575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 430575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber//////////////////////////////////////////////////////////////////////////////// 4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4335778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() { 4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4555778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { 4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueInputPending))) { 4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueOutputPending))) { 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputBuffersChanged) { 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); 4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputFormatChanged) { 4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_FORMAT_CHANGED); 4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexOutput); 4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = 5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[kPortIndexOutput].itemAt(index).mData; 5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("offset", buffer->offset()); 5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("size", buffer->size()); 5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt64("timeUs", timeUs); 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags = 0; 5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_SYNCFRAME; 5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_CODECCONFIG; 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_EOS) { 5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_EOS; 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("flags", flags); 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5365778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) { 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatCodecNotify: 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t what; 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("what", &what)); 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (what) { 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatError: 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxError, internalError; 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("omx-error", &omxError)); 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("err", &internalError)); 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Codec reported an error. " 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber "(omx error 0x%08x, internalError %d)", 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber omxError, internalError); 5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 554aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (omxError == OMX_ErrorResourcesLost 555aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber && internalError == DEAD_OBJECT) { 556aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags |= kFlagSawMediaServerDie; 557aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 558aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sendErrorReponse = true; 5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (mState) { 5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber case INITIALIZING: 5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(UNINITIALIZED); 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber case CONFIGURING: 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTING: 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STOPPING: 581c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case RELEASING: 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Ignore the error, assuming we'll still get 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the shutdown complete notification. 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 58703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 588aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 58903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // MediaServer died, there definitely won't 59003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // be a shutdown complete notification after 59103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // all. 59203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 59303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // note that we're directly going from 59403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // STOPPING->UNINITIALIZED, instead of the 59503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // usual STOPPING->INITIALIZED state. 59603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber setState(UNINITIALIZED); 59703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 59803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber (new AMessage)->postReply(mReplyID); 59903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber } 6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber case FLUSHING: 6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTED: 6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 614575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 617ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 626575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 627ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sendErrorReponse) { 6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", UNKNOWN_ERROR); 6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mReplyID); 6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatComponentAllocated: 6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, INITIALIZING); 6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 646717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->findString("componentName", &mComponentName)); 6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 648717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.startsWith("OMX.google.")) { 6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagIsSoftwareCodec; 6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagIsSoftwareCodec; 6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 654717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.endsWith(".secure")) { 6551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags |= kFlagIsSecure; 6561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 6571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags &= ~kFlagIsSecure; 6581bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 6591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 6605778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatComponentConfigured: 6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, CONFIGURING); 6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6696507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden // reset input surface flag 6706507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = false; 6716507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 672e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("input-format", &mInputFormat)); 673e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("output-format", &mOutputFormat)); 674e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatInputSurfaceCreated: 6807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 6817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // response to ACodec::kWhatCreateInputSurface 6827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = NO_ERROR; 6837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 6847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (!msg->findInt32("err", &err)) { 6857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 6867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden msg->findObject("input-surface", &obj); 6877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(obj != NULL); 6887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setObject("input-surface", obj); 6896507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = true; 6907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 6917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 6927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 6937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 6947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 6957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 6967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 6977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignaledInputEOS: 6987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 6997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // response to ACodec::kWhatSignalEndOfInputStream 7007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 7017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 7027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (msg->findInt32("err", &err)) { 7037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 7047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 7067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 7077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 7097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatBuffersAllocated: 7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("%s buffers allocated", 7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput 7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber || portIndex == kPortIndexOutput); 7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[portIndex].clear(); 7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 725eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<RefBase> obj; 726eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber CHECK(msg->findObject("portDesc", &obj)); 727eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 728eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<ACodec::PortDescription> portDesc = 729eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber static_cast<ACodec::PortDescription *>(obj.get()); 7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 731eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber size_t numBuffers = portDesc->countBuffers(); 7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 733eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber for (size_t i = 0; i < numBuffers; ++i) { 7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo info; 735eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mBufferID = portDesc->bufferIDAt(i); 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mOwnedByClient = false; 737eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mData = portDesc->bufferAt(i); 7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7391bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (portIndex == kPortIndexInput && mCrypto != NULL) { 740ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mEncryptedData = 741ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber new ABuffer(info.mData->capacity()); 742ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 743ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffers->push_back(info); 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexOutput) { 7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTING) { 7495778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We're always allocating output buffers after 7505778822d86b0337407514b9372562b86edfa91cdAndreas Huber // allocating input buffers, so this is a good 7515778822d86b0337407514b9372562b86edfa91cdAndreas Huber // indication that now all buffers are allocated. 7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 7535778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 7555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputBuffersChanged; 756575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 7575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7595778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatOutputFormatChanged: 7635778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("codec output format changed"); 7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mFlags & kFlagIsSoftwareCodec) 7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mNativeWindow != NULL) { 7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp("video/", mime.c_str(), 6)) { 7725778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("width", &width)); 7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("height", &height)); 7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7796539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo int32_t cropLeft, cropTop, cropRight, cropBottom; 7806539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo CHECK(msg->findRect("crop", 7816539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo &cropLeft, &cropTop, &cropRight, &cropBottom)); 7826539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo 7835778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t colorFormat; 7845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32( 7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber "color-format", &colorFormat)); 7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = new MetaData; 7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyWidth, width); 7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyHeight, height); 7906539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo meta->setRect(kKeyCropRect, 7916539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo cropLeft, cropTop, cropRight, cropBottom); 7925778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyColorFormat, colorFormat); 7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = 7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber new SoftwareRenderer(mNativeWindow, meta); 7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat = msg; 800e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 801e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagIsEncoder) { 802e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Before we announce the format change we should 803e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // collect codec specific data and amend the output 804e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format as necessary. 805e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagGatherCodecSpecificData; 806e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 807e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 808e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber postActivityNotificationIfPossible(); 809e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatFillThisBuffer: 8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexInput, msg); 8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 817c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 818c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 819c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 8205778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 8215778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8248ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!mCSD.empty()) { 8258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 8268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK_GE(index, 0); 8278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // If codec specific data had been specified as 8298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // part of the format in the call to configure and 8308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // if there's more csd left, we submit it here 8318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // clients only get access to input buffers once 8328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // this data has been exhausted. 8338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t err = queueCSDInputBuffer(index); 8358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (err != OK) { 8378ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGE("queueCSDInputBuffer failed w/ error %d", 8388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber err); 8398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mFlags |= kFlagStickyError; 841575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 842575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 8438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber cancelPendingDequeueOperations(); 8448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 8458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 8468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 8478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 8495778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); 8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8515778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 854575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 855575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 8565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatDrainThisBuffer: 8615778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexOutput, msg); 8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 864c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 865c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 866c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 8675778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 8685778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8712d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 8722d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 8735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", &omxFlags)); 8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->meta()->setInt32("omxFlags", omxFlags); 8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 879e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagGatherCodecSpecificData) { 880e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // This is the very first output buffer after a 881e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format change was signalled, it'll either contain 882e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the one piece of codec specific data we can expect 883e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // or there won't be codec specific data. 884e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 885e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t err = 886e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber amendOutputFormatWithCodecSpecificData(buffer); 887e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 888e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (err != OK) { 889e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ALOGE("Codec spit out malformed codec " 890e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "specific data!"); 891e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 892e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 893e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 894e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 895e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 896e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 897e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID)); 9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 904575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 905575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 907575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 9085778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatEOS: 9125778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9135778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We already notify the client of this by using the 9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber // corresponding flag in "onOutputBufferReady". 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatShutdownCompleted: 9195778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 920c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == STOPPING) { 921c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(INITIALIZED); 922c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } else { 923c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mState, RELEASING); 924c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(UNINITIALIZED); 925c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 9265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9275778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 9285778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatFlushCompleted: 9325778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9335778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, FLUSHING); 9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalResume(); 9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatInit: 9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 9625778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZING); 9635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name; 9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("name", &name)); 9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t nameIsType; 9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder = false; 9690db280176bd3277e3256252d063f3712b1905ba9Andreas Huber CHECK(msg->findInt32("nameIsType", &nameIsType)); 9700db280176bd3277e3256252d063f3712b1905ba9Andreas Huber if (nameIsType) { 9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("encoder", &encoder)); 9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format = new AMessage; 9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("mime", name.c_str()); 9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", encoder); 9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("componentName", name.c_str()); 9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateAllocateComponent(format); 9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatConfigure: 9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED) { 9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9975778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10005778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<RefBase> obj; 10015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findObject("native-window", &obj)) { 10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber obj.clear(); 10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("format", &format)); 10075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (obj != NULL) { 10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setObject("native-window", obj); 10101bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10117541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err = setNativeWindow( 10127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()) 10137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ->getSurfaceTextureClient()); 10147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 10167541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber sp<AMessage> response = new AMessage; 10177541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->setInt32("err", err); 10187541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10197541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->postReply(replyID); 10207541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber break; 10211bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 10221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 10237541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 10241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 10251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10267541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mReplyID = replyID; 10277541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setState(CONFIGURING); 10287541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 10291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *crypto; 10301bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!msg->findPointer("crypto", &crypto)) { 10311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber crypto = NULL; 10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto = static_cast<ICrypto *>(crypto); 10351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & CONFIGURE_FLAG_ENCODE) { 10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", true); 1041e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagIsEncoder; 10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber extractCSD(format); 10458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateConfigureComponent(format); 10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatCreateInputSurface: 10517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 10527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 10537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 10547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Must be configured, but can't have been started yet. 10567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != CONFIGURED) { 10577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage; 10587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", INVALID_OPERATION); 10597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(replyID); 10617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 10627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 10637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 10657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->initiateCreateInputSurface(); 10667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 10677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 10687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10695778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 10705778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != CONFIGURED) { 10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTING); 10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateStart(); 10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 1090c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case kWhatRelease: 1091c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 1092aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber State targetState = 1093aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (msg->what() == kWhatStop) ? INITIALIZED : UNINITIALIZED; 1094aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1095c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber uint32_t replyID; 1096c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1097c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1098c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState != INITIALIZED 1099c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mState != CONFIGURED && mState != STARTED) { 110003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // We may be in "UNINITIALIZED" state already without the 110103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // client being aware of this if media server died while 110203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // we were being stopped. The client would assume that 110303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // after stop() returned, it would be safe to call release() 110403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // and it should be in this case, no harm to allow a release() 110503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // if we're already uninitialized. 1106aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // Similarly stopping a stopped MediaCodec should be benign. 1107c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response = new AMessage; 110803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber response->setInt32( 110903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber "err", 1110aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mState == targetState ? OK : INVALID_OPERATION); 1111c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1112c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->postReply(replyID); 1113c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 1114c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 1115c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1116aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 1117aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // It's dead, Jim. Don't expect initiateShutdown to yield 1118aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // any useful results now... 1119aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(UNINITIALIZED); 1120aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (new AMessage)->postReply(replyID); 1121aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber break; 1122aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 1123aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1124c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mReplyID = replyID; 1125aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(msg->what() == kWhatStop ? STOPPING : RELEASING); 1126aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1127aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mCodec->initiateShutdown( 1128aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber msg->what() == kWhatStop /* keepComponentAllocated */); 1129c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputBuffer: 11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11396507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (mHaveInputSurface) { 11406507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden ALOGE("dequeueInputBuffer can't be used with input surface"); 11416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> response = new AMessage; 11426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden response->setInt32("err", INVALID_OPERATION); 11436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden response->postReply(replyID); 11446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden break; 11456507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 11466507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueInputBuffer(replyID, true /* new request */)) { 11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueInputPending; 11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = replyID; 11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueInputTimedOut, id()); 11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueInputTimeoutGeneration); 11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputTimedOut: 11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueInputTimeoutGeneration) { 11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueInputPending); 11855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11865778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11875778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 11885778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 11895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 11915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11955778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatQueueInputBuffer: 11965778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11975778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11985778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onQueueInputBuffer(msg); 12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputBuffer: 12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueOutputBuffer(replyID, true /* new request */)) { 12225778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12305778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueOutputPending; 12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = replyID; 12375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueOutputTimedOut, id()); 12415778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 12425778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueOutputTimeoutGeneration); 12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12485778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputTimedOut: 12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueOutputTimeoutGeneration) { 12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueOutputPending); 12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReleaseOutputBuffer: 12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onReleaseOutputBuffer(msg); 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatSignalEndOfInputStream: 12917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 12927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 12937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 12947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != STARTED || (mFlags & kFlagStickyError)) { 12967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage; 12977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", INVALID_OPERATION); 12987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(replyID); 13007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 13017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 13027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 13047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalEndOfInputStream(); 13057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 13067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 13077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 13085778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetBuffers: 13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13175778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13215778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > *dstBuffers; 13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffers", (void **)&dstBuffers)); 13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffers->clear(); 13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex]; 13295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < srcBuffers.size(); ++i) { 13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber const BufferInfo &info = srcBuffers.itemAt(i); 13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1333ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber dstBuffers->push_back( 13341bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (portIndex == kPortIndexInput && mCrypto != NULL) 1335ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? info.mEncryptedData : info.mData); 13365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13385778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(replyID); 13395778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13425778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatFlush: 13435778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13445778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13455778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 13485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13495778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(FLUSHING); 13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalFlush(); 13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1363e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case kWhatGetInputFormat: 13645778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetOutputFormat: 13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1366e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> format = 1367e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (msg->what() == kWhatGetOutputFormat ? mOutputFormat : mInputFormat); 1368e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 13695778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1372e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((mState != CONFIGURED && mState != STARTING && 1373e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mState != STARTED && mState != FLUSHING) 1374972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || (mFlags & kFlagStickyError) 1375e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar || format == NULL) { 13765778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13775778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 1384e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar response->setMessage("format", format); 13855778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1389496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 1390496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 1391496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mCodec->signalRequestIDRFrame(); 1392496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 1393496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 1394496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 1395575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber case kWhatRequestActivityNotification: 1396575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber { 1397575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(mActivityNotify == NULL); 1398575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(msg->findMessage("notify", &mActivityNotify)); 1399575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1400575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 1401575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber break; 1402575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1403575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1404717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo case kWhatGetName: 1405717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo { 1406717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo uint32_t replyID; 1407717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->senderAwaitsResponse(&replyID)); 1408717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1409717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.empty()) { 1410717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1411717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setInt32("err", INVALID_OPERATION); 1412717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1413717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1414717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1415717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1416717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1417717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1418717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setString("name", mComponentName.c_str()); 1419717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1420717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1421717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1422717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1423a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 1424a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 1425a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber uint32_t replyID; 1426a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1427a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1428a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 1429a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 1430a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1431a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = onSetParameters(params); 1432a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1433a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response = new AMessage; 1434a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->setInt32("err", err); 1435a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1436a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->postReply(replyID); 1437a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 1438a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 1439a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 14405778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14458ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) { 14468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.clear(); 14478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber size_t i = 0; 14498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber for (;;) { 14508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd; 14518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) { 14528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 14538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.push_back(csd); 14568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ++i; 14578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGV("Found %u pieces of codec specific data.", mCSD.size()); 14608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 14618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) { 14638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK(!mCSD.empty()); 14648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber BufferInfo *info = 14668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex); 14678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd = *mCSD.begin(); 14698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.erase(mCSD.begin()); 14708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber const sp<ABuffer> &codecInputData = 14728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber (mCrypto != NULL) ? info->mEncryptedData : info->mData; 14738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (csd->size() > codecInputData->capacity()) { 14758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return -EINVAL; 14768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber memcpy(codecInputData->data(), csd->data(), csd->size()); 14798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber AString errorDetailMsg; 14818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 14838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("index", bufferIndex); 14848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("offset", 0); 14858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("size", csd->size()); 14868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt64("timeUs", 0ll); 14878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG); 14888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setPointer("errorDetailMsg", &errorDetailMsg); 14898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return onQueueInputBuffer(msg); 14918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 14928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14935778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) { 14947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (newState == INITIALIZED || newState == UNINITIALIZED) { 14955778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 14965778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 14975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14981bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto.clear(); 14997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 15005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15015778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat.clear(); 15025778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 15035778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 15045778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagStickyError; 1505e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagIsEncoder; 1506e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 1507575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1508575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 15095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1511717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (newState == UNINITIALIZED) { 1512717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo mComponentName.clear(); 1513aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1514aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // The component is gone, mediaserver's probably back up already 1515aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // but should definitely be back up should we try to instantiate 1516aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // another component.. and the cycle continues. 1517aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags &= ~kFlagSawMediaServerDie; 1518717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1519717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 15205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = newState; 15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15225778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15255778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() { 15265778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15305778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) { 15315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 15365778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify != NULL) { 15395778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = info->mNotify; 15405778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 15415778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 15425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexInput) { 15447fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* no error, just returning buffers */ 15457fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar msg->setInt32("err", OK); 15465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15475778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 15485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].clear(); 15525778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15545778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers( 15555778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex, const sp<AMessage> &msg) { 15565778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 15575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15585778822d86b0337407514b9372562b86edfa91cdAndreas Huber void *bufferID; 15595778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffer-id", &bufferID)); 15605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15615778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 15625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15635778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 15645778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 15655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mBufferID == bufferID) { 15675778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mNotify == NULL); 15685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("reply", &info->mNotify)); 15695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].push_back(i); 15715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return i; 15735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15815778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { 15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("offset", &offset)); 15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeUs", &timeUs)); 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15924b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples; 15934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples; 15944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *key; 15954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *iv; 15964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted; 15974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // We allow the simpler queueInputBuffer API to be used even in 15994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // secure mode, by fabricating a single unencrypted subSample. 16004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::SubSample ss; 16014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (msg->findSize("size", &size)) { 16034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto != NULL) { 16044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfClearData = size; 16054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfEncryptedData = 0; 16064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples = &ss; 16084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples = 1; 16094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = NULL; 16104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = NULL; 16114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } else { 16134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto == NULL) { 16144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber return -EINVAL; 16154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("subSamples", (void **)&subSamples)); 16184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findSize("numSubSamples", &numSubSamples)); 16194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("key", (void **)&key)); 16204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("iv", (void **)&iv)); 16214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int32_t tmp; 16234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findInt32("mode", &tmp)); 16244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber mode = (CryptoPlugin::Mode)tmp; 16264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size = 0; 16284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 16294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfClearData; 16304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfEncryptedData; 16314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 16334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexInput].size()) { 16355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 16365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16385778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index); 16395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16405778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 16415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 16425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (offset + size > info->mData->capacity()) { 16455778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 16465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> reply = info->mNotify; 16495778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->setRange(offset, size); 16505778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 16515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_EOS) { 16535778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("eos", true); 16545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_CODECCONFIG) { 16575778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("csd", true); 16585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mCrypto != NULL) { 16611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (size > info->mEncryptedData->capacity()) { 16621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -ERANGE; 1663ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1664ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 16655b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg; 16665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); 16675b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 1668fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = mCrypto->decrypt( 16691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (mFlags & kFlagIsSecure) != 0, 16701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 16711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 16721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 16731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mEncryptedData->base() + offset, 16744b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples, 16754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples, 16765b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mData->base(), 16775b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg); 16781bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1679fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result < 0) { 1680fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 1681ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1682ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1683fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong info->mData->setRange(0, result); 1684ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1685ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 16862d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", info->mData); 16875778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->post(); 16885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16895b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mNotify = NULL; 16905b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mOwnedByClient = false; 16915b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 16925778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 16935778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16955778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { 16965778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 16975778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 16985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16995778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t render; 17005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("render", &render)) { 17015778822d86b0337407514b9372562b86edfa91cdAndreas Huber render = 0; 17025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED) { 17055778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 17065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexOutput].size()) { 17095778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 17105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17125778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 17135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 17155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 17165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 171879ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou if (render && info->mData != NULL && info->mData->size() != 0) { 17195778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->setInt32("render", true); 17205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1721fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 1722fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (msg->findInt64("timestampNs", ×tampNs)) { 1723fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mNotify->setInt64("timestampNs", timestampNs); 1724fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } else { 1725fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 1726fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 1727fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 1728fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 1729fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 1730fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 1731fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGI("using buffer PTS of %" PRId64, timestampNs); 1732fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 1733fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1734fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 1735fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1736fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 17375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mSoftRenderer != NULL) { 17385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer->render( 1739fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mData->data(), info->mData->size(), timestampNs, NULL); 17405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->post(); 17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 17485778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17505778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { 17515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> *availBuffers = &mAvailPortBuffers[portIndex]; 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (availBuffers->empty()) { 17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EAGAIN; 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index = *availBuffers->begin(); 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber availBuffers->erase(availBuffers->begin()); 17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index); 17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!info->mOwnedByClient); 17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = true; 17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return index; 17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17697541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow( 17701a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &surfaceTextureClient) { 17717541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err; 17727541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17737541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (mNativeWindow != NULL) { 17747541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_disconnect( 17757541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA); 17767541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17777541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 17787541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGW("native_window_api_disconnect returned an error: %s (%d)", 17797541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 17807541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17817541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17827541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.clear(); 17837541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17847541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17857541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (surfaceTextureClient != NULL) { 17867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_connect( 17877541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA); 17887541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17897541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 17907541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGE("native_window_api_connect returned an error: %s (%d)", 17917541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 17927541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17937541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return err; 17947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17967541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow = surfaceTextureClient; 17977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17987541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return OK; 18007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber} 18017541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 1802575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() { 1803575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if (mActivityNotify == NULL) { 1804575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber return; 1805575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1806575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1807575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if ((mFlags & (kFlagStickyError 1808575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputBuffersChanged 1809575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputFormatChanged)) 1810575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexInput].empty() 1811575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexOutput].empty()) { 1812575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify->post(); 1813575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 1814575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1815575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 1816575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1817a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> ¶ms) { 1818a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 1819a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 1820a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1821a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response; 1822a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return PostAndAwaitResponse(msg, &response); 1823a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1824a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1825a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) { 1826a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mCodec->signalSetParameters(params); 1827a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1828a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 1829a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1830a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1831e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatus_t MediaCodec::amendOutputFormatWithCodecSpecificData( 1832e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const sp<ABuffer> &buffer) { 1833e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber AString mime; 1834e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(mOutputFormat->findString("mime", &mime)); 1835e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1836e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) { 1837e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Codec specific data should be SPS and PPS in a single buffer, 1838e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // each prefixed by a startcode (0x00 0x00 0x00 0x01). 1839e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // We separate the two and put them into the output format 1840e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // under the keys "csd-0" and "csd-1". 1841e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber unsigned csdIndex = 0; 1843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *data = buffer->data(); 1845e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t size = buffer->size(); 1846e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1847e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *nalStart; 1848e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t nalSize; 1849e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { 1850e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber sp<ABuffer> csd = new ABuffer(nalSize + 4); 1851e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data(), "\x00\x00\x00\x01", 4); 1852e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data() + 4, nalStart, nalSize); 1853e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1854e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer( 1855e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber StringPrintf("csd-%u", csdIndex).c_str(), csd); 1856e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1857e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++csdIndex; 1858e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1859e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1860e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (csdIndex != 2) { 1861e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_MALFORMED; 1862e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1863e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 1864e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // For everything else we just stash the codec specific data into 1865e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the output format as a single piece of csd under "csd-0". 1866e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer("csd-0", buffer); 1867e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1868e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1869e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 1870e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 1871e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 18725778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 1873