MediaCodec.cpp revision 60b1c0e79d12a1c70758bc8d060156924635f8ba
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" 19fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#include <inttypes.h> 205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 212606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include "include/avc_utils.h" 225778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include "include/SoftwareRenderer.h" 235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 242606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include <binder/IBatteryStats.h> 252606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include <binder/IServiceManager.h> 261a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian#include <gui/Surface.h> 27ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/ICrypto.h> 285778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ABuffer.h> 295778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/ADebug.h> 305778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/foundation/AMessage.h> 315b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber#include <media/stagefright/foundation/AString.h> 32ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber#include <media/stagefright/foundation/hexdump.h> 335778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/ACodec.h> 347cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 352606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include <media/stagefright/MediaCodec.h> 366f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen#include <media/stagefright/MediaCodecList.h> 37e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber#include <media/stagefright/MediaDefs.h> 385778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MediaErrors.h> 395778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/MetaData.h> 405778822d86b0337407514b9372562b86edfa91cdAndreas Huber#include <media/stagefright/NativeWindowWrapper.h> 412606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include <private/android_filesystem_config.h> 422606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include <utils/Log.h> 432606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang#include <utils/Singleton.h> 44e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 455778822d86b0337407514b9372562b86edfa91cdAndreas Hubernamespace android { 465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 472606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangstruct MediaCodec::BatteryNotifier : public Singleton<BatteryNotifier> { 482606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang BatteryNotifier(); 492606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 502606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang void noteStartVideo(); 512606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang void noteStopVideo(); 522606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang void noteStartAudio(); 532606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang void noteStopAudio(); 542606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 552606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangprivate: 562606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang int32_t mVideoRefCount; 572606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang int32_t mAudioRefCount; 582606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang sp<IBatteryStats> mBatteryStatService; 592606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang}; 602606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 612606b10d51c2dceb851a2ea63e803aba4134bf00Chong ZhangANDROID_SINGLETON_STATIC_INSTANCE(MediaCodec::BatteryNotifier) 622606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 632606b10d51c2dceb851a2ea63e803aba4134bf00Chong ZhangMediaCodec::BatteryNotifier::BatteryNotifier() : 642606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mVideoRefCount(0), 652606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mAudioRefCount(0) { 662606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang // get battery service 672606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang const sp<IServiceManager> sm(defaultServiceManager()); 682606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (sm != NULL) { 692606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang const String16 name("batterystats"); 702606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBatteryStatService = interface_cast<IBatteryStats>(sm->getService(name)); 712606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mBatteryStatService == NULL) { 722606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang ALOGE("batterystats service unavailable!"); 732606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 742606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 752606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 762606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 772606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid MediaCodec::BatteryNotifier::noteStartVideo() { 782606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mVideoRefCount == 0 && mBatteryStatService != NULL) { 792606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBatteryStatService->noteStartVideo(AID_MEDIA); 802606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 812606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mVideoRefCount++; 822606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 832606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 842606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid MediaCodec::BatteryNotifier::noteStopVideo() { 852606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mVideoRefCount == 0) { 862606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang ALOGW("BatteryNotifier::noteStop(): video refcount is broken!"); 872606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang return; 882606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 892606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 902606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mVideoRefCount--; 912606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mVideoRefCount == 0 && mBatteryStatService != NULL) { 922606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBatteryStatService->noteStopVideo(AID_MEDIA); 932606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 942606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 952606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 962606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid MediaCodec::BatteryNotifier::noteStartAudio() { 972606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mAudioRefCount == 0 && mBatteryStatService != NULL) { 982606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBatteryStatService->noteStartAudio(AID_MEDIA); 992606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 1002606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mAudioRefCount++; 1012606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 1022606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 1032606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid MediaCodec::BatteryNotifier::noteStopAudio() { 1042606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mAudioRefCount == 0) { 1052606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang ALOGW("BatteryNotifier::noteStop(): audio refcount is broken!"); 1062606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang return; 1072606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 1082606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 1092606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mAudioRefCount--; 1102606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mAudioRefCount == 0 && mBatteryStatService != NULL) { 1112606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBatteryStatService->noteStopAudio(AID_MEDIA); 1122606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 1132606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 1145778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 1155778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByType( 1165778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *mime, bool encoder) { 1175778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 1185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(mime, true /* nameIsType */, encoder) != OK) { 1195778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 1205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1225778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 1235778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1255778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 1265778822d86b0337407514b9372562b86edfa91cdAndreas Hubersp<MediaCodec> MediaCodec::CreateByComponentName( 1275778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ALooper> &looper, const char *name) { 1285778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MediaCodec> codec = new MediaCodec(looper); 1295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (codec->init(name, false /* nameIsType */, false /* encoder */) != OK) { 1305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return NULL; 1315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return codec; 1345778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1365778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::MediaCodec(const sp<ALooper> &looper) 1375778822d86b0337407514b9372562b86edfa91cdAndreas Huber : mState(UNINITIALIZED), 1385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper(looper), 13992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar mCodec(NULL), 1407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID(0), 1415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags(0), 1425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer(NULL), 1432606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBatteryStatNotified(false), 1442606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mIsVideo(false), 1455778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputTimeoutGeneration(0), 1465778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID(0), 1475778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputTimeoutGeneration(0), 1486507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mDequeueOutputReplyID(0), 1496507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface(false) { 1505778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1525778822d86b0337407514b9372562b86edfa91cdAndreas HuberMediaCodec::~MediaCodec() { 1535778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, UNINITIALIZED); 1545778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1565778822d86b0337407514b9372562b86edfa91cdAndreas Huber// static 1575778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::PostAndAwaitResponse( 1585778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg, sp<AMessage> *response) { 1595778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = msg->postAndAwaitResponse(response); 1605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 1625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!(*response)->findInt32("err", &err)) { 1665778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = OK; 1675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1695778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1705778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 172c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang// static 173c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangvoid MediaCodec::PostReplyWithError(int32_t replyID, int32_t err) { 174c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> response = new AMessage; 175c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang response->setInt32("err", err); 176c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang response->postReply(replyID); 177c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 178c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1795778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::init(const char *name, bool nameIsType, bool encoder) { 180671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // save init parameters for reset 181671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mInitName = name; 182671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mInitNameIsType = nameIsType; 183671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mInitIsEncoder = encoder; 184671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 1855778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Current video decoders do not return from OMX_FillThisBuffer 1865778822d86b0337407514b9372562b86edfa91cdAndreas Huber // quickly, violating the OpenMAX specs, until that is remedied 1875778822d86b0337407514b9372562b86edfa91cdAndreas Huber // we need to invest in an extra looper to free the main event 1885778822d86b0337407514b9372562b86edfa91cdAndreas Huber // queue. 18992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar mCodec = new ACodec; 1905778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool needDedicatedLooper = false; 1915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType && !strncasecmp(name, "video/", 6)) { 1925778822d86b0337407514b9372562b86edfa91cdAndreas Huber needDedicatedLooper = true; 1936f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } else { 1946f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen AString tmp = name; 1956f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (tmp.endsWith(".secure")) { 1966f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen tmp.erase(tmp.size() - 7, 7); 1976f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 19860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar const sp<IMediaCodecList> mcl = MediaCodecList::getInstance(); 1996f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen ssize_t codecIdx = mcl->findCodecByName(tmp.c_str()); 2006f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen if (codecIdx >= 0) { 20160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar const sp<MediaCodecInfo> info = mcl->getCodecInfo(codecIdx); 20260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar Vector<AString> mimes; 20360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar info->getSupportedMimes(&mimes); 20460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar for (size_t i = 0; i < mimes.size(); i++) { 20560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar if (mimes[i].startsWith("video/")) { 20660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar needDedicatedLooper = true; 20760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar break; 2086f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 2096f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 2106f9439efd2a6004b588605f6a9d4af20c98e8e80Marco Nelissen } 2115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2135778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (needDedicatedLooper) { 2145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mCodecLooper == NULL) { 2155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper = new ALooper; 2165778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->setName("CodecLooper"); 2175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO); 2185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodecLooper->registerHandler(mCodec); 2215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 2225778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(mCodec); 2235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mLooper->registerHandler(this); 2265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2275778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->setNotificationMessage(new AMessage(kWhatCodecNotify, id())); 2285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatInit, id()); 2305778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setString("name", name); 2315778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("nameIsType", nameIsType); 2325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 2345778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("encoder", encoder); 2355778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2375778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2385778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2395778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 241c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangstatus_t MediaCodec::setCallback(const sp<AMessage> &callback) { 242c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = new AMessage(kWhatSetCallback, id()); 243c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setMessage("callback", callback); 244c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 245c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> response; 246c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang return PostAndAwaitResponse(msg, &response); 247c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 248c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2495778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::configure( 2505778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &format, 2511a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &nativeWindow, 2521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber const sp<ICrypto> &crypto, 2535778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags) { 2545778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatConfigure, id()); 2555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2565778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setMessage("format", format); 2575778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 2585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nativeWindow != NULL) { 2601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setObject( 2611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber "native-window", 2621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber new NativeWindowWrapper(nativeWindow)); 2631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 2641bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 2651bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (crypto != NULL) { 2661bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber msg->setPointer("crypto", crypto.get()); 2675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2695778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2705778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2715778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::createInputSurface( 2747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer>* bufferProducer) { 2757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatCreateInputSurface, id()); 2767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 2777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 2787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = PostAndAwaitResponse(msg, &response); 2797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == NO_ERROR) { 2807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // unwrap the sp<IGraphicBufferProducer> 2817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 2827cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden bool found = response->findObject("input-surface", &obj); 2837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(found); 2847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<BufferProducerWrapper> wrapper( 2857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden static_cast<BufferProducerWrapper*>(obj.get())); 2867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden *bufferProducer = wrapper->getBufferProducer(); 2877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 2887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGW("createInputSurface failed, err=%d", err); 2897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 2907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return err; 2917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 2927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 2935778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::start() { 2945778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStart, id()); 2955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2965778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 2975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 2985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 2995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3005778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::stop() { 3015778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatStop, id()); 3025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3035778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3055778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 307c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstatus_t MediaCodec::release() { 308c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> msg = new AMessage(kWhatRelease, id()); 309c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 310c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response; 311c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return PostAndAwaitResponse(msg, &response); 312c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 313c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 314671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnarstatus_t MediaCodec::reset() { 315671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar /* When external-facing MediaCodec object is created, 316671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar it is already initialized. Thus, reset is essentially 317671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar release() followed by init(), plus clearing the state */ 318671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 319671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar status_t err = release(); 320671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 321671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // unregister handlers 322671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar if (mCodec != NULL) { 323671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar if (mCodecLooper != NULL) { 324671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mCodecLooper->unregisterHandler(mCodec->id()); 325671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar } else { 326671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mLooper->unregisterHandler(mCodec->id()); 327671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar } 328671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mCodec = NULL; 329671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar } 330671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mLooper->unregisterHandler(id()); 331671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 332671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mFlags = 0; // clear all flags 333671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 334671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // reset state not reset by setState(UNINITIALIZED) 335671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mReplyID = 0; 336671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mDequeueInputReplyID = 0; 337671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mDequeueOutputReplyID = 0; 338671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mDequeueInputTimeoutGeneration = 0; 339671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mDequeueOutputTimeoutGeneration = 0; 340671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mHaveInputSurface = false; 341671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 342671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar if (err == OK) { 343671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar err = init(mInitName.c_str(), mInitNameIsType, mInitIsEncoder); 344671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar } 345671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar return err; 346671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar} 347671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 3485778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::queueInputBuffer( 3495778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index, 3505778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset, 3515778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size, 3525778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t presentationTimeUs, 3535b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 3545b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 3555b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 3565b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 3575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 3585b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 3595778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("offset", offset); 3625778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("size", size); 3635778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 3645778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("flags", flags); 3655b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 3665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3675778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 3685778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 3695778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 3705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3714b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huberstatus_t MediaCodec::queueSecureInputBuffer( 3724b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t index, 3734b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t offset, 3744b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples, 3754b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples, 3764b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t key[16], 3774b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t iv[16], 3784b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode, 3794b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int64_t presentationTimeUs, 3805b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber uint32_t flags, 3815b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg) { 3825b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber if (errorDetailMsg != NULL) { 3835b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg->clear(); 3845b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber } 3855b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 3864b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 3874b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("index", index); 3884b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("offset", offset); 3894b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("subSamples", (void *)subSamples); 3904b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setSize("numSubSamples", numSubSamples); 3914b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("key", (void *)key); 3924b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setPointer("iv", (void *)iv); 3934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("mode", mode); 3944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt64("timeUs", presentationTimeUs); 3954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber msg->setInt32("flags", flags); 3965b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber msg->setPointer("errorDetailMsg", errorDetailMsg); 3974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 3984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber sp<AMessage> response; 3995b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber status_t err = PostAndAwaitResponse(msg, &response); 4005b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 4015b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber return err; 4024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber} 4034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 4045778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueInputBuffer(size_t *index, int64_t timeoutUs) { 4055778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueInputBuffer, id()); 4065778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4085778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4095778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4105778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 4115778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 4125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4145778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 4155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4165778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 4175778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4195778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::dequeueOutputBuffer( 4205778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *index, 4215778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *offset, 4225778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t *size, 4235778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t *presentationTimeUs, 4245778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t *flags, 4255778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs) { 4265778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatDequeueOutputBuffer, id()); 4275778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt64("timeoutUs", timeoutUs); 4285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4305778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 4325778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 4335778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4355778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("index", index)); 4365778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("offset", offset)); 4375778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findSize("size", size)); 4385778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt64("timeUs", presentationTimeUs)); 4395778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findInt32("flags", (int32_t *)flags)); 4405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 4425778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4445778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index) { 4455778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 4465778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 4475778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("render", true); 4485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4495778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4515778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 453fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnarstatus_t MediaCodec::renderOutputBufferAndRelease(size_t index, int64_t timestampNs) { 454fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 455fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setSize("index", index); 456fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setInt32("render", true); 457fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar msg->setInt64("timestampNs", timestampNs); 458fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 459fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar sp<AMessage> response; 460fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar return PostAndAwaitResponse(msg, &response); 461fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar} 462fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 4635778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::releaseOutputBuffer(size_t index) { 4645778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatReleaseOutputBuffer, id()); 4655778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setSize("index", index); 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4675778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MediaCodec::signalEndOfInputStream() { 4727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> msg = new AMessage(kWhatSignalEndOfInputStream, id()); 4737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response; 4757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return PostAndAwaitResponse(msg, &response); 4767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4785778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputFormat(sp<AMessage> *format) const { 4795778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetOutputFormat, id()); 4805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4815778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 4825778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 4845778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 4855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(response->findMessage("format", format)); 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4895778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 4905778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 492e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t MediaCodec::getInputFormat(sp<AMessage> *format) const { 493e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> msg = new AMessage(kWhatGetInputFormat, id()); 494e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 495e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> response; 496e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar status_t err; 497e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 498e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return err; 499e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 500e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 501e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(response->findMessage("format", format)); 502e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 503e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 504e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 505e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 506717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjostatus_t MediaCodec::getName(AString *name) const { 507717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> msg = new AMessage(kWhatGetName, id()); 508717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 509717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response; 510717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo status_t err; 511717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if ((err = PostAndAwaitResponse(msg, &response)) != OK) { 512717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return err; 513717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 514717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 515717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(response->findString("name", name)); 516717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 517717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo return OK; 518717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo} 519717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 5205778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const { 5215778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 5225778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexInput); 5235778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 5245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5255778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 5265778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 5275778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5295778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::getOutputBuffers(Vector<sp<ABuffer> > *buffers) const { 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatGetBuffers, id()); 5315778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setInt32("portIndex", kPortIndexOutput); 5325778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setPointer("buffers", buffers); 5335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5345778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 5355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 5365778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5387bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getOutputBuffer(size_t index, sp<ABuffer> *buffer) { 5397bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> format; 5407bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexOutput, index, buffer, &format); 5417bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 5427bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 5437bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getOutputFormat(size_t index, sp<AMessage> *format) { 5447bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> buffer; 5457bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexOutput, index, &buffer, format); 5467bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 5477bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 5487bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getInputBuffer(size_t index, sp<ABuffer> *buffer) { 5497bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<AMessage> format; 5507bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return getBufferAndFormat(kPortIndexInput, index, buffer, &format); 5517bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 5527bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 5530e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnarbool MediaCodec::isExecuting() const { 5540e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar return mState == STARTED || mState == FLUSHED; 5550e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar} 5560e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar 5577bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnarstatus_t MediaCodec::getBufferAndFormat( 5587bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar size_t portIndex, size_t index, 5597bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar sp<ABuffer> *buffer, sp<AMessage> *format) { 5607bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // use mutex instead of a context switch 5617bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 5627bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar buffer->clear(); 5637bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar format->clear(); 5640e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting()) { 5657bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return INVALID_OPERATION; 5667bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 5677bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 5687bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // we do not want mPortBuffers to change during this section 5697bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // we also don't want mOwnedByClient to change during this 5707bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 5717bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 5727bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar if (index < buffers->size()) { 5737bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar const BufferInfo &info = buffers->itemAt(index); 5747bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar if (info.mOwnedByClient) { 5757bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar *buffer = info.mData; 5767bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar *format = info.mFormat; 5777bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 5787bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 5797bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar return OK; 5807bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar} 5817bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::flush() { 5835778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = new AMessage(kWhatFlush, id()); 5845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5855778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response; 5865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return PostAndAwaitResponse(msg, &response); 5875778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 589496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t MediaCodec::requestIDRFrame() { 590496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber (new AMessage(kWhatRequestIDRFrame, id()))->post(); 591496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 592496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return OK; 593496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 594496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 595575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::requestActivityNotification(const sp<AMessage> ¬ify) { 596575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber sp<AMessage> msg = new AMessage(kWhatRequestActivityNotification, id()); 597575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->setMessage("notify", notify); 598575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber msg->post(); 599575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 600575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber//////////////////////////////////////////////////////////////////////////////// 6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6035778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::cancelPendingDequeueOperations() { 6045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueInputPending) { 605c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mDequeueInputReplyID, INVALID_OPERATION); 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6075778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 6095778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 6105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6125778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mFlags & kFlagDequeueOutputPending) { 613c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mDequeueOutputReplyID, INVALID_OPERATION); 6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6155778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 6165778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 6175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 6185778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6195778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 6205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6215778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueInputBuffer(uint32_t replyID, bool newRequest) { 6220e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting() || (mFlags & kFlagIsAsync) 6235778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 6245778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueInputPending))) { 625c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 6265778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 6275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6295778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 6305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6315778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 6325778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 6335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 6345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6365778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 6375778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 6385778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 6395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 6415778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 6425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6435778822d86b0337407514b9372562b86edfa91cdAndreas Huberbool MediaCodec::handleDequeueOutputBuffer(uint32_t replyID, bool newRequest) { 6445778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 6455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6460e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting() || (mFlags & kFlagIsAsync) 6475778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (mFlags & kFlagStickyError) 6485778822d86b0337407514b9372562b86edfa91cdAndreas Huber || (newRequest && (mFlags & kFlagDequeueOutputPending))) { 6495778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INVALID_OPERATION); 6505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputBuffersChanged) { 6515778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_OUTPUT_BUFFERS_CHANGED); 6525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 6535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (mFlags & kFlagOutputFormatChanged) { 6545778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("err", INFO_FORMAT_CHANGED); 6555778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 6565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 6575778822d86b0337407514b9372562b86edfa91cdAndreas Huber ssize_t index = dequeuePortBuffer(kPortIndexOutput); 6585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6595778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index < 0) { 6605778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(index, -EAGAIN); 6615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return false; 6625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6645778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<ABuffer> &buffer = 6655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[kPortIndexOutput].itemAt(index).mData; 6665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6675778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("index", index); 6685778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("offset", buffer->offset()); 6695778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setSize("size", buffer->size()); 6705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6715778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 6725778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 6735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6745778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt64("timeUs", timeUs); 6755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6765778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 6775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 6785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6795778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags = 0; 6805778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 6815778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_SYNCFRAME; 6825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 6845778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_CODECCONFIG; 6855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6865778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (omxFlags & OMX_BUFFERFLAG_EOS) { 6875778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= BUFFER_FLAG_EOS; 6885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6905778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->setInt32("flags", flags); 6915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 6925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6935778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 6945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return true; 6965778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 6975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6985778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::onMessageReceived(const sp<AMessage> &msg) { 6995778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (msg->what()) { 7005778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatCodecNotify: 7015778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7025778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t what; 7035778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("what", &what)); 7045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7055778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (what) { 70692cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatError: 7075778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7085778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxError, internalError; 7095778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("omx-error", &omxError)); 7105778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("err", &internalError)); 7115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7125778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("Codec reported an error. " 7135778822d86b0337407514b9372562b86edfa91cdAndreas Huber "(omx error 0x%08x, internalError %d)", 7145778822d86b0337407514b9372562b86edfa91cdAndreas Huber omxError, internalError); 7155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 716aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (omxError == OMX_ErrorResourcesLost 717aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber && internalError == DEAD_OBJECT) { 718aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags |= kFlagSawMediaServerDie; 719aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 720aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 7215778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool sendErrorReponse = true; 7225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7235778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (mState) { 7245778822d86b0337407514b9372562b86edfa91cdAndreas Huber case INITIALIZING: 7255778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7265778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(UNINITIALIZED); 7275778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7305778822d86b0337407514b9372562b86edfa91cdAndreas Huber case CONFIGURING: 7315778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7325778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 7335778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7365778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTING: 7375778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7385778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(CONFIGURED); 7395778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7425778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STOPPING: 743c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case RELEASING: 7445778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7455778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Ignore the error, assuming we'll still get 7465778822d86b0337407514b9372562b86edfa91cdAndreas Huber // the shutdown complete notification. 7475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7485778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 74903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 750aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 75103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // MediaServer died, there definitely won't 75203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // be a shutdown complete notification after 75303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // all. 75403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 75503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // note that we're directly going from 75603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // STOPPING->UNINITIALIZED, instead of the 75703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // usual STOPPING->INITIALIZED state. 75803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber setState(UNINITIALIZED); 75903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber 76003ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber (new AMessage)->postReply(mReplyID); 76103ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber } 7625778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7655778822d86b0337407514b9372562b86edfa91cdAndreas Huber case FLUSHING: 7665778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7670e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar setState( 7680e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar (mFlags & kFlagIsAsync) ? FLUSHED : STARTED); 7695778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7720e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar case FLUSHED: 7735778822d86b0337407514b9372562b86edfa91cdAndreas Huber case STARTED: 7745778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7755778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 7765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 778575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 7795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7805778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 781c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 782c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 783749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang onError(omxError, 0); 784c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 785ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 7865778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 7875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 7885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7895778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 7905778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 7915778822d86b0337407514b9372562b86edfa91cdAndreas Huber sendErrorReponse = false; 7925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 7935778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagStickyError; 794575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 795c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 796c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 797749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang onError(omxError, 0); 798c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 799ec5f7cc4756d389505e761b9d803a1a3a46b64d7Lajos Molnar setState(UNINITIALIZED); 8005778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8015778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8045778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (sendErrorReponse) { 805c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mReplyID, UNKNOWN_ERROR); 8065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8075778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 81092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatComponentAllocated: 8115778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8125778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, INITIALIZING); 8135778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZED); 8145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 815717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->findString("componentName", &mComponentName)); 8165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 817717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.startsWith("OMX.google.")) { 8185778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagIsSoftwareCodec; 8195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 8205778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagIsSoftwareCodec; 8215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 823717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.endsWith(".secure")) { 8241bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags |= kFlagIsSecure; 8251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 8261bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mFlags &= ~kFlagIsSecure; 8271bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 8281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 8295778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 8305778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 83392cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatComponentConfigured: 8345778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8355778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, CONFIGURING); 8365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8376507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden // reset input surface flag 8386507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = false; 8396507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 840e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("input-format", &mInputFormat)); 841e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(msg->findMessage("output-format", &mOutputFormat)); 842e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 8432606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang setState(CONFIGURED); 8445778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 8455778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 8465778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 8475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 84892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatInputSurfaceCreated: 8497cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 85092cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar // response to initiateCreateInputSurface() 8517cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err = NO_ERROR; 8527cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 8537cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (!msg->findInt32("err", &err)) { 8547cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<RefBase> obj; 8557cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden msg->findObject("input-surface", &obj); 8567cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(obj != NULL); 8577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setObject("input-surface", obj); 8586507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mHaveInputSurface = true; 8597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 8607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 8617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 8627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 8637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 8647cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 8657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 86692cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatSignaledInputEOS: 8677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 86892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar // response to signalEndOfInputStream() 8697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> response = new AMessage(); 8707cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 8717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (msg->findInt32("err", &err)) { 8727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->setInt32("err", err); 8737cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 8747cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden response->postReply(mReplyID); 8757cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 8767cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 8777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 8787cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 87992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatBuffersAllocated: 8805778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 8817bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 8825778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 8835778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 8845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8855778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("%s buffers allocated", 8865778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 8875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput 8895778822d86b0337407514b9372562b86edfa91cdAndreas Huber || portIndex == kPortIndexOutput); 8905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mPortBuffers[portIndex].clear(); 8925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 8935778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 8945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 895eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<RefBase> obj; 896eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber CHECK(msg->findObject("portDesc", &obj)); 897eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 89892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar sp<CodecBase::PortDescription> portDesc = 89992cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar static_cast<CodecBase::PortDescription *>(obj.get()); 9005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 901eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber size_t numBuffers = portDesc->countBuffers(); 9025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 903eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber for (size_t i = 0; i < numBuffers; ++i) { 9045778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo info; 905eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mBufferID = portDesc->bufferIDAt(i); 9065778822d86b0337407514b9372562b86edfa91cdAndreas Huber info.mOwnedByClient = false; 907eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber info.mData = portDesc->bufferAt(i); 9085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9091bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (portIndex == kPortIndexInput && mCrypto != NULL) { 910ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mEncryptedData = 911ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber new ABuffer(info.mData->capacity()); 912ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 913ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 9145778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffers->push_back(info); 9155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9165778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9175778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexOutput) { 9185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState == STARTING) { 9195778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We're always allocating output buffers after 9205778822d86b0337407514b9372562b86edfa91cdAndreas Huber // allocating input buffers, so this is a good 9215778822d86b0337407514b9372562b86edfa91cdAndreas Huber // indication that now all buffers are allocated. 9225778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTED); 9235778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 9245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 9255778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagOutputBuffersChanged; 926575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 9275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9295778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 93292cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatOutputFormatChanged: 9335778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9345778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("codec output format changed"); 9355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9365778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((mFlags & kFlagIsSoftwareCodec) 9375778822d86b0337407514b9372562b86edfa91cdAndreas Huber && mNativeWindow != NULL) { 9385778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 9395778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 9405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!strncasecmp("video/", mime.c_str(), 6)) { 9425778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 9435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 9445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9455778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height; 9465778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("width", &width)); 9475778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("height", &height)); 9485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9496539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo int32_t cropLeft, cropTop, cropRight, cropBottom; 9506539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo CHECK(msg->findRect("crop", 9516539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo &cropLeft, &cropTop, &cropRight, &cropBottom)); 9526539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo 9535778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t colorFormat; 9545778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32( 9555778822d86b0337407514b9372562b86edfa91cdAndreas Huber "color-format", &colorFormat)); 9565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9575778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<MetaData> meta = new MetaData; 9585778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyWidth, width); 9595778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyHeight, height); 9606539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo meta->setRect(kKeyCropRect, 9616539f82d55d4457bc84ed23d57967346022c56dcMartin Storsjo cropLeft, cropTop, cropRight, cropBottom); 9625778822d86b0337407514b9372562b86edfa91cdAndreas Huber meta->setInt32(kKeyColorFormat, colorFormat); 9635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = 9655778822d86b0337407514b9372562b86edfa91cdAndreas Huber new SoftwareRenderer(mNativeWindow, meta); 9665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9675778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9695778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat = msg; 970e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 971e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagIsEncoder) { 972e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Before we announce the format change we should 973e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // collect codec specific data and amend the output 974e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format as necessary. 975e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagGatherCodecSpecificData; 976c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else if (mFlags & kFlagIsAsync) { 977c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang onOutputFormatChanged(); 978e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 979e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagOutputFormatChanged; 980e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber postActivityNotificationIfPossible(); 981e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 9825778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 98592cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatFillThisBuffer: 9865778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 9875778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexInput, msg); 9885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 989c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 990c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 991c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 9925778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 9935778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 9945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 9955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 9968ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!mCSD.empty()) { 9978ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ssize_t index = dequeuePortBuffer(kPortIndexInput); 9988ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK_GE(index, 0); 9998ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 10008ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // If codec specific data had been specified as 10018ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // part of the format in the call to configure and 10028ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // if there's more csd left, we submit it here 10038ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // clients only get access to input buffers once 10048ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber // this data has been exhausted. 10058ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 10068ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber status_t err = queueCSDInputBuffer(index); 10078ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 10088ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (err != OK) { 10098ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ALOGE("queueCSDInputBuffer failed w/ error %d", 10108ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber err); 10118ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 10128ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mFlags |= kFlagStickyError; 1013575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 1014575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 10158ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber cancelPendingDequeueOperations(); 10168ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 10178ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 10188ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 10198ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 1020c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 1021c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang onInputBufferAvailable(); 1022c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else if (mFlags & kFlagDequeueInputPending) { 10235778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueInputBuffer(mDequeueInputReplyID)); 10245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10255778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueInputTimeoutGeneration; 10265778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 10275778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 1028575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 1029575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 10305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10315778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 103492cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatDrainThisBuffer: 10355778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10365778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* size_t index = */updateBuffers(kPortIndexOutput, msg); 10375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1038c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == FLUSHING 1039c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == STOPPING 1040c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber || mState == RELEASING) { 10415778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 10425778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10452d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 10462d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber CHECK(msg->findBuffer("buffer", &buffer)); 10475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10485778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t omxFlags; 10495778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", &omxFlags)); 10505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10515778822d86b0337407514b9372562b86edfa91cdAndreas Huber buffer->meta()->setInt32("omxFlags", omxFlags); 10525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1053e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mFlags & kFlagGatherCodecSpecificData) { 1054e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // This is the very first output buffer after a 1055e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // format change was signalled, it'll either contain 1056e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the one piece of codec specific data we can expect 1057e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // or there won't be codec specific data. 1058e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 1059e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber status_t err = 1060e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber amendOutputFormatWithCodecSpecificData(buffer); 1061e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1062e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (err != OK) { 1063e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ALOGE("Codec spit out malformed codec " 1064e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "specific data!"); 1065e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1066e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1067e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1068e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 1069c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 1070c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang onOutputFormatChanged(); 1071c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else { 1072c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mFlags |= kFlagOutputFormatChanged; 1073c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1074e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 1075e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 1076c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 1077c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang onOutputBufferAvailable(); 1078c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else if (mFlags & kFlagDequeueOutputPending) { 10795778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(handleDequeueOutputBuffer(mDequeueOutputReplyID)); 10805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 10815778822d86b0337407514b9372562b86edfa91cdAndreas Huber ++mDequeueOutputTimeoutGeneration; 10825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 10835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 1084575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } else { 1085575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 10865778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1087575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 10885778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10895778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 109192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatEOS: 10925778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 10935778822d86b0337407514b9372562b86edfa91cdAndreas Huber // We already notify the client of this by using the 10945778822d86b0337407514b9372562b86edfa91cdAndreas Huber // corresponding flag in "onOutputBufferReady". 10955778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 10965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 10975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 109892cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatShutdownCompleted: 10995778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1100c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState == STOPPING) { 1101c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(INITIALIZED); 1102c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } else { 1103c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mState, RELEASING); 1104c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber setState(UNINITIALIZED); 1105c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 11065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11075778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 11085778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 111192cd05b8f2e994aabcdda5d7454c96a707dc9579Lajos Molnar case CodecBase::kWhatFlushCompleted: 11125778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11135778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mState, FLUSHING); 11145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11150e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (mFlags & kFlagIsAsync) { 11160e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar setState(FLUSHED); 11170e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar } else { 11180e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar setState(STARTED); 11190e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar mCodec->signalResume(); 11200e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar } 11215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11225778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(mReplyID); 11235778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11245778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11265778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 11275778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 11285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11295778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11315778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11325778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatInit: 11335778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 11345778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 11355778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 11365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != UNINITIALIZED) { 1138c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 11395778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11425778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 11435778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(INITIALIZING); 11445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11455778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString name; 11465778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("name", &name)); 11475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11485778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t nameIsType; 11495778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder = false; 11500db280176bd3277e3256252d063f3712b1905ba9Andreas Huber CHECK(msg->findInt32("nameIsType", &nameIsType)); 11510db280176bd3277e3256252d063f3712b1905ba9Andreas Huber if (nameIsType) { 11525778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("encoder", &encoder)); 11535778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format = new AMessage; 11565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (nameIsType) { 11585778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("mime", name.c_str()); 11595778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", encoder); 11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setString("componentName", name.c_str()); 11625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateAllocateComponent(format); 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 11665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1168c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang case kWhatSetCallback: 1169c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang { 1170c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang uint32_t replyID; 1171c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CHECK(msg->senderAwaitsResponse(&replyID)); 1172c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1173c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mState == UNINITIALIZED 1174c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang || mState == INITIALIZING 11750e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar || isExecuting()) { 11760e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar // callback can't be set after codec is executing, 1177c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang // or before it's initialized (as the callback 1178c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang // will be cleared when it goes to INITIALIZED) 1179c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 1180c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang break; 1181c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1182c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1183c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> callback; 1184c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CHECK(msg->findMessage("callback", &callback)); 1185c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1186c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mCallback = callback; 1187c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1188c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mCallback != NULL) { 1189c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang ALOGI("MediaCodec will operate in async mode"); 1190c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mFlags |= kFlagIsAsync; 1191c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } else { 1192c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mFlags &= ~kFlagIsAsync; 1193c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1194c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 1195c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> response = new AMessage; 1196c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang response->postReply(replyID); 1197c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang break; 1198c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1199c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 12005778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatConfigure: 12015778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12025778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12035778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12055778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mState != INITIALIZED) { 1206c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 12075778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12085778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12095778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<RefBase> obj; 12115778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findObject("native-window", &obj)) { 12125778822d86b0337407514b9372562b86edfa91cdAndreas Huber obj.clear(); 12135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12155778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> format; 12165778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("format", &format)); 12175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12185778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (obj != NULL) { 12195778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setObject("native-window", obj); 12201bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 12217541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err = setNativeWindow( 12227541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber static_cast<NativeWindowWrapper *>(obj.get()) 12237541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ->getSurfaceTextureClient()); 12247541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 12257541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 1226c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, err); 12277541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber break; 12281bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 12291bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } else { 12307541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 12311bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber } 12321bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 12337541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mReplyID = replyID; 12347541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setState(CONFIGURING); 12357541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 12361bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber void *crypto; 12371bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (!msg->findPointer("crypto", &crypto)) { 12381bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber crypto = NULL; 12395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12411bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto = static_cast<ICrypto *>(crypto); 12421bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 12435778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 12445778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 12455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & CONFIGURE_FLAG_ENCODE) { 12475778822d86b0337407514b9372562b86edfa91cdAndreas Huber format->setInt32("encoder", true); 1248e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags |= kFlagIsEncoder; 12495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber extractCSD(format); 12528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 12535778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateConfigureComponent(format); 12545778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12555778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12577cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatCreateInputSurface: 12587cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 12597cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 12607cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 12617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12627cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Must be configured, but can't have been started yet. 12637cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (mState != CONFIGURED) { 1264c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 12657cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 12667cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 12677cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12687cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 12697cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->initiateCreateInputSurface(); 12707cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 12717cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 12727cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 12735778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStart: 12745778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 12755778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 12765778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 12775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12780e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (mState == FLUSHED) { 12790e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar mCodec->signalResume(); 12800e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar PostReplyWithError(replyID, OK); 12810e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar } else if (mState != CONFIGURED) { 1282c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 12835778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 12875778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(STARTING); 12885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->initiateStart(); 12905778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 12915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 12925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 12935778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatStop: 1294c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case kWhatRelease: 1295c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 1296aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber State targetState = 1297aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (msg->what() == kWhatStop) ? INITIALIZED : UNINITIALIZED; 1298aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1299c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber uint32_t replyID; 1300c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1301c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1302c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mState != INITIALIZED 13030e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar && mState != CONFIGURED && !isExecuting()) { 130403ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // We may be in "UNINITIALIZED" state already without the 130503ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // client being aware of this if media server died while 130603ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // we were being stopped. The client would assume that 130703ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // after stop() returned, it would be safe to call release() 130803ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // and it should be in this case, no harm to allow a release() 130903ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber // if we're already uninitialized. 1310aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // Similarly stopping a stopped MediaCodec should be benign. 1311c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> response = new AMessage; 131203ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber response->setInt32( 131303ddaec84b65157af1dbf022a72de778dc59a63eAndreas Huber "err", 1314aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mState == targetState ? OK : INVALID_OPERATION); 1315c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1316c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber response->postReply(replyID); 1317c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 1318c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 1319c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 1320aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber if (mFlags & kFlagSawMediaServerDie) { 1321aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // It's dead, Jim. Don't expect initiateShutdown to yield 1322aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // any useful results now... 1323aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(UNINITIALIZED); 1324aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber (new AMessage)->postReply(replyID); 1325aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber break; 1326aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber } 1327aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1328c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mReplyID = replyID; 1329aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber setState(msg->what() == kWhatStop ? STOPPING : RELEASING); 1330aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1331aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mCodec->initiateShutdown( 1332aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber msg->what() == kWhatStop /* keepComponentAllocated */); 1333c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 13345778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 13355778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13385778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputBuffer: 13395778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13405778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 13415778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 13425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1343c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 1344c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang ALOGE("dequeueOutputBuffer can't be used in async mode"); 1345c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 1346c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang break; 1347c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1348c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 13496507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (mHaveInputSurface) { 13506507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden ALOGE("dequeueInputBuffer can't be used with input surface"); 1351c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 13526507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden break; 13536507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 13546507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 13555778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueInputBuffer(replyID, true /* new request */)) { 13565778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13595778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 13605778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 13615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13625778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 1363c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, -EAGAIN); 13645778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueInputPending; 13685778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = replyID; 13695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 13715778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 13725778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueInputTimedOut, id()); 13735778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 13745778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueInputTimeoutGeneration); 13755778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 13765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13775778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13805778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueInputTimedOut: 13815778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 13825778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 13835778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 13845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueInputTimeoutGeneration) { 13865778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 13875778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13905778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueInputPending); 13915778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1392c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mDequeueInputReplyID, -EAGAIN); 13935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13945778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueInputPending; 13955778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueInputReplyID = 0; 13965778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 13975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 13985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 13995778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatQueueInputBuffer: 14005778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 14015778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 14025778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 14035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14040e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting() || (mFlags & kFlagStickyError)) { 1405c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 14065778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14095778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onQueueInputBuffer(msg); 14105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1411c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, err); 14125778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14155778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputBuffer: 14165778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 14175778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 14185778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 14195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1420c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mFlags & kFlagIsAsync) { 1421c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang ALOGE("dequeueOutputBuffer can't be used in async mode"); 1422c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 1423c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang break; 1424c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 1425c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 14265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (handleDequeueOutputBuffer(replyID, true /* new request */)) { 14275778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14305778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeoutUs; 14315778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeoutUs", &timeoutUs)); 14325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs == 0ll) { 1434c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, -EAGAIN); 14355778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags |= kFlagDequeueOutputPending; 14395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = replyID; 14405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (timeoutUs > 0ll) { 14425778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> timeoutMsg = 14435778822d86b0337407514b9372562b86edfa91cdAndreas Huber new AMessage(kWhatDequeueOutputTimedOut, id()); 14445778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->setInt32( 14455778822d86b0337407514b9372562b86edfa91cdAndreas Huber "generation", ++mDequeueOutputTimeoutGeneration); 14465778822d86b0337407514b9372562b86edfa91cdAndreas Huber timeoutMsg->post(timeoutUs); 14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14485778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatDequeueOutputTimedOut: 14525778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 14535778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t generation; 14545778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("generation", &generation)); 14555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (generation != mDequeueOutputTimeoutGeneration) { 14575778822d86b0337407514b9372562b86edfa91cdAndreas Huber // Obsolete 14585778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14615778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mFlags & kFlagDequeueOutputPending); 14625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1463c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(mDequeueOutputReplyID, -EAGAIN); 14645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14655778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagDequeueOutputPending; 14665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDequeueOutputReplyID = 0; 14675778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14705778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatReleaseOutputBuffer: 14715778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 14725778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 14735778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 14745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14750e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting() || (mFlags & kFlagStickyError)) { 1476c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 14775778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14785778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14795778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14805778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = onReleaseOutputBuffer(msg); 14815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1482c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, err); 14835778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 14845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 14867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case kWhatSignalEndOfInputStream: 14877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 14887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden uint32_t replyID; 14897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden CHECK(msg->senderAwaitsResponse(&replyID)); 14907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 14910e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting() || (mFlags & kFlagStickyError)) { 1492c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 14937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 14947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 14957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 14967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mReplyID = replyID; 14977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalEndOfInputStream(); 14987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 14997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 15007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 15015778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetBuffers: 15025778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 15035778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 15045778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 15055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15060e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting() || (mFlags & kFlagIsAsync) 15070e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar || (mFlags & kFlagStickyError)) { 1508c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 15095778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 15105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15125778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex; 15135778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("portIndex", &portIndex)); 15145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15155778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<sp<ABuffer> > *dstBuffers; 15165778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findPointer("buffers", (void **)&dstBuffers)); 15175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15185778822d86b0337407514b9372562b86edfa91cdAndreas Huber dstBuffers->clear(); 15195778822d86b0337407514b9372562b86edfa91cdAndreas Huber const Vector<BufferInfo> &srcBuffers = mPortBuffers[portIndex]; 15205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15215778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < srcBuffers.size(); ++i) { 15225778822d86b0337407514b9372562b86edfa91cdAndreas Huber const BufferInfo &info = srcBuffers.itemAt(i); 15235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1524ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber dstBuffers->push_back( 15251bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (portIndex == kPortIndexInput && mCrypto != NULL) 1526ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? info.mEncryptedData : info.mData); 15275778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15285778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber (new AMessage)->postReply(replyID); 15305778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 15315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15335778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatFlush: 15345778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 15355778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 15365778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 15375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15380e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting() || (mFlags & kFlagStickyError)) { 1539c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 15405778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 15415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mReplyID = replyID; 15440e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar // TODO: skip flushing if already FLUSHED 15455778822d86b0337407514b9372562b86edfa91cdAndreas Huber setState(FLUSHING); 15465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15475778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->signalFlush(); 15485778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodec(); 15495778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 15505778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1552e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case kWhatGetInputFormat: 15535778822d86b0337407514b9372562b86edfa91cdAndreas Huber case kWhatGetOutputFormat: 15545778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 1555e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> format = 1556e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (msg->what() == kWhatGetOutputFormat ? mOutputFormat : mInputFormat); 1557e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 15585778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t replyID; 15595778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 15605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1561e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if ((mState != CONFIGURED && mState != STARTING && 15620e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar mState != STARTED && mState != FLUSHING && 15630e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar mState != FLUSHED) 1564972f2321583ef4094477271e0fc6a1d05a1a0eeaMartin Storsjo || (mFlags & kFlagStickyError) 1565e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar || format == NULL) { 1566c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 15675778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 15685778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 15705778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> response = new AMessage; 1571e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar response->setMessage("format", format); 15725778822d86b0337407514b9372562b86edfa91cdAndreas Huber response->postReply(replyID); 15735778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 15745778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 15755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1576496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 1577496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 1578496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mCodec->signalRequestIDRFrame(); 1579496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 1580496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 1581496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 1582575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber case kWhatRequestActivityNotification: 1583575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber { 1584575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(mActivityNotify == NULL); 1585575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber CHECK(msg->findMessage("notify", &mActivityNotify)); 1586575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1587575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber postActivityNotificationIfPossible(); 1588575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber break; 1589575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 1590575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1591717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo case kWhatGetName: 1592717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo { 1593717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo uint32_t replyID; 1594717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo CHECK(msg->senderAwaitsResponse(&replyID)); 1595717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1596717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (mComponentName.empty()) { 1597c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, INVALID_OPERATION); 1598717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1599717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1600717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1601717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo sp<AMessage> response = new AMessage; 1602717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->setString("name", mComponentName.c_str()); 1603717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo response->postReply(replyID); 1604717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo break; 1605717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1606717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 1607a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 1608a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 1609a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber uint32_t replyID; 1610a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->senderAwaitsResponse(&replyID)); 1611a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1612a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 1613a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 1614a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1615a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = onSetParameters(params); 1616a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 1617c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang PostReplyWithError(replyID, err); 1618a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 1619a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 1620a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 16215778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 16225778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 16235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16245778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 16255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16268ee516a515c70a492c395b67ce12e19e7d159804Andreas Hubervoid MediaCodec::extractCSD(const sp<AMessage> &format) { 16278ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.clear(); 16288ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16298ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber size_t i = 0; 16308ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber for (;;) { 16318ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd; 16328ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (!format->findBuffer(StringPrintf("csd-%u", i).c_str(), &csd)) { 16338ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber break; 16348ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 16358ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16368ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.push_back(csd); 16378ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber ++i; 16388ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 16398ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 1640a5750e0dad9e90f2195ce36f2c4457fa04b2b83eMark Salyzyn ALOGV("Found %zu pieces of codec specific data.", mCSD.size()); 16418ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 16428ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16438ee516a515c70a492c395b67ce12e19e7d159804Andreas Huberstatus_t MediaCodec::queueCSDInputBuffer(size_t bufferIndex) { 16448ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber CHECK(!mCSD.empty()); 16458ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16467bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar const BufferInfo *info = 16477bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar &mPortBuffers[kPortIndexInput].itemAt(bufferIndex); 16488ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16498ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<ABuffer> csd = *mCSD.begin(); 16508ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber mCSD.erase(mCSD.begin()); 16518ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16528ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber const sp<ABuffer> &codecInputData = 16538ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber (mCrypto != NULL) ? info->mEncryptedData : info->mData; 16548ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16558ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber if (csd->size() > codecInputData->capacity()) { 16568ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return -EINVAL; 16578ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber } 16588ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16598ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber memcpy(codecInputData->data(), csd->data(), csd->size()); 16608ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16618ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber AString errorDetailMsg; 16628ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16638ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber sp<AMessage> msg = new AMessage(kWhatQueueInputBuffer, id()); 16648ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("index", bufferIndex); 16658ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("offset", 0); 16668ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setSize("size", csd->size()); 16678ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt64("timeUs", 0ll); 16688ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setInt32("flags", BUFFER_FLAG_CODECCONFIG); 16698ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber msg->setPointer("errorDetailMsg", &errorDetailMsg); 16708ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16718ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber return onQueueInputBuffer(msg); 16728ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber} 16738ee516a515c70a492c395b67ce12e19e7d159804Andreas Huber 16745778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::setState(State newState) { 16757541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (newState == INITIALIZED || newState == UNINITIALIZED) { 16765778822d86b0337407514b9372562b86edfa91cdAndreas Huber delete mSoftRenderer; 16775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer = NULL; 16785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16791bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mCrypto.clear(); 16807541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber setNativeWindow(NULL); 16815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1682671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar mInputFormat.clear(); 16835778822d86b0337407514b9372562b86edfa91cdAndreas Huber mOutputFormat.clear(); 16845778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputFormatChanged; 16855778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagOutputBuffersChanged; 16865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mFlags &= ~kFlagStickyError; 1687e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagIsEncoder; 1688e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mFlags &= ~kFlagGatherCodecSpecificData; 1689c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mFlags &= ~kFlagIsAsync; 1690575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 1691575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 1692c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mCallback.clear(); 16935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1695717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo if (newState == UNINITIALIZED) { 1696671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar // return any straggling buffers, e.g. if we got here on an error 1697671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar returnBuffersToCodec(); 1698671160ffe81592efa376dc1ff0fc3f4ddcdebc35Lajos Molnar 1699717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo mComponentName.clear(); 1700aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber 1701aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // The component is gone, mediaserver's probably back up already 1702aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // but should definitely be back up should we try to instantiate 1703aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber // another component.. and the cycle continues. 1704aa7f97bb9c70176245ffb7ed0ce52bee6c1a57d7Andreas Huber mFlags &= ~kFlagSawMediaServerDie; 1705717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo } 1706717fd3d4328abf524978ce9c125ab8ae8d6bffadMartin Storsjo 17075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mState = newState; 17085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17095778822d86b0337407514b9372562b86edfa91cdAndreas Huber cancelPendingDequeueOperations(); 17102606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 17112606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang updateBatteryStat(); 17125778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17145778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodec() { 17155778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexInput); 17165778822d86b0337407514b9372562b86edfa91cdAndreas Huber returnBuffersToCodecOnPort(kPortIndexOutput); 17175778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17195778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex) { 17205778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 17217bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 17225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17235778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 17245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17255778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 17265778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 17275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify != NULL) { 17295778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> msg = info->mNotify; 17305778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 17315778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mOwnedByClient = false; 17325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17335778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (portIndex == kPortIndexInput) { 17347fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* no error, just returning buffers */ 17357fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar msg->setInt32("err", OK); 17365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17375778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 17385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17415778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].clear(); 17425778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17445778822d86b0337407514b9372562b86edfa91cdAndreas Hubersize_t MediaCodec::updateBuffers( 17455778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t portIndex, const sp<AMessage> &msg) { 17465778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 17475778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1748609b815a3131d22da38b2f452faa9f89daad4039Andy Hung uint32_t bufferID; 1749609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 17505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17515778822d86b0337407514b9372562b86edfa91cdAndreas Huber Vector<BufferInfo> *buffers = &mPortBuffers[portIndex]; 17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < buffers->size(); ++i) { 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &buffers->editItemAt(i); 17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mBufferID == bufferID) { 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(info->mNotify == NULL); 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findMessage("reply", &info->mNotify)); 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber mAvailPortBuffers[portIndex].push_back(i); 17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber return i; 17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber TRESPASS(); 17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 17695778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17715778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onQueueInputBuffer(const sp<AMessage> &msg) { 17725778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 17735778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t offset; 17745778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t size; 17755778822d86b0337407514b9372562b86edfa91cdAndreas Huber int64_t timeUs; 17765778822d86b0337407514b9372562b86edfa91cdAndreas Huber uint32_t flags; 17775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 17785778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("offset", &offset)); 17795778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt64("timeUs", &timeUs)); 17805778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findInt32("flags", (int32_t *)&flags)); 17815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17824b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const CryptoPlugin::SubSample *subSamples; 17834b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size_t numSubSamples; 17844b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *key; 17854b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber const uint8_t *iv; 17864b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::Mode mode = CryptoPlugin::kMode_Unencrypted; 17874b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17884b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // We allow the simpler queueInputBuffer API to be used even in 17894b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber // secure mode, by fabricating a single unencrypted subSample. 17904b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CryptoPlugin::SubSample ss; 17914b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17924b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (msg->findSize("size", &size)) { 17934b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto != NULL) { 17944b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfClearData = size; 17954b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber ss.mNumBytesOfEncryptedData = 0; 17964b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 17974b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples = &ss; 17984b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples = 1; 17994b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber key = NULL; 18004b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber iv = NULL; 18014b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 18024b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } else { 18034b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber if (mCrypto == NULL) { 18044b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber return -EINVAL; 18054b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 18064b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 18074b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("subSamples", (void **)&subSamples)); 18084b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findSize("numSubSamples", &numSubSamples)); 18094b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("key", (void **)&key)); 18104b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findPointer("iv", (void **)&iv)); 18114b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 18124b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber int32_t tmp; 18134b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber CHECK(msg->findInt32("mode", &tmp)); 18144b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 18154b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber mode = (CryptoPlugin::Mode)tmp; 18164b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 18174b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size = 0; 18184b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber for (size_t i = 0; i < numSubSamples; ++i) { 18194b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfClearData; 18204b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber size += subSamples[i].mNumBytesOfEncryptedData; 18214b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 18224b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber } 18234b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber 18245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexInput].size()) { 18255778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 18265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18275778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18285778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexInput].editItemAt(index); 18295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 18315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 18325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18345778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (offset + size > info->mData->capacity()) { 18355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 18365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18385778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> reply = info->mNotify; 18395778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->setRange(offset, size); 18405778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 18415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18425778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_EOS) { 18435778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("eos", true); 18445778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18465778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (flags & BUFFER_FLAG_CODECCONFIG) { 18475778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt32("csd", true); 18485778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18495778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18501bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (mCrypto != NULL) { 18511bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber if (size > info->mEncryptedData->capacity()) { 18521bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber return -ERANGE; 1853ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1854ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 18555b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber AString *errorDetailMsg; 18565b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber CHECK(msg->findPointer("errorDetailMsg", (void **)&errorDetailMsg)); 18575b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 1858fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong ssize_t result = mCrypto->decrypt( 18591bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber (mFlags & kFlagIsSecure) != 0, 18601bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber key, 18611bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber iv, 18621bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber mode, 18631bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber info->mEncryptedData->base() + offset, 18644b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber subSamples, 18654b75a9c8b93a90749bc5d22912ad0d96c12f4ecfAndreas Huber numSubSamples, 18665b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mData->base(), 18675b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber errorDetailMsg); 18681bd139a2a68690e80398b70b27ca59550fea0e65Andreas Huber 1869fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong if (result < 0) { 1870fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong return result; 1871ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1872ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1873fa2b8f243eb048fb2b8e5a14356190f69eb31a36Edwin Wong info->mData->setRange(0, result); 1874ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1875ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 18767bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // synchronization boundary for getBufferAndFormat 18777bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 18787bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 18797bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = false; 18807bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 18812d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber reply->setBuffer("buffer", info->mData); 18825778822d86b0337407514b9372562b86edfa91cdAndreas Huber reply->post(); 18835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18845b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber info->mNotify = NULL; 18855b8987e7de9d04b09153f329c680d2316cdb44ecAndreas Huber 18865778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 18875778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 18885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18895778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t MediaCodec::onReleaseOutputBuffer(const sp<AMessage> &msg) { 18905778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index; 18915778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findSize("index", &index)); 18925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18935778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t render; 18945778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("render", &render)) { 18955778822d86b0337407514b9372562b86edfa91cdAndreas Huber render = 0; 18965778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18980e8cfc36044ba97545e7c9e129b0b3e98eec5089Lajos Molnar if (!isExecuting()) { 18995778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EINVAL; 19005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (index >= mPortBuffers[kPortIndexOutput].size()) { 19035778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -ERANGE; 19045778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19065778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[kPortIndexOutput].editItemAt(index); 19075778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19085778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (info->mNotify == NULL || !info->mOwnedByClient) { 19095778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EACCES; 19105778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19127bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar // synchronization boundary for getBufferAndFormat 19137bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 19147bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 19157bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = false; 19167bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 19177bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar 191879ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou if (render && info->mData != NULL && info->mData->size() != 0) { 19195778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->setInt32("render", true); 19205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1921fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 1922fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (msg->findInt64("timestampNs", ×tampNs)) { 1923fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mNotify->setInt64("timestampNs", timestampNs); 1924fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } else { 1925fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 1926fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 1927fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 1928fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 1929fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 1930fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 193147aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 1932fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 1933fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1934fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 1935fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 1936fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 19375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mSoftRenderer != NULL) { 19385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSoftRenderer->render( 1939fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar info->mData->data(), info->mData->size(), timestampNs, NULL); 19405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19425778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19435778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify->post(); 19445778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mNotify = NULL; 19455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19465778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 19475778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 19485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19495778822d86b0337407514b9372562b86edfa91cdAndreas Huberssize_t MediaCodec::dequeuePortBuffer(int32_t portIndex) { 19505778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 19515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19525778822d86b0337407514b9372562b86edfa91cdAndreas Huber List<size_t> *availBuffers = &mAvailPortBuffers[portIndex]; 19535778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19545778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (availBuffers->empty()) { 19555778822d86b0337407514b9372562b86edfa91cdAndreas Huber return -EAGAIN; 19565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 19575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19585778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t index = *availBuffers->begin(); 19595778822d86b0337407514b9372562b86edfa91cdAndreas Huber availBuffers->erase(availBuffers->begin()); 19605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19615778822d86b0337407514b9372562b86edfa91cdAndreas Huber BufferInfo *info = &mPortBuffers[portIndex].editItemAt(index); 19625778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!info->mOwnedByClient); 19637bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar { 19647bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar Mutex::Autolock al(mBufferLock); 19657bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mFormat = portIndex == kPortIndexInput ? mInputFormat : mOutputFormat; 19667bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar info->mOwnedByClient = true; 196703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 196803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // set image-data 196903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (info->mFormat != NULL) { 197003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar sp<ABuffer> imageData; 197103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (info->mFormat->findBuffer("image-data", &imageData)) { 197203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar info->mData->meta()->setBuffer("image-data", imageData); 197303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 197403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar int32_t left, top, right, bottom; 197503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (info->mFormat->findRect("crop", &left, &top, &right, &bottom)) { 197603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar info->mData->meta()->setRect("crop-rect", left, top, right, bottom); 197703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 197803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 19797bad72237b49ac47e77ffe2a89fd26f3d171324cLajos Molnar } 19805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19815778822d86b0337407514b9372562b86edfa91cdAndreas Huber return index; 19825778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 19835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 19847541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huberstatus_t MediaCodec::setNativeWindow( 19851a2952aee048ca7b1765e2bc09ebe9aeddaeafa3Mathias Agopian const sp<Surface> &surfaceTextureClient) { 19867541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber status_t err; 19877541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 19887541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (mNativeWindow != NULL) { 19897541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_disconnect( 19907541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_API_MEDIA); 19917541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 19927541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 19937541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGW("native_window_api_disconnect returned an error: %s (%d)", 19947541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 19957541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 19967541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 19977541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow.clear(); 19987541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 19997541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 20007541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (surfaceTextureClient != NULL) { 20017541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber err = native_window_api_connect( 20027541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber surfaceTextureClient.get(), NATIVE_WINDOW_API_MEDIA); 20037541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 20047541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber if (err != OK) { 20057541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber ALOGE("native_window_api_connect returned an error: %s (%d)", 20067541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber strerror(-err), err); 20077541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 20087541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return err; 20097541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 20107541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 20117541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber mNativeWindow = surfaceTextureClient; 20127541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber } 20137541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 20147541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber return OK; 20157541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber} 20167541ff5d83a3e77cb533841a0326a241550b95d9Andreas Huber 2017c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangvoid MediaCodec::onInputBufferAvailable() { 2018c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int32_t index; 2019c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang while ((index = dequeuePortBuffer(kPortIndexInput)) >= 0) { 2020c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = mCallback->dup(); 2021c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("callbackID", CB_INPUT_AVAILABLE); 2022c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("index", index); 2023c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->post(); 2024c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 2025c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 2026c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2027c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangvoid MediaCodec::onOutputBufferAvailable() { 2028c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int32_t index; 2029c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang while ((index = dequeuePortBuffer(kPortIndexOutput)) >= 0) { 2030c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang const sp<ABuffer> &buffer = 2031c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang mPortBuffers[kPortIndexOutput].itemAt(index).mData; 2032c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = mCallback->dup(); 2033c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("callbackID", CB_OUTPUT_AVAILABLE); 2034c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("index", index); 2035c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setSize("offset", buffer->offset()); 2036c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setSize("size", buffer->size()); 2037c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2038c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int64_t timeUs; 2039c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 2040c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2041c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt64("timeUs", timeUs); 2042c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2043c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang int32_t omxFlags; 2044c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang CHECK(buffer->meta()->findInt32("omxFlags", &omxFlags)); 2045c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2046c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang uint32_t flags = 0; 2047c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (omxFlags & OMX_BUFFERFLAG_SYNCFRAME) { 2048c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang flags |= BUFFER_FLAG_SYNCFRAME; 2049c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 2050c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (omxFlags & OMX_BUFFERFLAG_CODECCONFIG) { 2051c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang flags |= BUFFER_FLAG_CODECCONFIG; 2052c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 2053c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (omxFlags & OMX_BUFFERFLAG_EOS) { 2054c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang flags |= BUFFER_FLAG_EOS; 2055c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 2056c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2057c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("flags", flags); 2058c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2059c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->post(); 2060c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 2061c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 2062c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2063749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhangvoid MediaCodec::onError(status_t err, int32_t actionCode, const char *detail) { 2064c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mCallback != NULL) { 2065c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = mCallback->dup(); 2066c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("callbackID", CB_ERROR); 2067c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("err", err); 2068749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang msg->setInt32("actionCode", actionCode); 2069749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang 2070749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang if (detail != NULL) { 2071749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang msg->setString("detail", detail); 2072749dafad09d85f2aaf6902a7ff16b4087e3bc4c7Chong Zhang } 2073c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2074c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->post(); 2075c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 2076c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 2077c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2078c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhangvoid MediaCodec::onOutputFormatChanged() { 2079c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang if (mCallback != NULL) { 2080c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang sp<AMessage> msg = mCallback->dup(); 2081c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setInt32("callbackID", CB_OUTPUT_FORMAT_CHANGED); 2082c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->setMessage("format", mOutputFormat); 2083c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang msg->post(); 2084c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang } 2085c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang} 2086c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2087c5619c7a6dcc1137fde7520351ad5284e3e958abChong Zhang 2088575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Hubervoid MediaCodec::postActivityNotificationIfPossible() { 2089575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if (mActivityNotify == NULL) { 2090575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber return; 2091575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 2092575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 2093575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber if ((mFlags & (kFlagStickyError 2094575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputBuffersChanged 2095575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber | kFlagOutputFormatChanged)) 2096575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexInput].empty() 2097575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber || !mAvailPortBuffers[kPortIndexOutput].empty()) { 2098575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify->post(); 2099575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber mActivityNotify.clear(); 2100575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber } 2101575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber} 2102575a5361fc970476cd7979638ee3ac00cc6e5024Andreas Huber 2103a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::setParameters(const sp<AMessage> ¶ms) { 2104a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> msg = new AMessage(kWhatSetParameters, id()); 2105a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 2106a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 2107a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> response; 2108a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return PostAndAwaitResponse(msg, &response); 2109a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 2110a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 2111a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t MediaCodec::onSetParameters(const sp<AMessage> ¶ms) { 2112a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mCodec->signalSetParameters(params); 2113a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 2114a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 2115a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 2116a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 2117e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatus_t MediaCodec::amendOutputFormatWithCodecSpecificData( 2118e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const sp<ABuffer> &buffer) { 2119e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber AString mime; 2120e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(mOutputFormat->findString("mime", &mime)); 2121e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2122e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime.c_str(), MEDIA_MIMETYPE_VIDEO_AVC)) { 2123e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // Codec specific data should be SPS and PPS in a single buffer, 2124e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // each prefixed by a startcode (0x00 0x00 0x00 0x01). 2125e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // We separate the two and put them into the output format 2126e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // under the keys "csd-0" and "csd-1". 2127e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2128e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber unsigned csdIndex = 0; 2129e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2130e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *data = buffer->data(); 2131e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t size = buffer->size(); 2132e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2133e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const uint8_t *nalStart; 2134e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber size_t nalSize; 2135e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber while (getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { 2136e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber sp<ABuffer> csd = new ABuffer(nalSize + 4); 2137e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data(), "\x00\x00\x00\x01", 4); 2138e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber memcpy(csd->data() + 4, nalStart, nalSize); 2139e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2140e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer( 2141e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber StringPrintf("csd-%u", csdIndex).c_str(), csd); 2142e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2143e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++csdIndex; 2144e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2145e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2146e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (csdIndex != 2) { 2147e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_MALFORMED; 2148e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2149e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 2150e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // For everything else we just stash the codec specific data into 2151e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber // the output format as a single piece of csd under "csd-0". 2152e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mOutputFormat->setBuffer("csd-0", buffer); 2153e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2154e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2155e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2156e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 2157e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 21582606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhangvoid MediaCodec::updateBatteryStat() { 21592606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mState == CONFIGURED && !mBatteryStatNotified) { 21602606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang AString mime; 21612606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang CHECK(mOutputFormat != NULL && 21622606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mOutputFormat->findString("mime", &mime)); 21632606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 21642606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mIsVideo = mime.startsWithIgnoreCase("video/"); 21652606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 21662606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang BatteryNotifier& notifier(BatteryNotifier::getInstance()); 21672606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 21682606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mIsVideo) { 21692606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang notifier.noteStartVideo(); 21702606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } else { 21712606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang notifier.noteStartAudio(); 21722606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 21732606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 21742606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBatteryStatNotified = true; 21752606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } else if (mState == UNINITIALIZED && mBatteryStatNotified) { 21762606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang BatteryNotifier& notifier(BatteryNotifier::getInstance()); 21772606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 21782606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang if (mIsVideo) { 21792606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang notifier.noteStopVideo(); 21802606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } else { 21812606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang notifier.noteStopAudio(); 21822606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 21832606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 21842606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang mBatteryStatNotified = false; 21852606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang } 21862606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang} 21872606b10d51c2dceb851a2ea63e803aba4134bf00Chong Zhang 21885778822d86b0337407514b9372562b86edfa91cdAndreas Huber} // namespace android 2189