MediaCodec.cpp revision a2eb22c1de262aa3fa7c356537ac2fe165afdf3d
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 255778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <gui/SurfaceTextureClient.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> 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h> 345778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h> 355778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h> 365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 375778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 405778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType( 415778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder) { 425778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(mime, true /* nameIsType */, encoder) != OK) { 445778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 475778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 485778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 505778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 515778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName( 525778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name) { 535778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) { 555778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 595778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 615778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper) 625778822d86b0337407514b9372562b86edfa91cdAndreas Huber : mState(UNINITIALIZED), 635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper(looper), 645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec(new ACodec), 655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags(0), 665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer(NULL), 675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputTimeoutGeneration(0), 685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID(0), 695778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputTimeoutGeneration(0), 705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID(0) { 715778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 735778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() { 745778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, UNINITIALIZED); 755778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 775778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse( 795778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response) { 805778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = msg->postAndAwaitResponse(response); 815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 825778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 865778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!(*response)->findInt32("err", &err)) { 875778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = OK; 885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 915778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 935778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) { 945778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Current video decoders do not return from OMX_FillThisBuffer 955778822d86b0337407514b9372562b86edfa91cdAndreas Huber // quickly, violating the OpenMAX specs, until that is remedied 965778822d86b0337407514b9372562b86edfa91cdAndreas Huber // we need to invest in an extra looper to free the main event 975778822d86b0337407514b9372562b86edfa91cdAndreas Huber // queue. 985778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool needDedicatedLooper = false; 995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType && !strncasecmp(name, "video/", 6)) { 1005778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (!nameIsType && !strncmp(name, "OMX.TI.DUCATI1.VIDEO.", 21)) { 1025778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (needDedicatedLooper) { 1065778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mCodecLooper == NULL) { 1075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper = new ALooper; 1085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->setName("CodecLooper"); 1095778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 1105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->registerHandler(mCodec); 1135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(mCodec); 1155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(this); 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id())); 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatInit, id()); 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setString("name", name); 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("nameIsType", nameIsType); 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 1265778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("encoder", encoder); 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure( 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<SurfaceTextureClient> &nativeWindow, 1361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags) { 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 1395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1405778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setMessage("format", format); 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nativeWindow != NULL) { 1441bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setObject( 1451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber "native-window", 1461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber new NativeWindowWrapper(nativeWindow)); 1471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 1481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1491bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (crypto != NULL) { 1501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setPointer("crypto", crypto.get()); 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() { 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStart, id()); 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() { 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStop, id()); 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 171c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() { 172c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatRelease, id()); 173c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 174c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response; 175c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return PostAndAwaitResponse(msg, &response); 176c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 177c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer( 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 1805778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 1815778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 1825778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 1835b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 1845b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 1855b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 1865b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 1875b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 1885b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 1895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("offset", offset); 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("size", size); 1935778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 1945778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 1955b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 1965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1975778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 1985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 1995778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer( 2024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 2034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 2044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 2054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 2064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 2074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 2084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 2094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 2105b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 2115b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 2125b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 2135b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 2145b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 2155b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 2174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("index", index); 2184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("offset", offset); 2194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("subSamples", (void *)subSamples); 2204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("numSubSamples", numSubSamples); 2214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("key", (void *)key); 2224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("iv", (void *)iv); 2234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("mode", mode); 2244b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 2254b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("flags", flags); 2265b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 2274b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 2284b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> response; 2295b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber status_t err = PostAndAwaitResponse(msg, &response); 2305b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 2315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber return err; 2324b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber} 2334b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id()); 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2445778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 2455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2475778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2495778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer( 2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 2515778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 2525778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs) { 2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id()); 2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2605778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2655778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 2665778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("offset", offset)); 2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("size", size)); 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt64("timeUs", presentationTimeUs)); 2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt32("flags", (int32_t *)flags)); 2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2745778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) { 2755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 2765778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 2775778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("render", true); 2785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2795778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2805778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2815778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2835778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) { 2845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 2855778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 2865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2875778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2885778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2895778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2915778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const { 2925778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id()); 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findMessage("format", format)); 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 305717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const { 306717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> msg = new AMessage(kWhatGetName, id()); 307717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 308717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response; 309717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t err; 310717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 311717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return err; 312717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 313717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 314717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(response->findString("name", name)); 315717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 316717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return OK; 317717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo} 318717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 3195778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const { 3205778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 3215778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexInput); 3225778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 3235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3245778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3255778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3265778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3285778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const { 3295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 3305778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexOutput); 3315778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 3325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3335778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3345778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3355778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3375778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() { 3385778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 3395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3425778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 344496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() { 345496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 346496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 347496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return OK; 348496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 349496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 350575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> ¬ify) { 351575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id()); 352575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->setMessage("notify", notify); 353575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->post(); 354575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 355575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 3565778822d86b0337407514b9372562b86edfa91cdAndreas Huber//////////////////////////////////////////////////////////////////////////////// 3575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3585778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() { 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 3655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 3715778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 3725778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 3735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3745778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 3755778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 3765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 3775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3785778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3805778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { 3815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 3825778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 3835778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueInputPending))) { 3845778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 3855778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 3865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3875778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 3885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 3905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3925778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 3935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 3955778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 3965778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 3975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 3985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3995778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4005778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 4015778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4035778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4045778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4065778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED 4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueOutputPending))) { 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputBuffersChanged) { 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputFormatChanged) { 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_FORMAT_CHANGED); 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexOutput); 4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = 4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[kPortIndexOutput].itemAt(index).mData; 4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("offset", buffer->offset()); 4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("size", buffer->size()); 4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt64("timeUs", timeUs); 4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags = 0; 4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 4445778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_SYNCFRAME; 4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_CODECCONFIG; 4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_EOS) { 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_EOS; 4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4535778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("flags", flags); 4545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4565778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 4575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4585778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 4595778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4615778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) { 4625778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 4635778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatCodecNotify: 4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t what; 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("what", &what)); 4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (what) { 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatError: 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4715778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxError, internalError; 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("omx-error", &omxError)); 4735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("err", &internalError)); 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Codec reported an error. " 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber "(omx error 0x%08x, internalError %d)", 4775778822d86b0337407514b9372562b86edfa91cdAndreas Huber omxError, internalError); 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sendErrorReponse = true; 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (mState) { 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber case INITIALIZING: 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(UNINITIALIZED); 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber case CONFIGURING: 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4945778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTING: 4955778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 4965778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 4975778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 4985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5005778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STOPPING: 501c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case RELEASING: 5025778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5035778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Ignore the error, assuming we'll still get 5045778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the shutdown complete notification. 5055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5065778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 5075778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5105778822d86b0337407514b9372562b86edfa91cdAndreas Huber case FLUSHING: 5115778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5125778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 5135778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5165778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTED: 5175778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5185778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 5195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 521575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 532575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sendErrorReponse) { 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", UNKNOWN_ERROR); 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5415778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mReplyID); 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5465778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatComponentAllocated: 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, INITIALIZING); 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 5505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 551717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->findString("componentName", &mComponentName)); 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 553717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.startsWith("OMX.google.")) { 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagIsSoftwareCodec; 5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagIsSoftwareCodec; 5575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 559717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.endsWith(".secure")) { 5601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags |= kFlagIsSecure; 5611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 5621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags &= ~kFlagIsSecure; 5631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 5641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 5655778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 5665778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5695778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatComponentConfigured: 5705778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5715778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, CONFIGURING); 5725778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 5735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5745778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 5755778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 5765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5785778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatBuffersAllocated: 5795778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 5815778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("%s buffers allocated", 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber || portIndex == kPortIndexOutput); 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[portIndex].clear(); 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5915778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 5925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 593eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<RefBase> obj; 594eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber CHECK(msg->findObject("portDesc", &obj)); 595eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 596eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<ACodec::PortDescription> portDesc = 597eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber static_cast<ACodec::PortDescription *>(obj.get()); 5985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 599eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber size_t numBuffers = portDesc->countBuffers(); 6005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 601eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber for (size_t i = 0; i < numBuffers; ++i) { 6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo info; 603eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mBufferID = portDesc->bufferIDAt(i); 6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mOwnedByClient = false; 605eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mData = portDesc->bufferAt(i); 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6071bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (portIndex == kPortIndexInput && mCrypto != NULL) { 608ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mEncryptedData = 609ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber new ABuffer(info.mData->capacity()); 610ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 611ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffers->push_back(info); 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexOutput) { 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTING) { 6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We're always allocating output buffers after 6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber // allocating input buffers, so this is a good 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber // indication that now all buffers are allocated. 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 6225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputBuffersChanged; 624575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 6255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6275778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatOutputFormatChanged: 6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("codec output format changed"); 6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mFlags & kFlagIsSoftwareCodec) 6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mNativeWindow != NULL) { 6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp("video/", mime.c_str(), 6)) { 6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6435778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("width", &width)); 6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("height", &height)); 6465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t colorFormat; 6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32( 6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber "color-format", &colorFormat)); 6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = new MetaData; 6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyWidth, width); 6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyHeight, height); 6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyColorFormat, colorFormat); 6555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6565778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = 6575778822d86b0337407514b9372562b86edfa91cdAndreas Huber new SoftwareRenderer(mNativeWindow, meta); 6585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat = msg; 6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputFormatChanged; 663575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatFillThisBuffer: 6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexInput, msg); 6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 671c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 672c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 673c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 6745778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!mCSD.empty()) { 6798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 6808ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK_GE(index, 0); 6818ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 6828ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // If codec specific data had been specified as 6838ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // part of the format in the call to configure and 6848ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // if there's more csd left, we submit it here 6858ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // clients only get access to input buffers once 6868ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // this data has been exhausted. 6878ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 6888ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t err = queueCSDInputBuffer(index); 6898ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 6908ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (err != OK) { 6918ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGE("queueCSDInputBuffer failed w/ error %d", 6928ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber err); 6938ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 6948ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mFlags |= kFlagStickyError; 695575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 696575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 6978ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber cancelPendingDequeueOperations(); 6988ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 6998ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 7008ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 7018ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); 7045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7055778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 7065778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 7075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 708575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 709575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatDrainThisBuffer: 7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7165778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexOutput, msg); 7175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 718c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 719c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 720c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7252d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 7262d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 7275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7285778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", &omxFlags)); 7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->meta()->setInt32("omxFlags", omxFlags); 7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID)); 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 739575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 740575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 742575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 7435778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7465778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatEOS: 7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We already notify the client of this by using the 7495778822d86b0337407514b9372562b86edfa91cdAndreas Huber // corresponding flag in "onOutputBufferReady". 7505778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7535778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatShutdownCompleted: 7545778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 755c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == STOPPING) { 756c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(INITIALIZED); 757c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } else { 758c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mState, RELEASING); 759c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(UNINITIALIZED); 760c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 7615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7635778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatFlushCompleted: 7675778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7685778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, FLUSHING); 7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalResume(); 7725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 7785778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 7795778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7805778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7835778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatInit: 7845778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7855778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 7905778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 7915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7925778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7965778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 7975778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZING); 7985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7995778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name; 8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("name", &name)); 8015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8025778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t nameIsType; 8035778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder = false; 8040db280176bd3277e3256252d063f3712b1905ba9Andreas Huber CHECK(msg->findInt32("nameIsType", &nameIsType)); 8050db280176bd3277e3256252d063f3712b1905ba9Andreas Huber if (nameIsType) { 8065778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("encoder", &encoder)); 8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format = new AMessage; 8105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("mime", name.c_str()); 8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", encoder); 8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 8155778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("componentName", name.c_str()); 8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateAllocateComponent(format); 8195778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8225778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatConfigure: 8235778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8245778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 8255778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 8265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED) { 8285778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 8295778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 8305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8315778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 8325778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8355778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<RefBase> obj; 8365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findObject("native-window", &obj)) { 8375778822d86b0337407514b9372562b86edfa91cdAndreas Huber obj.clear(); 8385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8405778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 8415778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("format", &format)); 8425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8435778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (obj != NULL) { 8445778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setObject("native-window", obj); 8451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 8467541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err = setNativeWindow( 8477541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()) 8487541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ->getSurfaceTextureClient()); 8497541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 8507541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 8517541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber sp<AMessage> response = new AMessage; 8527541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->setInt32("err", err); 8537541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 8547541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber response->postReply(replyID); 8557541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber break; 8561bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 8571bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 8587541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 8591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 8601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 8617541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mReplyID = replyID; 8627541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setState(CONFIGURING); 8637541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 8641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *crypto; 8651bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!msg->findPointer("crypto", &crypto)) { 8661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber crypto = NULL; 8675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8691bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto = static_cast<ICrypto *>(crypto); 8701bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 8715778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 8725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 8735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & CONFIGURE_FLAG_ENCODE) { 8755778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", true); 8765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8788ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber extractCSD(format); 8798ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 8805778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateConfigureComponent(format); 8815778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8845778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 8855778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8865778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 8875778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 8885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != CONFIGURED) { 8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8935778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 8945778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8965778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 8985778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTING); 8995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateStart(); 9015778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 9055778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9075778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED 9105778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mState != CONFIGURED && mState != STARTED) { 9115778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9125778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 9135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 9195778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STOPPING); 9205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 921c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->initiateShutdown(true /* keepComponentAllocated */); 922c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber returnBuffersToCodec(); 923c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 924c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 925c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 926c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case kWhatRelease: 927c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 928c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber uint32_t replyID; 929c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 930c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 931c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState != INITIALIZED 932c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mState != CONFIGURED && mState != STARTED) { 933c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response = new AMessage; 934c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->setInt32("err", INVALID_OPERATION); 935c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 936c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->postReply(replyID); 937c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 938c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 939c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 940c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mReplyID = replyID; 941c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(RELEASING); 942c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateShutdown(); 9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputBuffer: 9495778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9505778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 9515778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 9525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueInputBuffer(replyID, true /* new request */)) { 9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 9615778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 9635778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueInputPending; 9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = replyID; 9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 9715778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 9725778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueInputTimedOut, id()); 9735778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 9745778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueInputTimeoutGeneration); 9755778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 9765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9775778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9805778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputTimedOut: 9815778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueInputTimeoutGeneration) { 9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueInputPending); 9915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueInputReplyID); 9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9965778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 9975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 9985778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10015778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatQueueInputBuffer: 10025778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10035778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10045778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10065778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 10075778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10085778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 10095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10105778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10115778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10145778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onQueueInputBuffer(msg); 10155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10165778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10175778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 10185778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10195778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10225778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputBuffer: 10235778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10245778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10255778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueOutputBuffer(replyID, true /* new request */)) { 10285778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10385778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueOutputPending; 10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = replyID; 10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 10455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 10465778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueOutputTimedOut, id()); 10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueOutputTimeoutGeneration); 10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10515778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10525778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10545778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputTimedOut: 10555778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10565778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 10575778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 10585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueOutputTimeoutGeneration) { 10605778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 10615778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10645778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueOutputPending); 10655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10665778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10675778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", -EAGAIN); 10685778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(mDequeueOutputReplyID); 10695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10705778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 10715778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 10725778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10755778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReleaseOutputBuffer: 10765778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10775778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10785778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10845778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10855778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onReleaseOutputBuffer(msg); 10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 10915778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", err); 10925778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 10935778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10965778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetBuffers: 10975778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10985778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 10995778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 11025778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11035778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 11045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11055778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11065778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11095778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 11105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 11115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11125778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > *dstBuffers; 11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffers", (void **)&dstBuffers)); 11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11155778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffers->clear(); 11165778822d86b0337407514b9372562b86edfa91cdAndreas Huber const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex]; 11175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11185778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < srcBuffers.size(); ++i) { 11195778822d86b0337407514b9372562b86edfa91cdAndreas Huber const BufferInfo &info = srcBuffers.itemAt(i); 11205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1121ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber dstBuffers->push_back( 11221bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (portIndex == kPortIndexInput && mCrypto != NULL) 1123ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? info.mEncryptedData : info.mData); 11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(replyID); 11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatFlush: 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED || (mFlags & kFlagStickyError)) { 11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 11385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11405778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 11445778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(FLUSHING); 11455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalFlush(); 11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11515778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetOutputFormat: 11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mState != STARTED && mState != FLUSHING) 1157972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || (mFlags & kFlagStickyError) 1158972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || mOutputFormat == NULL) { 11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setMessage("format", mOutputFormat); 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 11695778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1172496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 1173496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 1174496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mCodec->signalRequestIDRFrame(); 1175496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 1176496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 1177496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 1178575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber case kWhatRequestActivityNotification: 1179575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber { 1180575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(mActivityNotify == NULL); 1181575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(msg->findMessage("notify", &mActivityNotify)); 1182575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1183575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 1184575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber break; 1185575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1186575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1187717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo case kWhatGetName: 1188717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo { 1189717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo uint32_t replyID; 1190717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->senderAwaitsResponse(&replyID)); 1191717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1192717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.empty()) { 1193717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1194717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setInt32("err", INVALID_OPERATION); 1195717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1196717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1197717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1198717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1199717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1200717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1201717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setString("name", mComponentName.c_str()); 1202717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1203717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1204717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1205717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1206a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 1207a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 1208a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber uint32_t replyID; 1209a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1210a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1211a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 1212a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 1213a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1214a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = onSetParameters(params); 1215a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1216a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response = new AMessage; 1217a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->setInt32("err", err); 1218a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1219a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber response->postReply(replyID); 1220a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 1221a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 1222a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 12235778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 12245778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 12255778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12265778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 12275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12288ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) { 12298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.clear(); 12308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber size_t i = 0; 12328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber for (;;) { 12338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd; 12348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) { 12358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 12368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 12378ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.push_back(csd); 12398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ++i; 12408ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 12418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGV("Found %u pieces of codec specific data.", mCSD.size()); 12438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 12448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) { 12468ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK(!mCSD.empty()); 12478ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber BufferInfo *info = 12498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber &mPortBuffers[kPortIndexInput].editItemAt(bufferIndex); 12508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd = *mCSD.begin(); 12528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.erase(mCSD.begin()); 12538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber const sp<ABuffer> &codecInputData = 12558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber (mCrypto != NULL) ? info->mEncryptedData : info->mData; 12568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (csd->size() > codecInputData->capacity()) { 12588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return -EINVAL; 12598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 12608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber memcpy(codecInputData->data(), csd->data(), csd->size()); 12628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber AString errorDetailMsg; 12648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 12668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("index", bufferIndex); 12678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("offset", 0); 12688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("size", csd->size()); 12698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt64("timeUs", 0ll); 12708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG); 12718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setPointer("errorDetailMsg", &errorDetailMsg); 12728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return onQueueInputBuffer(msg); 12748ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 12758ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12765778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) { 12777541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (newState == INITIALIZED || newState == UNINITIALIZED) { 12785778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 12795778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 12805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12811bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto.clear(); 12827541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat.clear(); 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagStickyError; 1288575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1289575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1292717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (newState == UNINITIALIZED) { 1293717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo mComponentName.clear(); 1294717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1295717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 12965778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = newState; 12975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12985778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 12995778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 13005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13015778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() { 13025778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 13035778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 13045778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 13055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13065778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) { 13075778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 13085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13095778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 13105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13115778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 13125778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 13135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify != NULL) { 13155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = info->mNotify; 13165778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 13175778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 13185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexInput) { 13205778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("err", ERROR_END_OF_STREAM); 13215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13225778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 13235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13265778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].clear(); 13275778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 13285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13295778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers( 13305778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex, const sp<AMessage> &msg) { 13315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 13325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13335778822d86b0337407514b9372562b86edfa91cdAndreas Huber void *bufferID; 13345778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffer-id", &bufferID)); 13355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13365778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 13375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13385778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 13395778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 13405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mBufferID == bufferID) { 13425778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mNotify == NULL); 13435778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("reply", &info->mNotify)); 13445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].push_back(i); 13465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13475778822d86b0337407514b9372562b86edfa91cdAndreas Huber return i; 13485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13515778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 13525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 13545778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13565778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { 13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 13635778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("offset", &offset)); 13645778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeUs", &timeUs)); 13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13674b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples; 13684b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples; 13694b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *key; 13704b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *iv; 13714b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted; 13724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 13734b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // We allow the simpler queueInputBuffer API to be used even in 13744b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // secure mode, by fabricating a single unencrypted subSample. 13754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::SubSample ss; 13764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 13774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (msg->findSize("size", &size)) { 13784b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto != NULL) { 13794b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfClearData = size; 13804b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfEncryptedData = 0; 13814b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 13824b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples = &ss; 13834b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples = 1; 13844b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = NULL; 13854b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = NULL; 13864b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 13874b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } else { 13884b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto == NULL) { 13894b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber return -EINVAL; 13904b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 13914b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 13924b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("subSamples", (void **)&subSamples)); 13934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findSize("numSubSamples", &numSubSamples)); 13944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("key", (void **)&key)); 13954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("iv", (void **)&iv)); 13964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 13974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int32_t tmp; 13984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findInt32("mode", &tmp)); 13994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 14004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber mode = (CryptoPlugin::Mode)tmp; 14014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 14024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size = 0; 14034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 14044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfClearData; 14054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfEncryptedData; 14064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 14074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 14084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 14095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexInput].size()) { 14105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 14115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14135778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index); 14145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14155778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 14165778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 14175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (offset + size > info->mData->capacity()) { 14205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 14215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14235778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> reply = info->mNotify; 14245778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->setRange(offset, size); 14255778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 14265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_EOS) { 14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("eos", true); 14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_CODECCONFIG) { 14325778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("csd", true); 14335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14351bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mCrypto != NULL) { 14361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (size > info->mEncryptedData->capacity()) { 14371bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -ERANGE; 1438ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1439ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 14405b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg; 14415b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); 14425b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 1443fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = mCrypto->decrypt( 14441bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (mFlags & kFlagIsSecure) != 0, 14451bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 14461bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 14471bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 14481bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mEncryptedData->base() + offset, 14494b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples, 14504b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples, 14515b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mData->base(), 14525b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg); 14531bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1454fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result < 0) { 1455fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 1456ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1457ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1458fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong info->mData->setRange(0, result); 1459ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1460ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 14612d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", info->mData); 14625778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->post(); 14635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14645b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mNotify = NULL; 14655b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mOwnedByClient = false; 14665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 14675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 14685778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 14695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14705778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { 14715778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 14725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 14735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14745778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t render; 14755778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("render", &render)) { 14765778822d86b0337407514b9372562b86edfa91cdAndreas Huber render = 0; 14775778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14795778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != STARTED) { 14805778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 14815778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexOutput].size()) { 14845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 14855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14875778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 14885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 14905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 14915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14935778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (render) { 14945778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->setInt32("render", true); 14955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mSoftRenderer != NULL) { 14975778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer->render( 14985778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->data(), info->mData->size(), NULL); 14995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15025778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->post(); 15035778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 15045778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 15055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 15075778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15095778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { 15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 15115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15125778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> *availBuffers = &mAvailPortBuffers[portIndex]; 15135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (availBuffers->empty()) { 15155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EAGAIN; 15165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15185778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index = *availBuffers->begin(); 15195778822d86b0337407514b9372562b86edfa91cdAndreas Huber availBuffers->erase(availBuffers->begin()); 15205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index); 15225778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!info->mOwnedByClient); 15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = true; 15245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15255778822d86b0337407514b9372562b86edfa91cdAndreas Huber return index; 15265778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15287541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow( 15297541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber const sp<SurfaceTextureClient> &surfaceTextureClient) { 15307541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err; 15317541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 15327541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (mNativeWindow != NULL) { 15337541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_disconnect( 15347541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA); 15357541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 15367541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 15377541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGW("native_window_api_disconnect returned an error: %s (%d)", 15387541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 15397541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 15407541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 15417541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.clear(); 15427541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 15437541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 15447541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (surfaceTextureClient != NULL) { 15457541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_connect( 15467541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA); 15477541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 15487541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 15497541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGE("native_window_api_connect returned an error: %s (%d)", 15507541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 15517541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 15527541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return err; 15537541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 15547541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 15557541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow = surfaceTextureClient; 15567541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 15577541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 15587541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return OK; 15597541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber} 15607541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 1561575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() { 1562575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if (mActivityNotify == NULL) { 1563575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber return; 1564575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1565575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1566575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if ((mFlags & (kFlagStickyError 1567575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputBuffersChanged 1568575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputFormatChanged)) 1569575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexInput].empty() 1570575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexOutput].empty()) { 1571575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify->post(); 1572575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 1573575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1574575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 1575575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1576a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> ¶ms) { 1577a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 1578a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 1579a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1580a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response; 1581a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return PostAndAwaitResponse(msg, &response); 1582a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1583a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1584a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) { 1585a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mCodec->signalSetParameters(params); 1586a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1587a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 1588a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 1589a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 15905778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 1591