MediaCodec.cpp revision 671160ffe81592efa376dc1ff0fc3f4ddcdebc35
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/* 25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright 2012, The Android Open Source Project 35778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License. 65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at 75778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 85778822d86b0337407514b9372562b86edfa91cdAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software 115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and 145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License. 155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */ 165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 175778822d86b0337407514b9372562b86edfa91cdAndreas Huber//#define LOG_NDEBUG 0 185778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define LOG_TAG "MediaCodec" 195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Log.h> 20fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#include <inttypes.h> 215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h> 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 245778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "include/SoftwareRenderer.h" 255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 261a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h> 27ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h> 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h> 305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h> 315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h> 32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/hexdump.h> 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/ACodec.h> 347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 356f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen#include <media/stagefright/MediaCodecList.h> 36e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include <media/stagefright/MediaDefs.h> 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h> 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h> 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h> 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 41e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include "include/avc_utils.h" 42e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 435778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 465778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType( 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder) { 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(mime, true /* nameIsType */, encoder) != OK) { 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 575778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName( 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name) { 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) { 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 655778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 675778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper) 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber : mState(UNINITIALIZED), 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper(looper), 7092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar mCodec(NULL), 717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID(0), 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags(0), 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer(NULL), 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputTimeoutGeneration(0), 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID(0), 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputTimeoutGeneration(0), 776507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mDequeueOutputReplyID(0), 786507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface(false) { 795778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 815778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() { 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, UNINITIALIZED); 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 865778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse( 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response) { 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = msg->postAndAwaitResponse(response); 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!(*response)->findInt32("err", &err)) { 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = OK; 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 101c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang// static 102c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangvoid MediaCodec::PostReplyWithError(int32_t replyID, int32_t err) { 103c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> response = new AMessage; 104c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang response->setInt32("err", err); 105c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang response->postReply(replyID); 106c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 107c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) { 109671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // save init parameters for reset 110671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mInitName = name; 111671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mInitNameIsType = nameIsType; 112671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mInitIsEncoder = encoder; 113671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Current video decoders do not return from OMX_FillThisBuffer 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber // quickly, violating the OpenMAX specs, until that is remedied 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber // we need to invest in an extra looper to free the main event 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber // queue. 11892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar mCodec = new ACodec; 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool needDedicatedLooper = false; 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType && !strncasecmp(name, "video/", 6)) { 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1226f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } else { 1236f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen AString tmp = name; 1246f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (tmp.endsWith(".secure")) { 1256f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen tmp.erase(tmp.size() - 7, 7); 1266f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1276f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen const MediaCodecList *mcl = MediaCodecList::getInstance(); 1286f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen ssize_t codecIdx = mcl->findCodecByName(tmp.c_str()); 1296f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (codecIdx >= 0) { 1306f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen Vector<AString> types; 1316f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (mcl->getSupportedTypes(codecIdx, &types) == OK) { 13284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber for (size_t i = 0; i < types.size(); i++) { 1336f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (types[i].startsWith("video/")) { 1346f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen needDedicatedLooper = true; 1356f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen break; 1366f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1376f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1386f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1396f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (needDedicatedLooper) { 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mCodecLooper == NULL) { 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper = new ALooper; 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->setName("CodecLooper"); 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->registerHandler(mCodec); 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(mCodec); 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(this); 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id())); 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatInit, id()); 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setString("name", name); 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("nameIsType", nameIsType); 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("encoder", encoder); 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 170c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangstatus_t MediaCodec::setCallback(const sp<AMessage> &callback) { 171c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = new AMessage(kWhatSetCallback, id()); 172c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setMessage("callback", callback); 173c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 174c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> response; 175c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang return PostAndAwaitResponse(msg, &response); 176c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 177c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure( 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 1801a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 1811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags) { 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setMessage("format", format); 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nativeWindow != NULL) { 1891bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setObject( 1901bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber "native-window", 1911bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber new NativeWindowWrapper(nativeWindow)); 1921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1931bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1941bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (crypto != NULL) { 1951bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setPointer("crypto", crypto.get()); 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface( 2037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer>* bufferProducer) { 2047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id()); 2057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 2067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 2077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = PostAndAwaitResponse(msg, &response); 2087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == NO_ERROR) { 2097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // unwrap the sp<IGraphicBufferProducer> 2107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 2117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden bool found = response->findObject("input-surface", &obj); 2127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(found); 2137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<BufferProducerWrapper> wrapper( 2147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden static_cast<BufferProducerWrapper*>(obj.get())); 2157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden *bufferProducer = wrapper->getBufferProducer(); 2167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 2177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGW("createInputSurface failed, err=%d", err); 2187cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 2197cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return err; 2207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 2217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() { 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStart, id()); 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() { 2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStop, id()); 2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 236c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() { 237c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatRelease, id()); 238c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 239c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response; 240c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return PostAndAwaitResponse(msg, &response); 241c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 242c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 243671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnarstatus_t MediaCodec::reset() { 244671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar /* When external-facing MediaCodec object is created, 245671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar it is already initialized. Thus, reset is essentially 246671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar release() followed by init(), plus clearing the state */ 247671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 248671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar status_t err = release(); 249671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 250671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // unregister handlers 251671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar if (mCodec != NULL) { 252671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar if (mCodecLooper != NULL) { 253671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mCodecLooper->unregisterHandler(mCodec->id()); 254671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar } else { 255671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mLooper->unregisterHandler(mCodec->id()); 256671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar } 257671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mCodec = NULL; 258671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar } 259671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mLooper->unregisterHandler(id()); 260671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 261671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mFlags = 0; // clear all flags 262671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 263671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // reset state not reset by setState(UNINITIALIZED) 264671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mReplyID = 0; 265671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mDequeueInputReplyID = 0; 266671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mDequeueOutputReplyID = 0; 267671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mDequeueInputTimeoutGeneration = 0; 268671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mDequeueOutputTimeoutGeneration = 0; 269671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mHaveInputSurface = false; 270671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 271671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar if (err == OK) { 272671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar err = init(mInitName.c_str(), mInitNameIsType, mInitIsEncoder); 273671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar } 274671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar return err; 275671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar} 276671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 2775778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer( 2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 2825b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 2835b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2845b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 2855b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 2865b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 2875b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("offset", offset); 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("size", size); 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 2945b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer( 3014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 3024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 3034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 3044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 3054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 3064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 3074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 3084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 3095b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 3105b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 3115b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 3125b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 3135b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 3145b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 3154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 3164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("index", index); 3174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("offset", offset); 3184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("subSamples", (void *)subSamples); 3194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("numSubSamples", numSubSamples); 3204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("key", (void *)key); 3214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("iv", (void *)iv); 3224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("mode", mode); 3234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 3244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("flags", flags); 3255b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 3264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 3274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> response; 3285b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber status_t err = PostAndAwaitResponse(msg, &response); 3295b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 3305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber return err; 3314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber} 3324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { 3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id()); 3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 3445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3455778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3465778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3485778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer( 3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs) { 3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id()); 3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("offset", offset)); 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("size", size)); 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt64("timeUs", presentationTimeUs)); 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt32("flags", (int32_t *)flags)); 3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) { 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("render", true); 3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3785778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3805778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 382fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnarstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index, int64_t timestampNs) { 383fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 384fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setSize("index", index); 385fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setInt32("render", true); 386fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setInt64("timestampNs", timestampNs); 387fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 388fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar sp<AMessage> response; 389fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar return PostAndAwaitResponse(msg, &response); 390fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar} 391fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 3925778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) { 3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() { 4017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id()); 4027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 4047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return PostAndAwaitResponse(msg, &response); 4057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const { 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id()); 4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findMessage("format", format)); 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 421e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t MediaCodec::getInputFormat(sp<AMessage> *format) const { 422e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> msg = new AMessage(kWhatGetInputFormat, id()); 423e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 424e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> response; 425e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t err; 426e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 427e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return err; 428e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 429e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 430e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(response->findMessage("format", format)); 431e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 432e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 433e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 434e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 435717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const { 436717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> msg = new AMessage(kWhatGetName, id()); 437717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 438717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response; 439717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t err; 440717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 441717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return err; 442717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 443717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 444717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(response->findString("name", name)); 445717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 446717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return OK; 447717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo} 448717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const { 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexInput); 4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const { 4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexOutput); 4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4677bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getOutputBuffer(size_t index, sp<ABuffer> *buffer) { 4687bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> format; 4697bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexOutput, index, buffer, &format); 4707bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 4717bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4727bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getOutputFormat(size_t index, sp<AMessage> *format) { 4737bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> buffer; 4747bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexOutput, index, &buffer, format); 4757bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 4767bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4777bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getInputBuffer(size_t index, sp<ABuffer> *buffer) { 4787bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> format; 4797bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexInput, index, buffer, &format); 4807bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 4817bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4827bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getBufferAndFormat( 4837bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar size_t portIndex, size_t index, 4847bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> *buffer, sp<AMessage> *format) { 4857bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // use mutex instead of a context switch 4867bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4877bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar buffer->clear(); 4887bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar format->clear(); 4897bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar if (mState != STARTED) { 4907bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return INVALID_OPERATION; 4917bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 4927bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 4937bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // we do not want mPortBuffers to change during this section 4947bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // we also don't want mOwnedByClient to change during this 4957bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 4967bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 4977bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar if (index < buffers->size()) { 4987bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar const BufferInfo &info = buffers->itemAt(index); 4997bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar if (info.mOwnedByClient) { 5007bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar *buffer = info.mData; 5017bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar *format = info.mFormat; 5027bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 5037bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 5047bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return OK; 5057bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 5067bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 5075778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() { 5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 514496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() { 515496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 516496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 517496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return OK; 518496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 519496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 520575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> ¬ify) { 521575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id()); 522575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->setMessage("notify", notify); 523575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->post(); 524575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 525575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber//////////////////////////////////////////////////////////////////////////////// 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5285778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() { 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 530c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mDequeueInputReplyID, INVALID_OPERATION); 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 538c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mDequeueOutputReplyID, INVALID_OPERATION); 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueInputPending))) { 550c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueOutputPending))) { 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputBuffersChanged) { 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); 5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputFormatChanged) { 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_FORMAT_CHANGED); 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexOutput); 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[kPortIndexOutput].itemAt(index).mData; 5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("offset", buffer->offset()); 5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("size", buffer->size()); 5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt64("timeUs", timeUs); 6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags = 0; 6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_SYNCFRAME; 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_CODECCONFIG; 6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_EOS) { 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_EOS; 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("flags", flags); 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6235778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) { 6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatCodecNotify: 6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t what; 6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("what", &what)); 6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (what) { 63192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatError: 6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxError, internalError; 6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("omx-error", &omxError)); 6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("err", &internalError)); 6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Codec reported an error. " 6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber "(omx error 0x%08x, internalError %d)", 6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber omxError, internalError); 6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 641aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (omxError == OMX_ErrorResourcesLost 642aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber && internalError == DEAD_OBJECT) { 643aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags |= kFlagSawMediaServerDie; 644aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 645aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sendErrorReponse = true; 6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (mState) { 6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber case INITIALIZING: 6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(UNINITIALIZED); 6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6555778822d86b0337407514b9372562b86edfa91cdAndreas Huber case CONFIGURING: 6565778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6575778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 6585778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTING: 6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STOPPING: 668c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case RELEASING: 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Ignore the error, assuming we'll still get 6715778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the shutdown complete notification. 6725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6735778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 67403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 675aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 67603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // MediaServer died, there definitely won't 67703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // be a shutdown complete notification after 67803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // all. 67903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 68003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // note that we're directly going from 68103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // STOPPING->UNINITIALIZED, instead of the 68203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // usual STOPPING->INITIALIZED state. 68303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber setState(UNINITIALIZED); 68403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 68503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber (new AMessage)->postReply(mReplyID); 68603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber } 6875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber case FLUSHING: 6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6925778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 6935778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6965778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTED: 6975778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6985778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 6995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 701575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 704c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 705c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 706749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang onError(omxError, 0); 707c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 708ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 7095778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 717575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 718c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 719c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 720749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang onError(omxError, 0); 721c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 722ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sendErrorReponse) { 728c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mReplyID, UNKNOWN_ERROR); 7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 73392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatComponentAllocated: 7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, INITIALIZING); 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 738717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->findString("componentName", &mComponentName)); 7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 740717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.startsWith("OMX.google.")) { 7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagIsSoftwareCodec; 7425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 7435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagIsSoftwareCodec; 7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 746717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.endsWith(".secure")) { 7471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags |= kFlagIsSecure; 7481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 7491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags &= ~kFlagIsSecure; 7501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 7511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7535778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 75692cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatComponentConfigured: 7575778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7585778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, CONFIGURING); 7595778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 7605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7616507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden // reset input surface flag 7626507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = false; 7636507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 764e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("input-format", &mInputFormat)); 765e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("output-format", &mOutputFormat)); 766e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 77192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatInputSurfaceCreated: 7727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 77392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar // response to initiateCreateInputSurface() 7747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = NO_ERROR; 7757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 7767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (!msg->findInt32("err", &err)) { 7777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 7787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden msg->findObject("input-surface", &obj); 7797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(obj != NULL); 7807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setObject("input-surface", obj); 7816507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = true; 7827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 7837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 7847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 7867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 7877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 78992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatSignaledInputEOS: 7907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 79192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar // response to signalEndOfInputStream() 7927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 7937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 7947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (msg->findInt32("err", &err)) { 7957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 7967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 7977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 7987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 7997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 8007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 8017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 80292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatBuffersAllocated: 8035778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8047bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 8055778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 8065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("%s buffers allocated", 8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput 8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber || portIndex == kPortIndexOutput); 8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[portIndex].clear(); 8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 818eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<RefBase> obj; 819eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber CHECK(msg->findObject("portDesc", &obj)); 820eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 82192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase::PortDescription> portDesc = 82292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar static_cast<CodecBase::PortDescription *>(obj.get()); 8235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 824eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber size_t numBuffers = portDesc->countBuffers(); 8255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 826eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber for (size_t i = 0; i < numBuffers; ++i) { 8275778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo info; 828eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mBufferID = portDesc->bufferIDAt(i); 8295778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mOwnedByClient = false; 830eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mData = portDesc->bufferAt(i); 8315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (portIndex == kPortIndexInput && mCrypto != NULL) { 833ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mEncryptedData = 834ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber new ABuffer(info.mData->capacity()); 835ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 836ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 8375778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffers->push_back(info); 8385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8405778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexOutput) { 8415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTING) { 8425778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We're always allocating output buffers after 8435778822d86b0337407514b9372562b86edfa91cdAndreas Huber // allocating input buffers, so this is a good 8445778822d86b0337407514b9372562b86edfa91cdAndreas Huber // indication that now all buffers are allocated. 8455778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 8465778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 8475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 8485778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputBuffersChanged; 849575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8525778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 85592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatOutputFormatChanged: 8565778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("codec output format changed"); 8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mFlags & kFlagIsSoftwareCodec) 8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mNativeWindow != NULL) { 8615778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp("video/", mime.c_str(), 6)) { 8655778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 8665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 8675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8685778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 8695778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("width", &width)); 8705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("height", &height)); 8715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8726539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo int32_t cropLeft, cropTop, cropRight, cropBottom; 8736539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo CHECK(msg->findRect("crop", 8746539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo &cropLeft, &cropTop, &cropRight, &cropBottom)); 8756539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo 8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t colorFormat; 8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32( 8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber "color-format", &colorFormat)); 8795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8805778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = new MetaData; 8815778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyWidth, width); 8825778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyHeight, height); 8836539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo meta->setRect(kKeyCropRect, 8846539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo cropLeft, cropTop, cropRight, cropBottom); 8855778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyColorFormat, colorFormat); 8865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8875778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = 8885778822d86b0337407514b9372562b86edfa91cdAndreas Huber new SoftwareRenderer(mNativeWindow, meta); 8895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat = msg; 893e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 894e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagIsEncoder) { 895e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Before we announce the format change we should 896e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // collect codec specific data and amend the output 897e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format as necessary. 898e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagGatherCodecSpecificData; 899c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else if (mFlags & kFlagIsAsync) { 900c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang onOutputFormatChanged(); 901e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 902e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 903e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber postActivityNotificationIfPossible(); 904e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 9055778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 90892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatFillThisBuffer: 9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexInput, msg); 9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 912c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 913c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 914c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9198ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!mCSD.empty()) { 9208ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 9218ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK_GE(index, 0); 9228ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 9238ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // If codec specific data had been specified as 9248ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // part of the format in the call to configure and 9258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // if there's more csd left, we submit it here 9268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // clients only get access to input buffers once 9278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // this data has been exhausted. 9288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 9298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t err = queueCSDInputBuffer(index); 9308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 9318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (err != OK) { 9328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGE("queueCSDInputBuffer failed w/ error %d", 9338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber err); 9348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 9358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mFlags |= kFlagStickyError; 936575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 937575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 9388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber cancelPendingDequeueOperations(); 9398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 9408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 9418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 9428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 943c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 944c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang onInputBufferAvailable(); 945c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else if (mFlags & kFlagDequeueInputPending) { 9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); 9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 951575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 952575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 95792cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatDrainThisBuffer: 9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexOutput, msg); 9605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 961c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 962c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 963c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9682d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 9692d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 9705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", &omxFlags)); 9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->meta()->setInt32("omxFlags", omxFlags); 9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 976e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagGatherCodecSpecificData) { 977e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // This is the very first output buffer after a 978e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format change was signalled, it'll either contain 979e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the one piece of codec specific data we can expect 980e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // or there won't be codec specific data. 981e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 982e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t err = 983e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber amendOutputFormatWithCodecSpecificData(buffer); 984e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 985e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (err != OK) { 986e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ALOGE("Codec spit out malformed codec " 987e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "specific data!"); 988e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 989e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 990e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 991e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 992c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 993c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang onOutputFormatChanged(); 994c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else { 995c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mFlags |= kFlagOutputFormatChanged; 996c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 997e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 998e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 999c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 1000c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang onOutputBufferAvailable(); 1001c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else if (mFlags & kFlagDequeueOutputPending) { 10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID)); 10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 1007575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 1008575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1010575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 10115778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 101492cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatEOS: 10155778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10165778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We already notify the client of this by using the 10175778822d86b0337407514b9372562b86edfa91cdAndreas Huber // corresponding flag in "onOutputBufferReady". 10185778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 102192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatShutdownCompleted: 10225778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1023c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == STOPPING) { 1024c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(INITIALIZED); 1025c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } else { 1026c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mState, RELEASING); 1027c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(UNINITIALIZED); 1028c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 10295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 103492cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatFlushCompleted: 10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, FLUSHING); 10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalResume(); 10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10455778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10515778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatInit: 10525778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10535778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10545778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 1057c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 10585778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 10625778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZING); 10635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10645778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name; 10655778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("name", &name)); 10665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t nameIsType; 10685778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder = false; 10690db280176bd3277e3256252d063f3712b1905ba9Andreas Huber CHECK(msg->findInt32("nameIsType", &nameIsType)); 10700db280176bd3277e3256252d063f3712b1905ba9Andreas Huber if (nameIsType) { 10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("encoder", &encoder)); 10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format = new AMessage; 10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("mime", name.c_str()); 10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", encoder); 10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("componentName", name.c_str()); 10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateAllocateComponent(format); 10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1087c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang case kWhatSetCallback: 1088c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang { 1089c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang uint32_t replyID; 1090c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CHECK(msg->senderAwaitsResponse(&replyID)); 1091c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1092c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mState == UNINITIALIZED 1093c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang || mState == INITIALIZING 1094c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang || mState == STARTED) { 1095c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang // callback can't be set after codec is started, 1096c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang // or before it's initialized (as the callback 1097c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang // will be cleared when it goes to INITIALIZED) 1098c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 1099c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang break; 1100c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1101c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1102c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> callback; 1103c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CHECK(msg->findMessage("callback", &callback)); 1104c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1105c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mCallback = callback; 1106c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1107c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mCallback != NULL) { 1108c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang ALOGI("MediaCodec will operate in async mode"); 1109c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mFlags |= kFlagIsAsync; 1110c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else { 1111c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mFlags &= ~kFlagIsAsync; 1112c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1113c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1114c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> response = new AMessage; 1115c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang response->postReply(replyID); 1116c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang break; 1117c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1118c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 11195778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatConfigure: 11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED) { 1125c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<RefBase> obj; 11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findObject("native-window", &obj)) { 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber obj.clear(); 11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("format", &format)); 11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (obj != NULL) { 11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setObject("native-window", obj); 11391bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 11407541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err = setNativeWindow( 11417541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()) 11427541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ->getSurfaceTextureClient()); 11437541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 11447541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 1145c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, err); 11467541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber break; 11471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 11481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 11497541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 11501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 11511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 11527541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mReplyID = replyID; 11537541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setState(CONFIGURING); 11547541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 11551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *crypto; 11561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!msg->findPointer("crypto", &crypto)) { 11571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber crypto = NULL; 11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto = static_cast<ICrypto *>(crypto); 11611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & CONFIGURE_FLAG_ENCODE) { 11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", true); 1167e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagIsEncoder; 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber extractCSD(format); 11718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateConfigureComponent(format); 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatCreateInputSurface: 11777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 11787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 11797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 11807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 11817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Must be configured, but can't have been started yet. 11827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != CONFIGURED) { 1183c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 11847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 11857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 11867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 11877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 11887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->initiateCreateInputSurface(); 11897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 11907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 11917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 11935778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11945778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11955778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != CONFIGURED) { 1198c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 11995778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTING); 12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateStart(); 12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 1210c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case kWhatRelease: 1211c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 1212aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber State targetState = 1213aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (msg->what() == kWhatStop) ? INITIALIZED : UNINITIALIZED; 1214aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1215c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber uint32_t replyID; 1216c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1217c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1218c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState != INITIALIZED 1219c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mState != CONFIGURED && mState != STARTED) { 122003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // We may be in "UNINITIALIZED" state already without the 122103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // client being aware of this if media server died while 122203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // we were being stopped. The client would assume that 122303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // after stop() returned, it would be safe to call release() 122403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // and it should be in this case, no harm to allow a release() 122503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // if we're already uninitialized. 1226aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // Similarly stopping a stopped MediaCodec should be benign. 1227c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response = new AMessage; 122803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber response->setInt32( 122903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber "err", 1230aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mState == targetState ? OK : INVALID_OPERATION); 1231c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1232c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->postReply(replyID); 1233c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 1234c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 1235c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1236aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 1237aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // It's dead, Jim. Don't expect initiateShutdown to yield 1238aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // any useful results now... 1239aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(UNINITIALIZED); 1240aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (new AMessage)->postReply(replyID); 1241aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber break; 1242aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 1243aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1244c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mReplyID = replyID; 1245aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(msg->what() == kWhatStop ? STOPPING : RELEASING); 1246aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1247aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mCodec->initiateShutdown( 1248aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber msg->what() == kWhatStop /* keepComponentAllocated */); 1249c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 12515778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputBuffer: 12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1259c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 1260c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang ALOGE("dequeueOutputBuffer can't be used in async mode"); 1261c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 1262c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang break; 1263c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1264c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 12656507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (mHaveInputSurface) { 12666507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden ALOGE("dequeueInputBuffer can't be used with input surface"); 1267c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 12686507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden break; 12696507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 12706507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueInputBuffer(replyID, true /* new request */)) { 12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 1279c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, -EAGAIN); 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueInputPending; 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = replyID; 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueInputTimedOut, id()); 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueInputTimeoutGeneration); 12915778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 12925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12935778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12965778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputTimedOut: 12975778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12985778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 12995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 13005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueInputTimeoutGeneration) { 13025778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 13035778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueInputPending); 13075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1308c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mDequeueInputReplyID, -EAGAIN); 13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatQueueInputBuffer: 13165778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13175778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 1321c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onQueueInputBuffer(msg); 13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1327c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, err); 13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputBuffer: 13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13335778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13345778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1336c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 1337c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang ALOGE("dequeueOutputBuffer can't be used in async mode"); 1338c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 1339c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang break; 1340c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1341c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 13425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueOutputBuffer(replyID, true /* new request */)) { 13435778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13465778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 13475778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 13485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 1350c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, -EAGAIN); 13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueOutputPending; 13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = replyID; 13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueOutputTimedOut, id()); 13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueOutputTimeoutGeneration); 13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 13635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13645778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13675778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputTimedOut: 13685778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13695778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13725778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueOutputTimeoutGeneration) { 13735778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 13745778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueOutputPending); 13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1379c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mDequeueOutputReplyID, -EAGAIN); 13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReleaseOutputBuffer: 13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 1392c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 13935778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13965778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onReleaseOutputBuffer(msg); 13975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1398c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, err); 13995778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatSignalEndOfInputStream: 14037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 14047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 14057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 14067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 14077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != STARTED || (mFlags & kFlagStickyError)) { 1408c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 14097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 14107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 14117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 14127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 14137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalEndOfInputStream(); 14147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 14157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 14167cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 14175778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetBuffers: 14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 14205778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 14215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 1423c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 14245778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14305778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > *dstBuffers; 14315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffers", (void **)&dstBuffers)); 14325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14335778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffers->clear(); 14345778822d86b0337407514b9372562b86edfa91cdAndreas Huber const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex]; 14355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14365778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < srcBuffers.size(); ++i) { 14375778822d86b0337407514b9372562b86edfa91cdAndreas Huber const BufferInfo &info = srcBuffers.itemAt(i); 14385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1439ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber dstBuffers->push_back( 14401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (portIndex == kPortIndexInput && mCrypto != NULL) 1441ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? info.mEncryptedData : info.mData); 14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(replyID); 14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14485778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatFlush: 14495778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 14505778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 14525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 1454c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 14555778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14585778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 14595778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(FLUSHING); 14605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalFlush(); 14625778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 14635778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1466e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case kWhatGetInputFormat: 14675778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetOutputFormat: 14685778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1469e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> format = 1470e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (msg->what() == kWhatGetOutputFormat ? mOutputFormat : mInputFormat); 1471e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 14725778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 14735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 14745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1475e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((mState != CONFIGURED && mState != STARTING && 1476e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mState != STARTED && mState != FLUSHING) 1477972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || (mFlags & kFlagStickyError) 1478e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar || format == NULL) { 1479c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 14805778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 1484e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar response->setMessage("format", format); 14855778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 14865778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1489496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 1490496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 1491496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mCodec->signalRequestIDRFrame(); 1492496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 1493496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 1494496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 1495575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber case kWhatRequestActivityNotification: 1496575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber { 1497575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(mActivityNotify == NULL); 1498575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(msg->findMessage("notify", &mActivityNotify)); 1499575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1500575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 1501575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber break; 1502575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1503575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1504717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo case kWhatGetName: 1505717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo { 1506717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo uint32_t replyID; 1507717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->senderAwaitsResponse(&replyID)); 1508717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1509717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.empty()) { 1510c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 1511717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1512717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1513717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1514717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1515717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setString("name", mComponentName.c_str()); 1516717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1517717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1518717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1519717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1520a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 1521a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 1522a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber uint32_t replyID; 1523a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1524a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1525a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 1526a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 1527a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1528a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = onSetParameters(params); 1529a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1530c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, err); 1531a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 1532a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 1533a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 15365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15398ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) { 15408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.clear(); 15418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber size_t i = 0; 15438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber for (;;) { 15448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd; 15458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) { 15468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 15478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 15488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.push_back(csd); 15508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ++i; 15518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 15528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 1553a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("Found %zu pieces of codec specific data.", mCSD.size()); 15548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 15558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) { 15578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK(!mCSD.empty()); 15588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15597bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar const BufferInfo *info = 15607bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar &mPortBuffers[kPortIndexInput].itemAt(bufferIndex); 15618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd = *mCSD.begin(); 15638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.erase(mCSD.begin()); 15648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber const sp<ABuffer> &codecInputData = 15668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber (mCrypto != NULL) ? info->mEncryptedData : info->mData; 15678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (csd->size() > codecInputData->capacity()) { 15698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return -EINVAL; 15708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 15718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber memcpy(codecInputData->data(), csd->data(), csd->size()); 15738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber AString errorDetailMsg; 15758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 15778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("index", bufferIndex); 15788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("offset", 0); 15798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("size", csd->size()); 15808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt64("timeUs", 0ll); 15818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG); 15828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setPointer("errorDetailMsg", &errorDetailMsg); 15838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return onQueueInputBuffer(msg); 15858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 15868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 15875778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) { 15887541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (newState == INITIALIZED || newState == UNINITIALIZED) { 15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto.clear(); 15937541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 15945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1595671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mInputFormat.clear(); 15965778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat.clear(); 15975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 15985778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 15995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagStickyError; 1600e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagIsEncoder; 1601e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 1602c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mFlags &= ~kFlagIsAsync; 1603575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1604575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 1605c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mCallback.clear(); 16065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1608717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (newState == UNINITIALIZED) { 1609671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // return any straggling buffers, e.g. if we got here on an error 1610671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar returnBuffersToCodec(); 1611671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 1612717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo mComponentName.clear(); 1613aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1614aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // The component is gone, mediaserver's probably back up already 1615aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // but should definitely be back up should we try to instantiate 1616aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // another component.. and the cycle continues. 1617aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags &= ~kFlagSawMediaServerDie; 1618717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1619717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 16205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = newState; 16215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16225778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 16235778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16255778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() { 16265778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 16275778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 16285778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16305778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) { 16315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 16327bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 16335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16345778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 16355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16365778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 16375778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 16385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify != NULL) { 16405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = info->mNotify; 16415778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 16425778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 16435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexInput) { 16457fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* no error, just returning buffers */ 16467fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar msg->setInt32("err", OK); 16475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16485778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 16495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].clear(); 16535778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16555778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers( 16565778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex, const sp<AMessage> &msg) { 16575778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 16585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1659609b815a3131d22da38b2f452faa9f89daad4039Andy Hung uint32_t bufferID; 1660609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 16615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16625778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 16635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16645778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 16655778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 16665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16675778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mBufferID == bufferID) { 16685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mNotify == NULL); 16695778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("reply", &info->mNotify)); 16705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].push_back(i); 16725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return i; 16745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16775778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 16785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 16805778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { 16835778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 16845778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 16855778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 16865778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 16875778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 16885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 16895778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("offset", &offset)); 16905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeUs", &timeUs)); 16915778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 16925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples; 16944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples; 16954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *key; 16964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *iv; 16974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted; 16984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 16994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // We allow the simpler queueInputBuffer API to be used even in 17004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // secure mode, by fabricating a single unencrypted subSample. 17014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::SubSample ss; 17024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (msg->findSize("size", &size)) { 17044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto != NULL) { 17054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfClearData = size; 17064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfEncryptedData = 0; 17074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples = &ss; 17094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples = 1; 17104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = NULL; 17114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = NULL; 17124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 17134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } else { 17144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto == NULL) { 17154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber return -EINVAL; 17164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 17174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("subSamples", (void **)&subSamples)); 17194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findSize("numSubSamples", &numSubSamples)); 17204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("key", (void **)&key)); 17214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("iv", (void **)&iv)); 17224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int32_t tmp; 17244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findInt32("mode", &tmp)); 17254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17264b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber mode = (CryptoPlugin::Mode)tmp; 17274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size = 0; 17294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 17304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfClearData; 17314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfEncryptedData; 17324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 17334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 17344b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexInput].size()) { 17365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 17375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17395778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index); 17405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (offset + size > info->mData->capacity()) { 17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17495778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> reply = info->mNotify; 17505778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->setRange(offset, size); 17515778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_EOS) { 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("eos", true); 17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_CODECCONFIG) { 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("csd", true); 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mCrypto != NULL) { 17621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (size > info->mEncryptedData->capacity()) { 17631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -ERANGE; 1764ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1765ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 17665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg; 17675b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); 17685b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 1769fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = mCrypto->decrypt( 17701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (mFlags & kFlagIsSecure) != 0, 17711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 17721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 17731bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 17741bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mEncryptedData->base() + offset, 17754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples, 17764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples, 17775b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mData->base(), 17785b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg); 17791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1780fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result < 0) { 1781fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 1782ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1783ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1784fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong info->mData->setRange(0, result); 1785ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1786ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 17877bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // synchronization boundary for getBufferAndFormat 17887bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 17897bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 17907bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = false; 17917bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 17922d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", info->mData); 17935778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->post(); 17945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17955b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mNotify = NULL; 17965b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 17975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 17985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18005778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { 18015778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 18025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 18035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18045778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t render; 18055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("render", &render)) { 18065778822d86b0337407514b9372562b86edfa91cdAndreas Huber render = 0; 18075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED) { 18105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 18115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexOutput].size()) { 18145778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 18155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18175778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 18185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 18205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 18215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18237bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // synchronization boundary for getBufferAndFormat 18247bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 18257bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 18267bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = false; 18277bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 18287bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 182979ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou if (render && info->mData != NULL && info->mData->size() != 0) { 18305778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->setInt32("render", true); 18315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1832fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 1833fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (msg->findInt64("timestampNs", ×tampNs)) { 1834fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mNotify->setInt64("timestampNs", timestampNs); 1835fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } else { 1836fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 1837fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 1838fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 1839fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 1840fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 1841fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 184247aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 1843fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 1844fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1845fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 1846fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1847fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 18485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mSoftRenderer != NULL) { 18495778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer->render( 1850fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mData->data(), info->mData->size(), timestampNs, NULL); 18515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18545778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->post(); 18555778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 18565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 18585778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 18595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18605778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { 18615778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 18625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18635778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> *availBuffers = &mAvailPortBuffers[portIndex]; 18645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (availBuffers->empty()) { 18665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EAGAIN; 18675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18695778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index = *availBuffers->begin(); 18705778822d86b0337407514b9372562b86edfa91cdAndreas Huber availBuffers->erase(availBuffers->begin()); 18715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18725778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index); 18735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!info->mOwnedByClient); 18747bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 18757bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 18767bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mFormat = portIndex == kPortIndexInput ? mInputFormat : mOutputFormat; 18777bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = true; 18787bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 18795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18805778822d86b0337407514b9372562b86edfa91cdAndreas Huber return index; 18815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 18825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18837541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow( 18841a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &surfaceTextureClient) { 18857541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err; 18867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18877541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (mNativeWindow != NULL) { 18887541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_disconnect( 18897541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA); 18907541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18917541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 18927541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGW("native_window_api_disconnect returned an error: %s (%d)", 18937541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 18947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 18957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18967541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.clear(); 18977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 18987541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 18997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (surfaceTextureClient != NULL) { 19007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_connect( 19017541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA); 19027541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 19037541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 19047541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGE("native_window_api_connect returned an error: %s (%d)", 19057541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 19067541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 19077541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return err; 19087541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 19097541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 19107541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow = surfaceTextureClient; 19117541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 19127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 19137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return OK; 19147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber} 19157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 1916c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangvoid MediaCodec::onInputBufferAvailable() { 1917c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int32_t index; 1918c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang while ((index = dequeuePortBuffer(kPortIndexInput)) >= 0) { 1919c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = mCallback->dup(); 1920c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("callbackID", CB_INPUT_AVAILABLE); 1921c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("index", index); 1922c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->post(); 1923c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1924c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 1925c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1926c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangvoid MediaCodec::onOutputBufferAvailable() { 1927c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int32_t index; 1928c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang while ((index = dequeuePortBuffer(kPortIndexOutput)) >= 0) { 1929c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang const sp<ABuffer> &buffer = 1930c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mPortBuffers[kPortIndexOutput].itemAt(index).mData; 1931c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = mCallback->dup(); 1932c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("callbackID", CB_OUTPUT_AVAILABLE); 1933c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("index", index); 1934c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setSize("offset", buffer->offset()); 1935c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setSize("size", buffer->size()); 1936c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1937c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int64_t timeUs; 1938c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 1939c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1940c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt64("timeUs", timeUs); 1941c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1942c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int32_t omxFlags; 1943c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 1944c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1945c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang uint32_t flags = 0; 1946c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 1947c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang flags |= BUFFER_FLAG_SYNCFRAME; 1948c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1949c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 1950c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang flags |= BUFFER_FLAG_CODECCONFIG; 1951c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1952c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (omxFlags & OMX_BUFFERFLAG_EOS) { 1953c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang flags |= BUFFER_FLAG_EOS; 1954c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1955c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1956c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("flags", flags); 1957c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1958c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->post(); 1959c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1960c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 1961c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1962749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhangvoid MediaCodec::onError(status_t err, int32_t actionCode, const char *detail) { 1963c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mCallback != NULL) { 1964c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = mCallback->dup(); 1965c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("callbackID", CB_ERROR); 1966c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("err", err); 1967749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang msg->setInt32("actionCode", actionCode); 1968749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang 1969749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang if (detail != NULL) { 1970749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang msg->setString("detail", detail); 1971749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang } 1972c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1973c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->post(); 1974c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1975c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 1976c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1977c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangvoid MediaCodec::onOutputFormatChanged() { 1978c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mCallback != NULL) { 1979c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = mCallback->dup(); 1980c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("callbackID", CB_OUTPUT_FORMAT_CHANGED); 1981c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setMessage("format", mOutputFormat); 1982c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->post(); 1983c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1984c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 1985c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1986c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1987575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() { 1988575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if (mActivityNotify == NULL) { 1989575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber return; 1990575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1991575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1992575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if ((mFlags & (kFlagStickyError 1993575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputBuffersChanged 1994575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputFormatChanged)) 1995575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexInput].empty() 1996575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexOutput].empty()) { 1997575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify->post(); 1998575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 1999575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 2000575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 2001575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 2002a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> ¶ms) { 2003a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 2004a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 2005a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 2006a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response; 2007a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return PostAndAwaitResponse(msg, &response); 2008a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 2009a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 2010a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) { 2011a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mCodec->signalSetParameters(params); 2012a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 2013a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 2014a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 2015a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 2016e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatus_t MediaCodec::amendOutputFormatWithCodecSpecificData( 2017e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const sp<ABuffer> &buffer) { 2018e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber AString mime; 2019e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(mOutputFormat->findString("mime", &mime)); 2020e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2021e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) { 2022e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Codec specific data should be SPS and PPS in a single buffer, 2023e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // each prefixed by a startcode (0x00 0x00 0x00 0x01). 2024e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // We separate the two and put them into the output format 2025e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // under the keys "csd-0" and "csd-1". 2026e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2027e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber unsigned csdIndex = 0; 2028e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2029e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *data = buffer->data(); 2030e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t size = buffer->size(); 2031e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2032e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *nalStart; 2033e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t nalSize; 2034e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { 2035e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber sp<ABuffer> csd = new ABuffer(nalSize + 4); 2036e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data(), "\x00\x00\x00\x01", 4); 2037e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data() + 4, nalStart, nalSize); 2038e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2039e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer( 2040e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber StringPrintf("csd-%u", csdIndex).c_str(), csd); 2041e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2042e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++csdIndex; 2043e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2044e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2045e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (csdIndex != 2) { 2046e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_MALFORMED; 2047e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2048e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 2049e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // For everything else we just stash the codec specific data into 2050e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the output format as a single piece of csd under "csd-0". 2051e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer("csd-0", buffer); 2052e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2053e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2054e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2055e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 2056e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 20575778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 2058