MediaCodec.cpp revision e96ee699aca0f711d41e6c0833e5de2341c4a36d
15778822d86b0337407514b9372562b86edfa91cdAndreas Huber/* 25778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Copyright 2012, The Android Open Source Project 35778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 45778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 55778822d86b0337407514b9372562b86edfa91cdAndreas Huber * you may not use this file except in compliance with the License. 65778822d86b0337407514b9372562b86edfa91cdAndreas Huber * You may obtain a copy of the License at 75778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 85778822d86b0337407514b9372562b86edfa91cdAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 95778822d86b0337407514b9372562b86edfa91cdAndreas Huber * 105778822d86b0337407514b9372562b86edfa91cdAndreas Huber * Unless required by applicable law or agreed to in writing, software 115778822d86b0337407514b9372562b86edfa91cdAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 125778822d86b0337407514b9372562b86edfa91cdAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135778822d86b0337407514b9372562b86edfa91cdAndreas Huber * See the License for the specific language governing permissions and 145778822d86b0337407514b9372562b86edfa91cdAndreas Huber * limitations under the License. 155778822d86b0337407514b9372562b86edfa91cdAndreas Huber */ 165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 175778822d86b0337407514b9372562b86edfa91cdAndreas Huber//#define LOG_NDEBUG 0 185778822d86b0337407514b9372562b86edfa91cdAndreas Huber#define LOG_TAG "MediaCodec" 195778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <utils/Log.h> 205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 215778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaCodec.h> 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "include/SoftwareRenderer.h" 245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 251a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h> 26ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h> 275778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h> 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h> 305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h> 31ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/hexdump.h> 325778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/ACodec.h> 337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 34e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include <media/stagefright/MediaDefs.h> 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h> 365778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h> 375778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h> 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 39e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include "include/avc_utils.h" 40e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 415778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 435778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 445778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType( 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder) { 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(mime, true /* nameIsType */, encoder) != OK) { 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 515778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 555778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName( 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name) { 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) { 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 655778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper) 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber : mState(UNINITIALIZED), 675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper(looper), 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec(new ACodec), 697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID(0), 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags(0), 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer(NULL), 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputTimeoutGeneration(0), 735778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID(0), 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputTimeoutGeneration(0), 756507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mDequeueOutputReplyID(0), 766507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface(false) { 775778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 795778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() { 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, UNINITIALIZED); 815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 845778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse( 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response) { 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = msg->postAndAwaitResponse(response); 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!(*response)->findInt32("err", &err)) { 935778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = OK; 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 995778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) { 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Current video decoders do not return from OMX_FillThisBuffer 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber // quickly, violating the OpenMAX specs, until that is remedied 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber // we need to invest in an extra looper to free the main event 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber // queue. 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool needDedicatedLooper = false; 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType && !strncasecmp(name, "video/", 6)) { 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (!nameIsType && !strncmp(name, "OMX.TI.DUCATI1.VIDEO.", 21)) { 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (needDedicatedLooper) { 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mCodecLooper == NULL) { 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper = new ALooper; 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->setName("CodecLooper"); 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->registerHandler(mCodec); 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(mCodec); 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(this); 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id())); 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatInit, id()); 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setString("name", name); 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("nameIsType", nameIsType); 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("encoder", encoder); 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure( 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 1411a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 1421bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags) { 1445778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setMessage("format", format); 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 1485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nativeWindow != NULL) { 1501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setObject( 1511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber "native-window", 1521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber new NativeWindowWrapper(nativeWindow)); 1531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1541bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1551bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (crypto != NULL) { 1561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setPointer("crypto", crypto.get()); 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface( 1647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer>* bufferProducer) { 1657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id()); 1667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 1687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = PostAndAwaitResponse(msg, &response); 1697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == NO_ERROR) { 1707cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // unwrap the sp<IGraphicBufferProducer> 1717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 1727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden bool found = response->findObject("input-surface", &obj); 1737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(found); 1747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<BufferProducerWrapper> wrapper( 1757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden static_cast<BufferProducerWrapper*>(obj.get())); 1767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden *bufferProducer = wrapper->getBufferProducer(); 1777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 1787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGW("createInputSurface failed, err=%d", err); 1797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 1807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return err; 1817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 1827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 1835778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() { 1845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStart, id()); 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() { 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStop, id()); 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1955778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 197c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() { 198c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatRelease, id()); 199c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 200c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response; 201c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return PostAndAwaitResponse(msg, &response); 202c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 203c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 2045778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer( 2055778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 2065778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 2075778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 2085778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 2095b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 2105b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2115b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 2125b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 2135b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 2145b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("offset", offset); 2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("size", size); 2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 2215b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer( 2284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 2294b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 2304b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 2314b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 2324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 2334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 2344b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 2354b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 2365b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 2375b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2385b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 2395b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 2405b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 2415b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2424b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 2434b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("index", index); 2444b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("offset", offset); 2454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("subSamples", (void *)subSamples); 2464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("numSubSamples", numSubSamples); 2474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("key", (void *)key); 2484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("iv", (void *)iv); 2494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("mode", mode); 2504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 2514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("flags", flags); 2525b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 2534b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 2544b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> response; 2555b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber status_t err = PostAndAwaitResponse(msg, &response); 2565b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber return err; 2584b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber} 2594b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 2605778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { 2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id()); 2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2755778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer( 2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs) { 2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id()); 2835778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("offset", offset)); 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("size", size)); 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt64("timeUs", presentationTimeUs)); 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt32("flags", (int32_t *)flags)); 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) { 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("render", true); 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3075778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3095778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) { 3105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 3115778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3135778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3145778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3155778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3177cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() { 3187cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id()); 3197cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3207cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 3217cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return PostAndAwaitResponse(msg, &response); 3227cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 3237cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 3245778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const { 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id()); 3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3285778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findMessage("format", format)); 3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 338717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const { 339717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> msg = new AMessage(kWhatGetName, id()); 340717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 341717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response; 342717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t err; 343717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 344717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return err; 345717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 346717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 347717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(response->findString("name", name)); 348717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 349717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return OK; 350717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo} 351717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 3525778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const { 3535778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 3545778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexInput); 3555778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const { 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexOutput); 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3705778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() { 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 377496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() { 378496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 379496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 380496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return OK; 381496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 382496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 383575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> ¬ify) { 384575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id()); 385575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->setMessage("notify", notify); 386575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->post(); 387575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 388575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber//////////////////////////////////////////////////////////////////////////////// 3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3915778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() { 3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueInputPending))) { 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4395778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { 4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueOutputPending))) { 4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputBuffersChanged) { 4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); 4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputFormatChanged) { 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_FORMAT_CHANGED); 4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexOutput); 4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = 4615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[kPortIndexOutput].itemAt(index).mData; 4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("offset", buffer->offset()); 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("size", buffer->size()); 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt64("timeUs", timeUs); 4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags = 0; 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_SYNCFRAME; 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_CODECCONFIG; 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_EOS) { 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_EOS; 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("flags", flags); 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4945778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) { 4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatCodecNotify: 4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t what; 4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("what", &what)); 5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5015778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (what) { 5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatError: 5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxError, internalError; 5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("omx-error", &omxError)); 5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("err", &internalError)); 5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Codec reported an error. " 5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber "(omx error 0x%08x, internalError %d)", 5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber omxError, internalError); 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 512aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (omxError == OMX_ErrorResourcesLost 513aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber && internalError == DEAD_OBJECT) { 514aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags |= kFlagSawMediaServerDie; 515aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 516aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sendErrorReponse = true; 5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (mState) { 5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber case INITIALIZING: 5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(UNINITIALIZED); 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber case CONFIGURING: 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTING: 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STOPPING: 539c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case RELEASING: 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Ignore the error, assuming we'll still get 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the shutdown complete notification. 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 54503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 546aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 54703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // MediaServer died, there definitely won't 54803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // be a shutdown complete notification after 54903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // all. 55003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 55103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // note that we're directly going from 55203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // STOPPING->UNINITIALIZED, instead of the 55303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // usual STOPPING->INITIALIZED state. 55403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber setState(UNINITIALIZED); 55503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 55603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber (new AMessage)->postReply(mReplyID); 55703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber } 5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5615778822d86b0337407514b9372562b86edfa91cdAndreas Huber case FLUSHING: 5625778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5635778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 5645778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTED: 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 572575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 583575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sendErrorReponse) { 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", UNKNOWN_ERROR); 5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mReplyID); 5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5945778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatComponentAllocated: 5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, INITIALIZING); 6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 602717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->findString("componentName", &mComponentName)); 6035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 604717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.startsWith("OMX.google.")) { 6055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagIsSoftwareCodec; 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagIsSoftwareCodec; 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 610717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.endsWith(".secure")) { 6111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags |= kFlagIsSecure; 6121bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 6131bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags &= ~kFlagIsSecure; 6141bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 6151bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatComponentConfigured: 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, CONFIGURING); 6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6256507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden // reset input surface flag 6266507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = false; 6276507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatInputSurfaceCreated: 6337cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 6347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // response to ACodec::kWhatCreateInputSurface 6357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = NO_ERROR; 6367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 6377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (!msg->findInt32("err", &err)) { 6387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 6397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden msg->findObject("input-surface", &obj); 6407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(obj != NULL); 6417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setObject("input-surface", obj); 6426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = true; 6437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 6447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 6457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 6467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 6477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 6487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 6497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 6507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignaledInputEOS: 6517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 6527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // response to ACodec::kWhatSignalEndOfInputStream 6537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 6547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 6557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (msg->findInt32("err", &err)) { 6567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 6577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 6587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 6597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 6607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 6617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 6627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatBuffersAllocated: 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("%s buffers allocated", 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6715778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput 6725778822d86b0337407514b9372562b86edfa91cdAndreas Huber || portIndex == kPortIndexOutput); 6735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[portIndex].clear(); 6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 678eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<RefBase> obj; 679eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber CHECK(msg->findObject("portDesc", &obj)); 680eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 681eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<ACodec::PortDescription> portDesc = 682eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber static_cast<ACodec::PortDescription *>(obj.get()); 6835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 684eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber size_t numBuffers = portDesc->countBuffers(); 6855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 686eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber for (size_t i = 0; i < numBuffers; ++i) { 6875778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo info; 688eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mBufferID = portDesc->bufferIDAt(i); 6895778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mOwnedByClient = false; 690eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mData = portDesc->bufferAt(i); 6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6921bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (portIndex == kPortIndexInput && mCrypto != NULL) { 693ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mEncryptedData = 694ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber new ABuffer(info.mData->capacity()); 695ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 696ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 6975778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffers->push_back(info); 6985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexOutput) { 7015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTING) { 7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We're always allocating output buffers after 7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber // allocating input buffers, so this is a good 7045778822d86b0337407514b9372562b86edfa91cdAndreas Huber // indication that now all buffers are allocated. 7055778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 7065778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 7085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputBuffersChanged; 709575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatOutputFormatChanged: 7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("codec output format changed"); 7185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mFlags & kFlagIsSoftwareCodec) 7205778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mNativeWindow != NULL) { 7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp("video/", mime.c_str(), 6)) { 7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 7265778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 7275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7285778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("width", &width)); 7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("height", &height)); 7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t colorFormat; 7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32( 7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber "color-format", &colorFormat)); 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = new MetaData; 7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyWidth, width); 7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyHeight, height); 7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyColorFormat, colorFormat); 7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = 7425778822d86b0337407514b9372562b86edfa91cdAndreas Huber new SoftwareRenderer(mNativeWindow, meta); 7435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat = msg; 747e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 748e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagIsEncoder) { 749e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Before we announce the format change we should 750e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // collect codec specific data and amend the output 751e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format as necessary. 752e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagGatherCodecSpecificData; 753e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 754e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 755e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber postActivityNotificationIfPossible(); 756e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 7575778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7605778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatFillThisBuffer: 7615778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexInput, msg); 7635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 764c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 765c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 766c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!mCSD.empty()) { 7728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 7738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK_GE(index, 0); 7748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 7758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // If codec specific data had been specified as 7768ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // part of the format in the call to configure and 7778ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // if there's more csd left, we submit it here 7788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // clients only get access to input buffers once 7798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // this data has been exhausted. 7808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 7818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t err = queueCSDInputBuffer(index); 7828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 7838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (err != OK) { 7848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGE("queueCSDInputBuffer failed w/ error %d", 7858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber err); 7868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 7878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mFlags |= kFlagStickyError; 788575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 789575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 7908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber cancelPendingDequeueOperations(); 7918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 7928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 7938ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 7948ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); 7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 801575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 802575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 8035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8045778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatDrainThisBuffer: 8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexOutput, msg); 8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 811c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 812c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 813c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8182d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 8192d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 8205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8215778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 8225778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", &omxFlags)); 8235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8245778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->meta()->setInt32("omxFlags", omxFlags); 8255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 826e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagGatherCodecSpecificData) { 827e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // This is the very first output buffer after a 828e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format change was signalled, it'll either contain 829e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the one piece of codec specific data we can expect 830e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // or there won't be codec specific data. 831e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 832e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t err = 833e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber amendOutputFormatWithCodecSpecificData(buffer); 834e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 835e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (err != OK) { 836e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ALOGE("Codec spit out malformed codec " 837e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "specific data!"); 838e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 839e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 840e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 841e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 842e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 843e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 844e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 8455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 8465778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID)); 8475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8485778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 8495778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 8505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 851575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 852575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 8535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 854575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 8555778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8585778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatEOS: 8595778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8605778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We already notify the client of this by using the 8615778822d86b0337407514b9372562b86edfa91cdAndreas Huber // corresponding flag in "onOutputBufferReady". 8625778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8655778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatShutdownCompleted: 8665778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 867c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == STOPPING) { 868c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(INITIALIZED); 869c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } else { 870c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mState, RELEASING); 871c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(UNINITIALIZED); 872c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 8735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8785778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatFlushCompleted: 8795778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8805778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, FLUSHING); 8815778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 8825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalResume(); 8845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8855778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 8865778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8895778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8955778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatInit: 8965778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8975778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9055778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZING); 9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name; 9125778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("name", &name)); 9135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t nameIsType; 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder = false; 9160db280176bd3277e3256252d063f3712b1905ba9Andreas Huber CHECK(msg->findInt32("nameIsType", &nameIsType)); 9170db280176bd3277e3256252d063f3712b1905ba9Andreas Huber if (nameIsType) { 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("encoder", &encoder)); 9195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9215778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format = new AMessage; 9225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9235778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 9245778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("mime", name.c_str()); 9255778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", encoder); 9265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 9275778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("componentName", name.c_str()); 9285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateAllocateComponent(format); 9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatConfigure: 9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED) { 9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<RefBase> obj; 9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findObject("native-window", &obj)) { 9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber obj.clear(); 9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("format", &format)); 9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (obj != NULL) { 9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setObject("native-window", obj); 9571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 9587541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err = setNativeWindow( 9597541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()) 9607541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ->getSurfaceTextureClient()); 9617541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 9627541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 9637541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber sp<AMessage> response = new AMessage; 9647541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->setInt32("err", err); 9657541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 9667541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->postReply(replyID); 9677541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber break; 9681bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 9691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 9707541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 9711bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 9721bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 9737541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mReplyID = replyID; 9747541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setState(CONFIGURING); 9757541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 9761bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *crypto; 9771bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!msg->findPointer("crypto", &crypto)) { 9781bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber crypto = NULL; 9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto = static_cast<ICrypto *>(crypto); 9821bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & CONFIGURE_FLAG_ENCODE) { 9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", true); 988e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagIsEncoder; 9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber extractCSD(format); 9928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateConfigureComponent(format); 9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatCreateInputSurface: 9987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 9997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 10007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 10017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Must be configured, but can't have been started yet. 10037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != CONFIGURED) { 10047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage; 10057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", INVALID_OPERATION); 10067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(replyID); 10087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 10097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 10107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 10127cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->initiateCreateInputSurface(); 10137cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 10147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 10157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 10165778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 10175778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10185778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != CONFIGURED) { 10225778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10235778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 10245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10255778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10295778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTING); 10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateStart(); 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 1037c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case kWhatRelease: 1038c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 1039aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber State targetState = 1040aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (msg->what() == kWhatStop) ? INITIALIZED : UNINITIALIZED; 1041aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1042c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber uint32_t replyID; 1043c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1044c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1045c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState != INITIALIZED 1046c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mState != CONFIGURED && mState != STARTED) { 104703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // We may be in "UNINITIALIZED" state already without the 104803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // client being aware of this if media server died while 104903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // we were being stopped. The client would assume that 105003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // after stop() returned, it would be safe to call release() 105103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // and it should be in this case, no harm to allow a release() 105203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // if we're already uninitialized. 1053aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // Similarly stopping a stopped MediaCodec should be benign. 1054c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response = new AMessage; 105503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber response->setInt32( 105603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber "err", 1057aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mState == targetState ? OK : INVALID_OPERATION); 1058c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1059c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->postReply(replyID); 1060c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 1061c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 1062c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1063aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 1064aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // It's dead, Jim. Don't expect initiateShutdown to yield 1065aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // any useful results now... 1066aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(UNINITIALIZED); 1067aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (new AMessage)->postReply(replyID); 1068aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber break; 1069aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 1070aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1071c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mReplyID = replyID; 1072aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(msg->what() == kWhatStop ? STOPPING : RELEASING); 1073aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1074aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mCodec->initiateShutdown( 1075aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber msg->what() == kWhatStop /* keepComponentAllocated */); 1076c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputBuffer: 10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10866507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (mHaveInputSurface) { 10876507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden ALOGE("dequeueInputBuffer can't be used with input surface"); 10886507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> response = new AMessage; 10896507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden response->setInt32("err", INVALID_OPERATION); 10906507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden response->postReply(replyID); 10916507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden break; 10926507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 10936507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 10945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueInputBuffer(replyID, true /* new request */)) { 10955778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10985778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 10995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 11005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 11025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11035778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 11045778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11055778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueInputPending; 11095778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = replyID; 11105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 11125778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueInputTimedOut, id()); 11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 11155778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueInputTimeoutGeneration); 11165778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 11175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11185778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputTimedOut: 11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueInputTimeoutGeneration) { 11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueInputPending); 11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11425778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatQueueInputBuffer: 11435778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11445778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11455778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onQueueInputBuffer(msg); 11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputBuffer: 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueOutputBuffer(replyID, true /* new request */)) { 11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 11745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 11765778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11775778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11795778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueOutputPending; 11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = replyID; 11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 11865778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 11875778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueOutputTimedOut, id()); 11885778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 11895778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueOutputTimeoutGeneration); 11905778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 11915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11955778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputTimedOut: 11965778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11975778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 11985778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 11995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueOutputTimeoutGeneration) { 12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueOutputPending); 12065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReleaseOutputBuffer: 12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12215778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 12225778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12235778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 12245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12295778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onReleaseOutputBuffer(msg); 12305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12315778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12325778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 12335778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12345778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatSignalEndOfInputStream: 12387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 12397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 12407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 12417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != STARTED || (mFlags & kFlagStickyError)) { 12437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage; 12447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", INVALID_OPERATION); 12457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(replyID); 12477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 12487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 12497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12507cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 12517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalEndOfInputStream(); 12527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 12537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 12547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetBuffers: 12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12575778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12585778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 12615778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 12635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12645778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12655778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12685778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 12695778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 12705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12715778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > *dstBuffers; 12725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffers", (void **)&dstBuffers)); 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffers->clear(); 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex]; 12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < srcBuffers.size(); ++i) { 12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber const BufferInfo &info = srcBuffers.itemAt(i); 12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1280ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber dstBuffers->push_back( 12811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (portIndex == kPortIndexInput && mCrypto != NULL) 1282ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? info.mEncryptedData : info.mData); 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(replyID); 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatFlush: 12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12915778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12925778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 12955778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 12965778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 12975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12985778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 12995778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13025778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 13035778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(FLUSHING); 13045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalFlush(); 13065778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 13075778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetOutputFormat: 13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mState != STARTED && mState != FLUSHING) 1316972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || (mFlags & kFlagStickyError) 1317972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || mOutputFormat == NULL) { 13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13215778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setMessage("format", mOutputFormat); 13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1331496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 1332496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 1333496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mCodec->signalRequestIDRFrame(); 1334496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 1335496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 1336496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 1337575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber case kWhatRequestActivityNotification: 1338575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber { 1339575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(mActivityNotify == NULL); 1340575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(msg->findMessage("notify", &mActivityNotify)); 1341575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1342575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 1343575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber break; 1344575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1345575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1346717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo case kWhatGetName: 1347717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo { 1348717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo uint32_t replyID; 1349717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->senderAwaitsResponse(&replyID)); 1350717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1351717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.empty()) { 1352717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1353717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setInt32("err", INVALID_OPERATION); 1354717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1355717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1356717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1357717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1358717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1359717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1360717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setString("name", mComponentName.c_str()); 1361717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1362717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1363717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1364717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1365a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 1366a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 1367a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber uint32_t replyID; 1368a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1369a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1370a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 1371a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 1372a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1373a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = onSetParameters(params); 1374a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1375a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response = new AMessage; 1376a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->setInt32("err", err); 1377a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1378a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->postReply(replyID); 1379a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 1380a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 1381a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 13845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13855778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13878ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) { 13888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.clear(); 13898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 13908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber size_t i = 0; 13918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber for (;;) { 13928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd; 13938ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) { 13948ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 13958ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 13968ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 13978ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.push_back(csd); 13988ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ++i; 13998ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14008ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14018ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGV("Found %u pieces of codec specific data.", mCSD.size()); 14028ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 14038ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14048ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) { 14058ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK(!mCSD.empty()); 14068ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14078ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber BufferInfo *info = 14088ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex); 14098ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14108ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd = *mCSD.begin(); 14118ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.erase(mCSD.begin()); 14128ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14138ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber const sp<ABuffer> &codecInputData = 14148ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber (mCrypto != NULL) ? info->mEncryptedData : info->mData; 14158ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14168ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (csd->size() > codecInputData->capacity()) { 14178ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return -EINVAL; 14188ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 14198ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14208ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber memcpy(codecInputData->data(), csd->data(), csd->size()); 14218ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14228ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber AString errorDetailMsg; 14238ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14248ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 14258ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("index", bufferIndex); 14268ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("offset", 0); 14278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("size", csd->size()); 14288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt64("timeUs", 0ll); 14298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG); 14308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setPointer("errorDetailMsg", &errorDetailMsg); 14318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return onQueueInputBuffer(msg); 14338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 14348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 14355778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) { 14367541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (newState == INITIALIZED || newState == UNINITIALIZED) { 14375778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 14385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 14395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14401bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto.clear(); 14417541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat.clear(); 14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 14465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagStickyError; 1447e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagIsEncoder; 1448e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 1449575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1450575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1453717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (newState == UNINITIALIZED) { 1454717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo mComponentName.clear(); 1455aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1456aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // The component is gone, mediaserver's probably back up already 1457aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // but should definitely be back up should we try to instantiate 1458aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // another component.. and the cycle continues. 1459aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags &= ~kFlagSawMediaServerDie; 1460717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1461717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 14625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = newState; 14635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14645778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 14655778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 14665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14675778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() { 14685778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 14695778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 14705778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 14715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14725778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) { 14735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 14745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14755778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 14765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14775778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 14785778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 14795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify != NULL) { 14815778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = info->mNotify; 14825778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 14835778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 14845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexInput) { 14865778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("err", ERROR_END_OF_STREAM); 14875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14885778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 14895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14925778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].clear(); 14935778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 14945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14955778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers( 14965778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex, const sp<AMessage> &msg) { 14975778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 14985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14995778822d86b0337407514b9372562b86edfa91cdAndreas Huber void *bufferID; 15005778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffer-id", &bufferID)); 15015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15025778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 15035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15045778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 15055778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 15065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mBufferID == bufferID) { 15085778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mNotify == NULL); 15095778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("reply", &info->mNotify)); 15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15115778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].push_back(i); 15125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15135778822d86b0337407514b9372562b86edfa91cdAndreas Huber return i; 15145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15175778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 15185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 15205778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15225778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { 15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 15245778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 15255778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 15265778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("offset", &offset)); 15305778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeUs", &timeUs)); 15315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples; 15344b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples; 15354b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *key; 15364b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *iv; 15374b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted; 15384b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15394b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // We allow the simpler queueInputBuffer API to be used even in 15404b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // secure mode, by fabricating a single unencrypted subSample. 15414b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::SubSample ss; 15424b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15434b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (msg->findSize("size", &size)) { 15444b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto != NULL) { 15454b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfClearData = size; 15464b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfEncryptedData = 0; 15474b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15484b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples = &ss; 15494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples = 1; 15504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = NULL; 15514b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = NULL; 15524b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 15534b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } else { 15544b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto == NULL) { 15554b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber return -EINVAL; 15564b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 15574b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15584b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("subSamples", (void **)&subSamples)); 15594b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findSize("numSubSamples", &numSubSamples)); 15604b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("key", (void **)&key)); 15614b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("iv", (void **)&iv)); 15624b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15634b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int32_t tmp; 15644b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findInt32("mode", &tmp)); 15654b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15664b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber mode = (CryptoPlugin::Mode)tmp; 15674b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15684b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size = 0; 15694b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 15704b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfClearData; 15714b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfEncryptedData; 15724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 15734b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 15744b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexInput].size()) { 15765778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 15775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15795778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index); 15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 15835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (offset + size > info->mData->capacity()) { 15865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 15875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> reply = info->mNotify; 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->setRange(offset, size); 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_EOS) { 15945778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("eos", true); 15955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_CODECCONFIG) { 15985778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("csd", true); 15995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16011bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mCrypto != NULL) { 16021bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (size > info->mEncryptedData->capacity()) { 16031bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -ERANGE; 1604ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1605ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 16065b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg; 16075b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); 16085b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 1609fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = mCrypto->decrypt( 16101bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (mFlags & kFlagIsSecure) != 0, 16111bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 16121bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 16131bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 16141bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mEncryptedData->base() + offset, 16154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples, 16164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples, 16175b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mData->base(), 16185b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg); 16191bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1620fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result < 0) { 1621fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 1622ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1623ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1624fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong info->mData->setRange(0, result); 1625ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1626ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 16272d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", info->mData); 16285778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->post(); 16295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mNotify = NULL; 16315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mOwnedByClient = false; 16325b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 16335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 16345778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16365778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { 16375778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 16385778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 16395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16405778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t render; 16415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("render", &render)) { 16425778822d86b0337407514b9372562b86edfa91cdAndreas Huber render = 0; 16435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED) { 16465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 16475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexOutput].size()) { 16505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 16515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16535778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 16545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 16565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 16575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (render) { 16605778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->setInt32("render", true); 16615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mSoftRenderer != NULL) { 16635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer->render( 16645778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->data(), info->mData->size(), NULL); 16655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16685778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->post(); 16695778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 16705778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 16715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 16735778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16755778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { 16765778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 16775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16785778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> *availBuffers = &mAvailPortBuffers[portIndex]; 16795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (availBuffers->empty()) { 16815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EAGAIN; 16825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16845778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index = *availBuffers->begin(); 16855778822d86b0337407514b9372562b86edfa91cdAndreas Huber availBuffers->erase(availBuffers->begin()); 16865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16875778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index); 16885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!info->mOwnedByClient); 16895778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = true; 16905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return index; 16925778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow( 16951a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &surfaceTextureClient) { 16967541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err; 16977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 16987541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (mNativeWindow != NULL) { 16997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_disconnect( 17007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA); 17017541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17027541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 17037541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGW("native_window_api_disconnect returned an error: %s (%d)", 17047541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 17057541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17067541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17077541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.clear(); 17087541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17097541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17107541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (surfaceTextureClient != NULL) { 17117541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_connect( 17127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA); 17137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 17157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGE("native_window_api_connect returned an error: %s (%d)", 17167541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 17177541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17187541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return err; 17197541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17207541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17217541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow = surfaceTextureClient; 17227541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 17237541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 17247541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return OK; 17257541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber} 17267541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 1727575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() { 1728575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if (mActivityNotify == NULL) { 1729575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber return; 1730575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1731575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1732575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if ((mFlags & (kFlagStickyError 1733575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputBuffersChanged 1734575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputFormatChanged)) 1735575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexInput].empty() 1736575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexOutput].empty()) { 1737575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify->post(); 1738575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 1739575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1740575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 1741575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1742a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> ¶ms) { 1743a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 1744a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 1745a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1746a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response; 1747a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return PostAndAwaitResponse(msg, &response); 1748a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1749a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1750a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) { 1751a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mCodec->signalSetParameters(params); 1752a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1753a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 1754a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1755a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1756e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatus_t MediaCodec::amendOutputFormatWithCodecSpecificData( 1757e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const sp<ABuffer> &buffer) { 1758e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber AString mime; 1759e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(mOutputFormat->findString("mime", &mime)); 1760e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1761e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) { 1762e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Codec specific data should be SPS and PPS in a single buffer, 1763e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // each prefixed by a startcode (0x00 0x00 0x00 0x01). 1764e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // We separate the two and put them into the output format 1765e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // under the keys "csd-0" and "csd-1". 1766e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1767e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber unsigned csdIndex = 0; 1768e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1769e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *data = buffer->data(); 1770e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t size = buffer->size(); 1771e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1772e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *nalStart; 1773e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t nalSize; 1774e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { 1775e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber sp<ABuffer> csd = new ABuffer(nalSize + 4); 1776e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data(), "\x00\x00\x00\x01", 4); 1777e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data() + 4, nalStart, nalSize); 1778e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1779e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer( 1780e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber StringPrintf("csd-%u", csdIndex).c_str(), csd); 1781e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1782e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++csdIndex; 1783e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1784e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1785e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (csdIndex != 2) { 1786e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_MALFORMED; 1787e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1788e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 1789e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // For everything else we just stash the codec specific data into 1790e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the output format as a single piece of csd under "csd-0". 1791e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer("csd-0", buffer); 1792e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1793e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1794e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 1795e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 1796e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 17975778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 1798