ACodec.cpp revision 52e88b2986536e83a7a6da63461556b8734a85f3
127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/* 227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2010 The Android Open Source Project 327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License. 627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at 727c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 827c174483a8ae9688d5d4897c19074f62c7f1701James Dong * http://www.apache.org/licenses/LICENSE-2.0 927c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software 1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and 1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License. 1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */ 1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong 17f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//#define LOG_NDEBUG 0 18f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#define LOG_TAG "ACodec" 19f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__ 21f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS 22f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif 23f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung 24609b815a3131d22da38b2f452faa9f89daad4039Andy Hung#include <inttypes.h> 256fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar#include <utils/Trace.h> 266fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar 27f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/ACodec.h> 28f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 29f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <binder/MemoryDealer.h> 30f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 31f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/hexdump.h> 32f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ABuffer.h> 33f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/ADebug.h> 34f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/foundation/AMessage.h> 35a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar#include <media/stagefright/foundation/AUtils.h> 36f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden#include <media/stagefright/BufferProducerWrapper.h> 38afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/MediaCodecList.h> 39f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/MediaDefs.h> 401173118eace0e9e347cb007f0da817cee87579edGlenn Kasten#include <media/stagefright/NativeWindowWrapper.h> 41f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <media/stagefright/OMXClient.h> 421065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber#include <media/stagefright/OMXCodec.h> 43f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 443a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber#include <media/hardware/HardwareAPI.h> 453a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 4697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_AudioExt.h> 474154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev#include <OMX_VideoExt.h> 48f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#include <OMX_Component.h> 4997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu#include <OMX_IndexExt.h> 50f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 51496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#include "include/avc_utils.h" 52496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 53f933441648ef6a71dee783d733aac17b9508b452Andreas Hubernamespace android { 54f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 55251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// OMX errors are directly mapped into status_t range if 56251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// there is no corresponding MediaError status code. 57251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Use the statusFromOMXError(int32_t omxError) function. 58251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 59251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Currently this is a direct map. 60251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// See frameworks/native/include/media/openmax/OMX_Core.h 61251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 62251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Vendor OMX errors from 0x90000000 - 0x9000FFFF 63251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Extension OMX errors from 0x8F000000 - 0x90000000 64251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// Standard OMX errors from 0x80001000 - 0x80001024 (0x80001024 current) 65251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// 66251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 67251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// returns true if err is a recognized OMX error code. 68251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// as OMX error is OMX_S32, this is an int32_t type 69251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline bool isOMXError(int32_t err) { 70251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return (ERROR_CODEC_MIN <= err && err <= ERROR_CODEC_MAX); 71251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 72251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 73251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// converts an OMX error to a status_t 74251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t statusFromOMXError(int32_t omxError) { 75251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (omxError) { 76251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorInvalidComponentName: 77251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case OMX_ErrorComponentNotFound: 78251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return NAME_NOT_FOUND; // can trigger illegal argument error for provided names. 79251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 80251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return isOMXError(omxError) ? omxError : 0; // no translation required 81251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 82251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 83251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 84251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung// checks and converts status_t to a non-side-effect status_t 85251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hungstatic inline status_t makeNoSideEffectStatus(status_t err) { 86251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung switch (err) { 87251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // the following errors have side effects and may come 88251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // from other code modules. Remap for safety reasons. 89251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case INVALID_OPERATION: 90251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung case DEAD_OBJECT: 91251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return UNKNOWN_ERROR; 92251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung default: 93251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung return err; 94251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 95251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung} 96251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 97f933441648ef6a71dee783d733aac17b9508b452Andreas Hubertemplate<class T> 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatic void InitOMXParams(T *params) { 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nSize = sizeof(T); 100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMajor = 1; 101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nVersionMinor = 0; 102f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nRevision = 0; 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huber params->nVersion.s.nStep = 0; 104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 106f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct CodecObserver : public BnOMXObserver { 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CodecObserver() {} 108f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void setNotificationMessage(const sp<AMessage> &msg) { 110f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 111f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // from IOMXObserver 114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onMessage(const omx_message &omx_msg) { 115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> msg = mNotify->dup(); 116f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 117f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("type", omx_msg.type); 118609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", omx_msg.node); 119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (omx_msg.type) { 121f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("event", omx_msg.u.event_data.event); 124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data1", omx_msg.u.event_data.data1); 125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32("data2", omx_msg.u.event_data.data2); 126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 131609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("buffer", omx_msg.u.buffer_data.buffer); 132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 137609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32( 138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "buffer", omx_msg.u.extended_buffer_data.buffer); 139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_offset", 141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_offset); 142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "range_length", 144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.range_length); 145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt32( 146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "flags", 147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.flags); 148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setInt64( 149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "timestamp", 150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber omx_msg.u.extended_buffer_data.timestamp); 151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 158f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 160f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 161f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 162f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual ~CodecObserver() {} 164f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 165f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> mNotify; 167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 168f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(CodecObserver); 169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 173f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::BaseState : public AState { 174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState(ACodec *codec, const sp<AState> &parentState = NULL); 175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 176f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber enum PortMode { 178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber KEEP_BUFFERS, 179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber RESUBMIT_BUFFERS, 180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FREE_BUFFERS, 181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *mCodec; 184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void postFillThisBuffer(BufferInfo *info); 195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 196f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXMessage(const sp<AMessage> &msg); 198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXEmptyBufferDone(IOMX::buffer_id bufferID); 200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool onOMXFillBufferDone( 202f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 203f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 204f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 205784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs); 206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void getMoreInputDataIfPossible(); 208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(BaseState); 210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 214ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberstruct ACodec::DeathNotifier : public IBinder::DeathRecipient { 215ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DeathNotifier(const sp<AMessage> ¬ify) 216ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber : mNotify(notify) { 217ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 218ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 219ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual void binderDied(const wp<IBinder> &) { 220ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mNotify->post(); 221ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 222ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 223ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprotected: 224ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber virtual ~DeathNotifier() {} 225ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 226ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huberprivate: 227ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<AMessage> mNotify; 228ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 229ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(DeathNotifier); 230ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber}; 231ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 232f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::UninitializedState : public ACodec::BaseState { 233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber UninitializedState(ACodec *codec); 234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 235f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 237c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 239f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void onSetup(const sp<AMessage> &msg); 241c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onAllocateComponent(const sp<AMessage> &msg); 242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 243ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber sp<DeathNotifier> mDeathNotifier; 244ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(UninitializedState); 246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 250c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberstruct ACodec::LoadedState : public ACodec::BaseState { 251c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber LoadedState(ACodec *codec); 252c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 253c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprotected: 254c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 255c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber virtual void stateEntered(); 256c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 257c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberprivate: 258c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber friend struct ACodec::UninitializedState; 259c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 260c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool onConfigureComponent(const sp<AMessage> &msg); 2617cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden void onCreateInputSurface(const sp<AMessage> &msg); 262c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onStart(); 263c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber void onShutdown(bool keepComponentAllocated); 264c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 265c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedState); 266c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber}; 267c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 268c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 269c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 270f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::LoadedToIdleState : public ACodec::BaseState { 271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber LoadedToIdleState(ACodec *codec); 272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 273f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 278f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t allocateBuffers(); 280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LoadedToIdleState); 282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 286f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToExecutingState : public ACodec::BaseState { 287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToExecutingState(ACodec *codec); 288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 289f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 294f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToExecutingState); 296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 300f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingState : public ACodec::BaseState { 301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingState(ACodec *codec); 302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 303054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitRegularOutputBuffers(); 304054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar void submitOutputMetaBuffers(); 305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void submitOutputBuffers(); 306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Submit output buffers to the decoder, submit input buffers to client 308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to fill with data. 309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void resume(); 310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 311349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // Returns true iff input and output buffers are in play. 312349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool active() const { return mActive; } 313349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 314f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 321f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 322349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber bool mActive; 323349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingState); 325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 326f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 327f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 329f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::OutputPortSettingsChangedState : public ACodec::BaseState { 330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OutputPortSettingsChangedState(ACodec *codec); 331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 332f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual PortMode getPortMode(OMX_U32 portIndex); 334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 338f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 339f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(OutputPortSettingsChangedState); 341f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 342f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 343f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 344f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 345f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::ExecutingToIdleState : public ACodec::BaseState { 346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ExecutingToIdleState(ACodec *codec); 347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 348f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 352f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 357f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3605778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool mComponentNowIdle; 3615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ExecutingToIdleState); 363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 367f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::IdleToLoadedState : public ACodec::BaseState { 368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IdleToLoadedState(ACodec *codec); 369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 370f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 376f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(IdleToLoadedState); 378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 382f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstruct ACodec::FlushingState : public ACodec::BaseState { 383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber FlushingState(ACodec *codec); 384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 385f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprotected: 386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onMessageReceived(const sp<AMessage> &msg); 387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void stateEntered(); 388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual bool onOMXEvent(OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2); 390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onOutputBufferDrained(const sp<AMessage> &msg); 392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber virtual void onInputBufferFilled(const sp<AMessage> &msg); 393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 394f933441648ef6a71dee783d733aac17b9508b452Andreas Huberprivate: 395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool mFlushComplete[2]; 396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber void changeStateIfWeOwnAllBuffers(); 398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 399f933441648ef6a71dee783d733aac17b9508b452Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(FlushingState); 400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}; 401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 404f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ACodec() 405afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : mQuirks(0), 406609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mNode(0), 4075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mSentFormat(false), 408c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mIsEncoder(false), 409308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput(false), 4109806555d3930be43e11106281dee354820ac1c88Andreas Huber mShutdownInProgress(false), 41154b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mExplicitShutdown(false), 4129806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderDelay(0), 4139806555d3930be43e11106281dee354820ac1c88Andreas Huber mEncoderPadding(0), 414e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees(0), 4159806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent(false), 416054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mChannelMask(0), 417054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter(0), 418054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers(false), 419a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mMetaDataBuffersToSubmit(0), 42094ee4b708acfa941581160b267afb79192b1d816Chong Zhang mRepeatFrameDelayUs(-1ll), 4212c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs(-1ll), 42237b2b389139ed638831e49708c947863eef631efRonghua Wu mMaxFps(-1), 4232c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs(-1ll), 424609b815a3131d22da38b2f452faa9f89daad4039Andy Hung mTimePerCaptureUs(-1ll), 425ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mCreateInputBuffersSuspended(false), 426ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled(false) { 427f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mUninitializedState = new UninitializedState(this); 428c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mLoadedState = new LoadedState(this); 429f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mLoadedToIdleState = new LoadedToIdleState(this); 430f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToExecutingState = new IdleToExecutingState(this); 431f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingState = new ExecutingState(this); 432f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 433f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOutputPortSettingsChangedState = 434f933441648ef6a71dee783d733aac17b9508b452Andreas Huber new OutputPortSettingsChangedState(this); 435f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 436f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mExecutingToIdleState = new ExecutingToIdleState(this); 437f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mIdleToLoadedState = new IdleToLoadedState(this); 438f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushingState = new FlushingState(this); 439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mPortEOS[kPortIndexInput] = mPortEOS[kPortIndexOutput] = false; 441dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mInputEOSResult = OK; 442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 443f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeState(mUninitializedState); 444f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 445f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 446f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::~ACodec() { 447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 449f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::setNotificationMessage(const sp<AMessage> &msg) { 450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNotify = msg; 451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 453f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::initiateSetup(const sp<AMessage> &msg) { 454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->setWhat(kWhatSetup); 4551d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber msg->post(); 457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 459a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Hubervoid ACodec::signalSetParameters(const sp<AMessage> ¶ms) { 4601d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatSetParameters, this); 461a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->setMessage("params", params); 462a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber msg->post(); 463a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 464a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 4655778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateAllocateComponent(const sp<AMessage> &msg) { 4665778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatAllocateComponent); 4671d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 4685778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4695778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4715778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateConfigureComponent(const sp<AMessage> &msg) { 4725778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->setWhat(kWhatConfigureComponent); 4731d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar msg->setTarget(this); 4745778822d86b0337407514b9372562b86edfa91cdAndreas Huber msg->post(); 4755778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4777cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::initiateCreateInputSurface() { 4781d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatCreateInputSurface, this))->post(); 4797cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4807cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4817cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::signalEndOfInputStream() { 4821d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatSignalEndOfInputStream, this))->post(); 4837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 4847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4855778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::initiateStart() { 4861d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatStart, this))->post(); 4875778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 4885778822d86b0337407514b9372562b86edfa91cdAndreas Huber 489f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalFlush() { 4907a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] signalFlush", mComponentName.c_str()); 4911d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatFlush, this))->post(); 492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 494f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::signalResume() { 4951d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatResume, this))->post(); 496f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 498c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::initiateShutdown(bool keepComponentAllocated) { 4991d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatShutdown, this); 500c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->setInt32("keepComponentAllocated", keepComponentAllocated); 501c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber msg->post(); 50230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar if (!keepComponentAllocated) { 50330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // ensure shutdown completes in 3 seconds 5041d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatReleaseCodecInstance, this))->post(3000000); 50530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 508496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Hubervoid ACodec::signalRequestIDRFrame() { 5091d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatRequestIDRFrame, this))->post(); 510496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 511496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5124dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 5134dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// Some codecs may return input buffers before having them processed. 5144dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// This causes a halt if we already signaled an EOS on the input 5154dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// port. For now keep submitting an output buffer if there was an 5164dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar// EOS on the input port, but not yet on the output port. 5174dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnarvoid ACodec::signalSubmitOutputMetaDataBufferIfEOS_workaround() { 5184dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mPortEOS[kPortIndexInput] && !mPortEOS[kPortIndexOutput] && 5194dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mMetaDataBuffersToSubmit > 0) { 5201d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar (new AMessage(kWhatSubmitOutputMetaDataBufferIfEOS, this))->post(); 5214dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 5224dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar} 5234dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 524f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::allocateBuffersOnPort(OMX_U32 portIndex) { 525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(portIndex == kPortIndexInput || portIndex == kPortIndexOutput); 526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mDealer[portIndex] == NULL); 528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mBuffers[portIndex].isEmpty()); 529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5305778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 531f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL && portIndex == kPortIndexOutput) { 532054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mStoreMetaDataInOutputBuffers) { 533054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputMetaDataBuffers(); 534054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } else { 535054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = allocateOutputBuffersFromNativeWindow(); 536054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 5385778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 5395778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 5405778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = portIndex; 541f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5425778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 5435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 544f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5455778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err == OK) { 546609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers of size %u on %s port", 5475778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), 5485778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferCountActual, def.nBufferSize, 5495778822d86b0337407514b9372562b86edfa91cdAndreas Huber portIndex == kPortIndexInput ? "input" : "output"); 550f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5515778822d86b0337407514b9372562b86edfa91cdAndreas Huber size_t totalSize = def.nBufferCountActual * def.nBufferSize; 5525778822d86b0337407514b9372562b86edfa91cdAndreas Huber mDealer[portIndex] = new MemoryDealer(totalSize, "ACodec"); 553f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5545778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 i = 0; i < def.nBufferCountActual; ++i) { 5555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<IMemory> mem = mDealer[portIndex]->allocate(def.nBufferSize); 5565778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mem.get() != NULL); 557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 558ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber BufferInfo info; 559ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mStatus = BufferInfo::OWNED_BY_US; 560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 561afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber uint32_t requiresAllocateBufferBit = 562afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber (portIndex == kPortIndexInput) 563afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ? OMXCodec::kRequiresAllocateBufferOnInputPorts 564afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber : OMXCodec::kRequiresAllocateBufferOnOutputPorts; 5651065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 566308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if ((portIndex == kPortIndexInput && (mFlags & kFlagIsSecure)) 567308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang || mUseMetadataOnEncoderOutput) { 568ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mem.clear(); 569ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 570ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber void *ptr; 571ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->allocateBuffer( 572ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, def.nBufferSize, &info.mBufferID, 573ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber &ptr); 574ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 575308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t bufSize = mUseMetadataOnEncoderOutput ? 576308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang (4 + sizeof(buffer_handle_t)) : def.nBufferSize; 577308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 578308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info.mData = new ABuffer(ptr, bufSize); 579ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } else if (mQuirks & requiresAllocateBufferBit) { 5805778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->allocateBufferWithBackup( 581ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mNode, portIndex, mem, &info.mBufferID); 5825778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 583ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = mOMX->useBuffer(mNode, portIndex, mem, &info.mBufferID); 584ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 585ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 586ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (mem != NULL) { 587ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber info.mData = new ABuffer(mem->pointer(), def.nBufferSize); 5885778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5891065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 5905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mBuffers[portIndex].push(info); 5911065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5921065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 5935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 594f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5965778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 5975778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 598f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5995778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mNotify->dup(); 600d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatBuffersAllocated); 6015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 6025778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("portIndex", portIndex); 603eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 604eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber sp<PortDescription> desc = new PortDescription; 605eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 6065778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 607eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber const BufferInfo &info = mBuffers[portIndex][i]; 6085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 609eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber desc->addBuffer(info.mBufferID, info.mData); 610f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 611f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 612eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber notify->setObject("portDesc", desc); 6135778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 6145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 615f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 616f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 617f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 618054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::configureOutputBuffersFromNativeWindow( 619054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *bufferCount, OMX_U32 *bufferSize, 620054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 *minUndequeuedBuffers) { 621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 622f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = kPortIndexOutput; 624f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 625f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 626f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 629f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 630f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 632f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffers_geometry( 633f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameWidth, 635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.nFrameHeight, 636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.format.video.eColorFormat); 637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 63929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffers_geometry failed: %s (%d)", 640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strerror(-err), -err); 641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 644e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (mRotationDegrees != 0) { 645e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang uint32_t transform = 0; 646e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang switch (mRotationDegrees) { 647e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 0: transform = 0; break; 648e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 90: transform = HAL_TRANSFORM_ROT_90; break; 649e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 180: transform = HAL_TRANSFORM_ROT_180; break; 650e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang case 270: transform = HAL_TRANSFORM_ROT_270; break; 651e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang default: transform = 0; break; 652e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 653e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 654e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (transform > 0) { 655e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang err = native_window_set_buffers_transform( 656e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mNativeWindow.get(), transform); 657e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (err != 0) { 658e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang ALOGE("native_window_set_buffers_transform failed: %s (%d)", 659e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang strerror(-err), -err); 660e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang return err; 661e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 662e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 663e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 664e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Set up the native window. 6663c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis OMX_U32 usage = 0; 6673c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis err = mOMX->getGraphicBufferUsage(mNode, kPortIndexOutput, &usage); 6683c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis if (err != 0) { 6695ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("querying usage flags from OMX IL component failed: %d", err); 6703c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis // XXX: Currently this error is logged, but not fatal. 6713c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage = 0; 6723c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis } 6735a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar int omxUsage = usage; 6743c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis 6751713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (mFlags & kFlagIsGrallocUsageProtected) { 676bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber usage |= GRALLOC_USAGE_PROTECTED; 677bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 678bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 679bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Make sure to check whether either Stagefright or the video decoder 680bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // requested protected buffers. 681bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (usage & GRALLOC_USAGE_PROTECTED) { 682bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Verify that the ANativeWindow sends images directly to 683bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // SurfaceFlinger. 684bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int queuesToNativeWindow = 0; 685bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query( 686bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mNativeWindow.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 687bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber &queuesToNativeWindow); 688bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != 0) { 689bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error authenticating native window: %d", err); 690bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 691bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 692bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (queuesToNativeWindow != 1) { 693bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("native window could not be authenticated"); 694bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return PERMISSION_DENIED; 695bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 696bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 697bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 6985a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar int consumerUsage = 0; 6995a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar err = mNativeWindow->query( 7005a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar mNativeWindow.get(), NATIVE_WINDOW_CONSUMER_USAGE_BITS, 7015a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar &consumerUsage); 7025a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar if (err != 0) { 7035a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGW("failed to get consumer usage bits. ignoring"); 7045a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar err = 0; 7055a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } 7065a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 7075a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("gralloc usage: %#x(OMX) => %#x(ACodec) + %#x(Consumer) = %#x", 7085a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar omxUsage, usage, consumerUsage, usage | consumerUsage); 7095a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar usage |= consumerUsage; 710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_usage( 711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), 7123c14b9745c4afc88cec247d9dd0b003e087cbb52Jamie Gennis usage | GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP); 713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 71529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_usage failed: %s (%d)", strerror(-err), -err); 716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 719ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // Exits here for tunneled video playback codecs -- i.e. skips native window 720ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // buffer allocation step as this is managed by the tunneled OMX omponent 721ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad // itself and explicitly sets def.nBufferCountActual to 0. 722ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad if (mTunneled) { 723ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGV("Tunneled Playback: skipping native window buffer allocation."); 724ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad def.nBufferCountActual = 0; 725ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad err = mOMX->setParameter( 726ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 727ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 728ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *minUndequeuedBuffers = 0; 729ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *bufferCount = 0; 730ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad *bufferSize = 0; 731ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad return err; 732ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad } 733ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 734054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *minUndequeuedBuffers = 0; 735258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mNativeWindow->query( 736258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNativeWindow.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, 737054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (int *)minUndequeuedBuffers); 738258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 739258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis if (err != 0) { 74029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS query failed: %s (%d)", 741258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis strerror(-err), -err); 742258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 743258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 744258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 745e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // FIXME: assume that surface is controlled by app (native window 746e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // returns the number for the case when surface is not controlled by app) 7471faa41704e0b976e546321effcb09a85767d51baLajos Molnar // FIXME2: This means that minUndeqeueudBufs can be 1 larger than reported 7481faa41704e0b976e546321effcb09a85767d51baLajos Molnar // For now, try to allocate 1 more buffer, but don't fail if unsuccessful 749e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 750e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // Use conservative allocation while also trying to reduce starvation 751e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 752e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 1. allocate at least nBufferCountMin + minUndequeuedBuffers - that is the 753e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // minimum needed for the consumer to be able to work 754e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // 2. try to allocate two (2) additional buffers to reduce starvation from 755e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar // the consumer 7561faa41704e0b976e546321effcb09a85767d51baLajos Molnar // plus an extra buffer to account for incorrect minUndequeuedBufs 7571faa41704e0b976e546321effcb09a85767d51baLajos Molnar for (OMX_U32 extraBuffers = 2 + 1; /* condition inside loop */; extraBuffers--) { 758e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar OMX_U32 newBufferCount = 759e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar def.nBufferCountMin + *minUndequeuedBuffers + extraBuffers; 760258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis def.nBufferCountActual = newBufferCount; 761258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis err = mOMX->setParameter( 762258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 763258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 764e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (err == OK) { 765e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar *minUndequeuedBuffers += extraBuffers; 766e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar break; 767e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar } 768e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar 769609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGW("[%s] setting nBufferCountActual to %u failed: %d", 770e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mComponentName.c_str(), newBufferCount, err); 771e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar /* exit condition */ 772e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar if (extraBuffers == 0) { 773258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis return err; 774258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 775258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis } 776258d4e3aef7984574b0972a66871afc8a13d8e4eJamie Gennis 777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = native_window_set_buffer_count( 778f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNativeWindow.get(), def.nBufferCountActual); 779f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 780f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 78129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("native_window_set_buffer_count failed: %s (%d)", strerror(-err), 782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber -err); 783f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 784f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 785f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 786054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferCount = def.nBufferCountActual; 787054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar *bufferSize = def.nBufferSize; 788054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 789054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 790054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 791054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputBuffersFromNativeWindow() { 792054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 793054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 794054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 795054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 796054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 797e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 798054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 799609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u buffers from a native window of size %u on " 800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "output port", 801054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount, bufferSize); 802f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 803f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Dequeue buffers and send them to OMX 804054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 8058ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 8061e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf); 807f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 80829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed: %s (%d)", strerror(-err), -err); 809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<GraphicBuffer> graphicBuffer(new GraphicBuffer(buf, false)); 81374006804065941841883c4b46ee785070164023fJamie Gennis BufferInfo info; 81474006804065941841883c4b46ee785070164023fJamie Gennis info.mStatus = BufferInfo::OWNED_BY_US; 815054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(NULL /* data */, bufferSize /* capacity */); 81674006804065941841883c4b46ee785070164023fJamie Gennis info.mGraphicBuffer = graphicBuffer; 81774006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].push(info); 81874006804065941841883c4b46ee785070164023fJamie Gennis 819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferId; 820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->useGraphicBuffer(mNode, kPortIndexOutput, graphicBuffer, 821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &bufferId); 822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 823609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGE("registering GraphicBuffer %u with OMX IL component failed: " 82474006804065941841883c4b46ee785070164023fJamie Gennis "%d", i, err); 825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 82874006804065941841883c4b46ee785070164023fJamie Gennis mBuffers[kPortIndexOutput].editItemAt(i).mBufferID = bufferId; 82974006804065941841883c4b46ee785070164023fJamie Gennis 830609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Registered graphic buffer with ID %u (pointer = %p)", 831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferId, graphicBuffer.get()); 833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 835f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelStart; 836f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 cancelEnd; 837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != 0) { 839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // If an error occurred while dequeuing we need to cancel any buffers 840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // that were dequeued. 841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber cancelStart = 0; 84274006804065941841883c4b46ee785070164023fJamie Gennis cancelEnd = mBuffers[kPortIndexOutput].size(); 843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 844054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Return the required minimum undequeued buffers to the native window. 845054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelStart = bufferCount - minUndequeuedBuffers; 846054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar cancelEnd = bufferCount; 847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (OMX_U32 i = cancelStart; i < cancelEnd; i++) { 850f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i); 8513fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia status_t error = cancelBufferToNativeWindow(info); 8523fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia if (err == 0) { 8533fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia err = error; 8543fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia } 855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 860054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::allocateOutputMetaDataBuffers() { 861054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar OMX_U32 bufferCount, bufferSize, minUndequeuedBuffers; 862054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar status_t err = configureOutputBuffersFromNativeWindow( 863054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar &bufferCount, &bufferSize, &minUndequeuedBuffers); 864054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (err != 0) 865054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 866e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar mNumUndequeuedBuffers = minUndequeuedBuffers; 867054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 868609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Allocating %u meta buffers on output port", 869054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), bufferCount); 870054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 871054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar size_t totalSize = bufferCount * 8; 872054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDealer[kPortIndexOutput] = new MemoryDealer(totalSize, "ACodec"); 873054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 874054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // Dequeue buffers and send them to OMX 875054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (OMX_U32 i = 0; i < bufferCount; i++) { 876054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo info; 877054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 878054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mGraphicBuffer = NULL; 879054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mDequeuedAt = mDequeueCounter; 880054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 881054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<IMemory> mem = mDealer[kPortIndexOutput]->allocate( 882054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sizeof(struct VideoDecoderOutputMetaData)); 883054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mem.get() != NULL); 884054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info.mData = new ABuffer(mem->pointer(), mem->size()); 885054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 886054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // we use useBuffer for metadata regardless of quirks 887054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar err = mOMX->useBuffer( 888054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mNode, kPortIndexOutput, mem, &info.mBufferID); 889054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 890054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mBuffers[kPortIndexOutput].push(info); 891054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 892609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] allocated meta buffer with ID %u (pointer = %p)", 893054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info.mBufferID, mem->pointer()); 894054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 895054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 896054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mMetaDataBuffersToSubmit = bufferCount - minUndequeuedBuffers; 897054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return err; 898054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 899054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 900054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarstatus_t ACodec::submitOutputMetaDataBuffer() { 901054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 902054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mMetaDataBuffersToSubmit == 0) 903054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 904054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 905054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = dequeueBufferFromNativeWindow(); 906054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info == NULL) 907054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return ERROR_IO; 908054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 909609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] submitting output meta buffer ID %u for graphic buffer %p", 910054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mComponentName.c_str(), info->mBufferID, info->mGraphicBuffer.get()); 911054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 912054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar --mMetaDataBuffersToSubmit; 913054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK_EQ(mOMX->fillBuffer(mNode, info->mBufferID), 914054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (status_t)OK); 915054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 916054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 917054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return OK; 918054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 919054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 920f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) { 921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 923609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Calling cancelBuffer on buffer %u", 924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), info->mBufferID); 925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int err = mNativeWindow->cancelBuffer( 9271e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow.get(), info->mGraphicBuffer.get(), -1); 928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9293fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia ALOGW_IF(err != 0, "[%s] can not return buffer %u to native window", 9303fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia mComponentName.c_str(), info->mBufferID); 931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 9343fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia return err; 935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 937f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() { 9388ce2364512f7c32c824f5ec5719688830ba72427Iliyan Malchev ANativeWindowBuffer *buf; 939054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mNativeWindow.get() != NULL); 940ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 941ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad if (mTunneled) { 942ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGW("dequeueBufferFromNativeWindow() should not be called in tunnel" 943ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad " video playback mode mode!"); 944ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad return NULL; 945ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad } 946ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 9471e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis if (native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &buf) != 0) { 94829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("dequeueBuffer failed."); 949c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber return NULL; 950c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 952054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *oldest = NULL; 953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 957054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mGraphicBuffer != NULL && 958054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mGraphicBuffer->handle == buf->handle) { 959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, 960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (int)BufferInfo::OWNED_BY_NATIVE_WINDOW); 961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 963f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 966054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 967054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW && 968054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (oldest == NULL || 969054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // avoid potential issues from counter rolling over 970054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - info->mDequeuedAt > 971054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt)) { 972054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest = info; 973054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 974054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 975054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 976054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (oldest) { 977054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar CHECK(mStoreMetaDataInOutputBuffers); 978054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 979054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // discard buffer in LRU info and replace with new buffer 980054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mGraphicBuffer = new GraphicBuffer(buf, false); 981054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest->mStatus = BufferInfo::OWNED_BY_US; 982054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 983d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mOMX->updateGraphicBufferInMeta( 984d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar mNode, kPortIndexOutput, oldest->mGraphicBuffer, 985d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mBufferID); 986054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 987d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar VideoDecoderOutputMetaData *metaData = 988d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar reinterpret_cast<VideoDecoderOutputMetaData *>( 989d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mData->base()); 990d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar CHECK_EQ(metaData->eType, kMetadataBufferTypeGrallocSource); 991d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar 992d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar ALOGV("replaced oldest buffer #%u with age %u (%p/%p stored in %p)", 993054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar oldest - &mBuffers[kPortIndexOutput][0], 994054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mDequeueCounter - oldest->mDequeuedAt, 995d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar metaData->pHandle, 996d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar oldest->mGraphicBuffer->handle, oldest->mData->base()); 997054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 998054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar return oldest; 999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1000f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1001f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1002f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1006f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffersOnPort(OMX_U32 portIndex) { 1007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[portIndex].size(); i-- > 0;) { 1008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(portIndex, i)); 1009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1011f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDealer[portIndex].clear(); 1012f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1013f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1014f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1015f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1016349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huberstatus_t ACodec::freeOutputBuffersNotOwnedByComponent() { 1017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = mBuffers[kPortIndexOutput].size(); i-- > 0;) { 1018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 1019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &mBuffers[kPortIndexOutput].editItemAt(i); 1020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10212ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // At this time some buffers may still be with the component 10222ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar // or being drained. 10232ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar if (info->mStatus != BufferInfo::OWNED_BY_COMPONENT && 10242ded8b53014602d25b20bade8ce46db95a8da4b5Lajos Molnar info->mStatus != BufferInfo::OWNED_BY_DOWNSTREAM) { 1025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, freeBuffer(kPortIndexOutput, i)); 1026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1027f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1028f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1029f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1030f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1031f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1032f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) { 1033f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1034f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1035f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 1036f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 1037f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1038f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput && mNativeWindow != NULL 1039f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus == BufferInfo::OWNED_BY_US) { 10403fb9f68dea5d991288f0ea8037742b50c7df5767Wei Jia cancelBufferToNativeWindow(info); 1041f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1042f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mOMX->freeBuffer( 1044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, portIndex, info->mBufferID), 1045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 1046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mBuffers[portIndex].removeAt(i); 1048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1051f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1052f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BufferInfo *ACodec::findBufferByID( 1053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber uint32_t portIndex, IOMX::buffer_id bufferID, 1054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t *index) { 1055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 1056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 1057f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mBufferID == bufferID) { 1059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (index != NULL) { 1060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *index = i; 1061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return info; 1063f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 1067f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return NULL; 1069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1070f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 10715778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setComponentRole( 1072f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool isEncoder, const char *mime) { 1073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber struct MimeToRole { 1074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime; 1075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *decoderRole; 1076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *encoderRole; 1077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1078f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1079f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const MimeToRole kMimeToRole[] = { 1080f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG, 1081f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.mp3", "audio_encoder.mp3" }, 10822944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_I, 10832944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp1", "audio_encoder.mp1" }, 10842944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber { MEDIA_MIMETYPE_AUDIO_MPEG_LAYER_II, 10852944eca607304a095ea43ba2b8f0b9de61249f9fAndreas Huber "audio_decoder.mp2", "audio_encoder.mp2" }, 1086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_NB, 1087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrnb", "audio_encoder.amrnb" }, 1088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AMR_WB, 1089f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.amrwb", "audio_encoder.amrwb" }, 1090f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_AUDIO_AAC, 1091f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "audio_decoder.aac", "audio_encoder.aac" }, 1092729de186450f78c099637e1fce743fe531862c52Andreas Huber { MEDIA_MIMETYPE_AUDIO_VORBIS, 1093729de186450f78c099637e1fce743fe531862c52Andreas Huber "audio_decoder.vorbis", "audio_encoder.vorbis" }, 1094bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian { MEDIA_MIMETYPE_AUDIO_OPUS, 1095bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian "audio_decoder.opus", "audio_encoder.opus" }, 1096c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_MLAW, 1097c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711mlaw", "audio_encoder.g711mlaw" }, 1098c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber { MEDIA_MIMETYPE_AUDIO_G711_ALAW, 1099c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber "audio_decoder.g711alaw", "audio_encoder.g711alaw" }, 1100f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, 1101f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.avc", "video_encoder.avc" }, 11022472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, 11032472b1c0d63454e5d90a982bd6c555de6c3127bdRachad "video_decoder.hevc", "video_encoder.hevc" }, 1104f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, 1105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.mpeg4", "video_encoder.mpeg4" }, 1106f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { MEDIA_MIMETYPE_VIDEO_H263, 1107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber "video_decoder.h263", "video_encoder.h263" }, 110894705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, 110994705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp8", "video_encoder.vp8" }, 111094705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, 111194705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang "video_decoder.vp9", "video_encoder.vp9" }, 1112ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber { MEDIA_MIMETYPE_AUDIO_RAW, 1113ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber "audio_decoder.raw", "audio_encoder.raw" }, 11142f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi { MEDIA_MIMETYPE_AUDIO_FLAC, 11152f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi "audio_decoder.flac", "audio_encoder.flac" }, 1116ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen { MEDIA_MIMETYPE_AUDIO_MSGSM, 1117ba933df89521d63f75ca66af12ce9d7ae9496b9eMarco Nelissen "audio_decoder.gsm", "audio_encoder.gsm" }, 1118774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu { MEDIA_MIMETYPE_VIDEO_MPEG2, 1119774eb18c40c3a7da0bc1636a9779f02315ddbad8Changwan Ryu "video_decoder.mpeg2", "video_encoder.mpeg2" }, 112097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { MEDIA_MIMETYPE_AUDIO_AC3, 112197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu "audio_decoder.ac3", "audio_encoder.ac3" }, 11228a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad { MEDIA_MIMETYPE_AUDIO_EAC3, 11238a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad "audio_decoder.eac3", "audio_encoder.eac3" }, 1124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber }; 1125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static const size_t kNumMimeToRole = 1127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sizeof(kMimeToRole) / sizeof(kMimeToRole[0]); 1128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t i; 1130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (i = 0; i < kNumMimeToRole; ++i) { 1131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcasecmp(mime, kMimeToRole[i].mime)) { 1132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 1133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (i == kNumMimeToRole) { 11375778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ERROR_UNSUPPORTED; 1138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1140f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *role = 1141f933441648ef6a71dee783d733aac17b9508b452Andreas Huber isEncoder ? kMimeToRole[i].encoderRole 1142f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : kMimeToRole[i].decoderRole; 1143f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1144f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (role != NULL) { 1145f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_COMPONENTROLETYPE roleParams; 1146f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&roleParams); 1147f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1148f933441648ef6a71dee783d733aac17b9508b452Andreas Huber strncpy((char *)roleParams.cRole, 1149f933441648ef6a71dee783d733aac17b9508b452Andreas Huber role, OMX_MAX_STRINGNAME_SIZE - 1); 1150f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1151f933441648ef6a71dee783d733aac17b9508b452Andreas Huber roleParams.cRole[OMX_MAX_STRINGNAME_SIZE - 1] = '\0'; 1152f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1153f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 1154f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamStandardComponentRole, 1155f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &roleParams, sizeof(roleParams)); 1156f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1157f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 11585ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("[%s] Failed to set standard component role '%s'.", 1159f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), role); 11605778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11615778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1162f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1163f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 11645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 1166f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1167f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11685778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::configureCodec( 1169f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const char *mime, const sp<AMessage> &msg) { 11705778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t encoder; 11715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 11725778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 11735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1175e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar sp<AMessage> inputFormat = new AMessage(); 11764e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar sp<AMessage> outputFormat = mNotify->dup(); // will use this for kWhatOutputFormatChanged 1177e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 11785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mIsEncoder = encoder; 1179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 11805778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setComponentRole(encoder /* isEncoder */, mime); 11815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11825778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 11835778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 11845778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 11865778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitRate = 0; 11872f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // FLAC encoder doesn't need a bitrate, other encoders do 11882f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC) 11892f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi && !msg->findInt32("bitrate", &bitRate)) { 11905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 11915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 11925778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1193d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber int32_t storeMeta; 1194d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (encoder 1195d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && msg->findInt32("store-metadata-in-buffers", &storeMeta) 1196d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber && storeMeta != 0) { 1197d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexInput, OMX_TRUE); 1198d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1199d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (err != OK) { 1200308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (input) failed w/ err %d", 1201308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1202d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1203308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang return err; 1204308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1205308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1206d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 1207308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t prependSPSPPS = 0; 12083a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (encoder 12093a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && msg->findInt32("prepend-sps-pps-to-idr-frames", &prependSPSPPS) 12103a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber && prependSPSPPS != 0) { 12113a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber OMX_INDEXTYPE index; 12123a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->getExtensionIndex( 12133a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, 12143a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "OMX.google.android.index.prependSPSPPSToIDRFrames", 12153a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber &index); 12163a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 12173a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err == OK) { 12183a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber PrependSPSPPSToIDRFramesParams params; 12193a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber InitOMXParams(¶ms); 12203a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber params.bEnable = OMX_TRUE; 12213a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 12223a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber err = mOMX->setParameter( 12233a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber mNode, index, ¶ms, sizeof(params)); 12243a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 12253a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 12263a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber if (err != OK) { 12273a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber ALOGE("Encoder could not be configured to emit SPS/PPS before " 12283a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber "IDR frames. (err %d)", err); 12293a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 12303a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber return err; 12313a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 12323a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber } 12333a0ef0dc71f3776d115f30d87f1d8867daefea88Andreas Huber 1234308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // Only enable metadata mode on encoder output if encoder can prepend 1235308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // sps/pps to idr frames, since in metadata mode the bitstream is in an 1236308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang // opaque handle, to which we don't have access. 1237308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang int32_t video = !strncasecmp(mime, "video/", 6); 1238308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (encoder && video) { 1239308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang OMX_BOOL enable = (OMX_BOOL) (prependSPSPPS 1240308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && msg->findInt32("store-metadata-in-buffers-output", &storeMeta) 1241308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang && storeMeta != 0); 1242308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1243308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, enable); 1244308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 1245308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (err != OK) { 1246308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang ALOGE("[%s] storeMetaDataInBuffers (output) failed w/ err %d", 1247308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mComponentName.c_str(), err); 1248308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = 0; 1249308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 1250308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mUseMetadataOnEncoderOutput = enable; 1251308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1252a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 1253a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (!msg->findInt64( 1254a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "repeat-previous-frame-after", 1255a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mRepeatFrameDelayUs)) { 1256a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mRepeatFrameDelayUs = -1ll; 1257a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 125894ee4b708acfa941581160b267afb79192b1d816Chong Zhang 125994ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (!msg->findInt64("max-pts-gap-to-encoder", &mMaxPtsGapUs)) { 12602c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mMaxPtsGapUs = -1ll; 12612c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 12622c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 126337b2b389139ed638831e49708c947863eef631efRonghua Wu if (!msg->findFloat("max-fps-to-encoder", &mMaxFps)) { 126437b2b389139ed638831e49708c947863eef631efRonghua Wu mMaxFps = -1; 126537b2b389139ed638831e49708c947863eef631efRonghua Wu } 126637b2b389139ed638831e49708c947863eef631efRonghua Wu 12672c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (!msg->findInt64("time-lapse", &mTimePerCaptureUs)) { 12682c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerCaptureUs = -1ll; 126994ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 127072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 127172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (!msg->findInt32( 127272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang "create-input-buffers-suspended", 127372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang (int32_t*)&mCreateInputBuffersSuspended)) { 127472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCreateInputBuffersSuspended = false; 127572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 1276308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 1277308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang 12783a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // NOTE: we only use native window for video decoders 1279054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar sp<RefBase> obj; 12800d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar bool haveNativeWindow = msg->findObject("native-window", &obj) 12813a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar && obj != NULL && video && !encoder; 1282054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mStoreMetaDataInOutputBuffers = false; 1283e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (video && !encoder) { 1284e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar inputFormat->setInt32("adaptive-playback", false); 12851713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang 12861713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang int32_t usageProtected; 12871713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (msg->findInt32("protected", &usageProtected) && usageProtected) { 12881713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang if (!haveNativeWindow) { 12891713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang ALOGE("protected output buffers must be sent to an ANativeWindow"); 12901713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang return PERMISSION_DENIED; 12911713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang } 12921713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mFlags |= kFlagIsGrallocUsageProtected; 12931713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 12941713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang } 1295e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 12963a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 12975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sp<NativeWindowWrapper> windowWrapper( 12985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad static_cast<NativeWindowWrapper *>(obj.get())); 12995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sp<ANativeWindow> nativeWindow = windowWrapper->getNativeWindow(); 13005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13016597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar // START of temporary support for automatic FRC - THIS WILL BE REMOVED 13026597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar int32_t autoFrc; 13036597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar if (msg->findInt32("auto-frc", &autoFrc)) { 13046597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar bool enabled = autoFrc; 13056597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar OMX_CONFIG_BOOLEANTYPE config; 13066597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar InitOMXParams(&config); 13076597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar config.bEnabled = (OMX_BOOL)enabled; 13086597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar status_t temp = mOMX->setConfig( 13096597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar mNode, (OMX_INDEXTYPE)OMX_IndexConfigAutoFramerateConversion, 13106597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar &config, sizeof(config)); 13116597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar if (temp == OK) { 13126597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar outputFormat->setInt32("auto-frc", enabled); 13136597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } else if (enabled) { 13146597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar ALOGI("codec does not support requested auto-frc (err %d)", temp); 13156597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } 13166597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar } 13176597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar // END of temporary support for automatic FRC 13186597c00f7015e5ec9a07601d7a760169ca7266d3Lajos Molnar 13195a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t tunneled; 13205a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("feature-tunneled-playback", &tunneled) && 13215a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad tunneled != 0) { 13225a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGI("Configuring TUNNELED video playback."); 1323ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled = true; 13245a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 132597827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad int32_t audioHwSync = 0; 132697827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad if (!msg->findInt32("audio-hw-sync", &audioHwSync)) { 13275a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW("No Audio HW Sync provided for video tunnel"); 13285a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 13295a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = configureTunneledVideoPlayback(audioHwSync, nativeWindow); 13305a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 133197827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad ALOGE("configureTunneledVideoPlayback(%d,%p) failed!", 13325a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad audioHwSync, nativeWindow.get()); 13335a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 1334fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 1335fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar 1336d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad int32_t maxWidth = 0, maxHeight = 0; 1337d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad if (msg->findInt32("max-width", &maxWidth) && 1338d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad msg->findInt32("max-height", &maxHeight)) { 1339d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad 1340d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad err = mOMX->prepareForAdaptivePlayback( 1341d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, maxHeight); 1342d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad if (err != OK) { 1343d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad ALOGW("[%s] prepareForAdaptivePlayback failed w/ err %d", 1344d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad mComponentName.c_str(), err); 13453a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // allow failure 13463a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = OK; 1347d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } else { 1348d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("max-width", maxWidth); 1349d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("max-height", maxHeight); 1350d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad inputFormat->setInt32("adaptive-playback", true); 1351d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } 1352d0b9a2b8538c9e4538d92fd675cf6786644ccb85Rachad } 13535a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 1354ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad ALOGV("Configuring CPU controlled video playback."); 1355ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad mTunneled = false; 1356ab76066c11e988ca3d3a5d6d74dd510ae080322eRachad 13573fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // Explicity reset the sideband handle of the window for 13583fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // non-tunneled video in case the window was previously used 13593fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad // for a tunneled video playback. 13603fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad err = native_window_set_sideband_stream(nativeWindow.get(), NULL); 13613fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad if (err != OK) { 13623fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad ALOGE("set_sideband_stream(NULL) failed! (err %d).", err); 13633fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad return err; 13643fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad } 13653fb3917ae19f07ddfb2176a9da3c7cfa514522a5Rachad 13665a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // Always try to enable dynamic output buffers on native surface 13675a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->storeMetaDataInBuffers( 13685a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE); 13695a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 13705a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("[%s] storeMetaDataInBuffers failed w/ err %d", 1371fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar mComponentName.c_str(), err); 1372e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 13735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // if adaptive playback has been requested, try JB fallback 13745a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // NOTE: THIS FALLBACK MECHANISM WILL BE REMOVED DUE TO ITS 13755a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // LARGE MEMORY REQUIREMENT 13765a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13775a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // we will not do adaptive playback on software accessed 13785a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // surfaces as they never had to respond to changes in the 13795a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // crop window, and we don't trust that they will be able to. 13805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int usageBits = 0; 13815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad bool canDoAdaptivePlayback; 13825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (nativeWindow->query( 13845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad nativeWindow.get(), 13855a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad NATIVE_WINDOW_CONSUMER_USAGE_BITS, 13865a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad &usageBits) != OK) { 13875a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = false; 13885a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 13895a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad canDoAdaptivePlayback = 13905a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (usageBits & 13915a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad (GRALLOC_USAGE_SW_READ_MASK | 13925a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad GRALLOC_USAGE_SW_WRITE_MASK)) == 0; 13935a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 13945a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 13955a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t maxWidth = 0, maxHeight = 0; 13965a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (canDoAdaptivePlayback && 13975a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-width", &maxWidth) && 13985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad msg->findInt32("max-height", &maxHeight)) { 13995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] prepareForAdaptivePlayback(%dx%d)", 14005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), maxWidth, maxHeight); 14015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = mOMX->prepareForAdaptivePlayback( 14035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, maxWidth, 14045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad maxHeight); 14055a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGW_IF(err != OK, 14065a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad "[%s] prepareForAdaptivePlayback failed w/ err %d", 14075a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str(), err); 14085a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 14095a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err == OK) { 14105a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-width", maxWidth); 14115a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("max-height", maxHeight); 14125a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 14135a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 1414e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 14155a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad // allow failure 14165a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = OK; 14175a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } else { 14185a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGV("[%s] storeMetaDataInBuffers succeeded", 14195a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mComponentName.c_str()); 14205a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mStoreMetaDataInOutputBuffers = true; 14215a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad inputFormat->setInt32("adaptive-playback", true); 1422fce0d1883cdbcb7d501625fb43844043cd28a267Lajos Molnar } 14230167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber 14245a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad int32_t push; 14255a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (msg->findInt32("push-blank-buffers-on-shutdown", &push) 14265a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad && push != 0) { 14275a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 14285a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 14290167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber } 1430e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang 1431e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang int32_t rotationDegrees; 1432e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang if (msg->findInt32("rotation-degrees", &rotationDegrees)) { 1433e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = rotationDegrees; 1434e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } else { 1435e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang mRotationDegrees = 0; 1436e9e63bcf6c36351f1129b0bdc5e93f17f0f9f0b4Chong Zhang } 1437054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 1438054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 1439308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (video) { 14403a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // determine need for software renderer 14413a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar bool usingSwRenderer = false; 14423a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow && mComponentName.startsWith("OMX.google.")) { 14433a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar usingSwRenderer = true; 14443a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar haveNativeWindow = false; 14453a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14463a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14475778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 14485778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupVideoEncoder(mime, msg); 14495778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 14500d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setupVideoDecoder(mime, msg, haveNativeWindow); 14515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 14523a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14533a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (err != OK) { 14543a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar return err; 14553a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14563a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14573a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 14583a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar sp<NativeWindowWrapper> nativeWindow( 14593a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar static_cast<NativeWindowWrapper *>(obj.get())); 14603a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK(nativeWindow != NULL); 14613a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mNativeWindow = nativeWindow->getNativeWindow(); 14623a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14633a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar native_window_set_scaling_mode( 14643a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mNativeWindow.get(), NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 14653a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14663a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14673a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // initialize native window now to get actual output format 14683a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // TODO: this is needed for some encoders even though they don't use native window 14693a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK_EQ((status_t)OK, initNativeWindow()); 14703a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 14713a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // fallback for devices that do not handle flex-YUV for native buffers 14723a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (haveNativeWindow) { 14733a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar int32_t requestedColorFormat = OMX_COLOR_FormatUnused; 14743a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (msg->findInt32("color-format", &requestedColorFormat) && 14753a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar requestedColorFormat == OMX_COLOR_FormatYUV420Flexible) { 14763a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 14773a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar int32_t colorFormat = OMX_COLOR_FormatUnused; 14783a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar OMX_U32 flexibleEquivalent = OMX_COLOR_FormatUnused; 14793a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar CHECK(outputFormat->findInt32("color-format", &colorFormat)); 14803a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar ALOGD("[%s] Requested output format %#x and got %#x.", 14813a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mComponentName.c_str(), requestedColorFormat, colorFormat); 14823a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (!isFlexibleColorFormat( 14833a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mOMX, mNode, colorFormat, haveNativeWindow, &flexibleEquivalent) 14843a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar || flexibleEquivalent != (OMX_U32)requestedColorFormat) { 14853a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // device did not handle flex-YUV request for native window, fall back 14863a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // to SW renderer 14873a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar ALOGI("[%s] Falling back to software renderer", mComponentName.c_str()); 14883a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mNativeWindow.clear(); 14893a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar haveNativeWindow = false; 14903a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar usingSwRenderer = true; 14913a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (mStoreMetaDataInOutputBuffers) { 14923a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = mOMX->storeMetaDataInBuffers(mNode, kPortIndexOutput, OMX_FALSE); 14933a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar mStoreMetaDataInOutputBuffers = false; 14943a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // TODO: implement adaptive-playback support for bytebuffer mode. 14953a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // This is done by SW codecs, but most HW codecs don't support it. 14963a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar inputFormat->setInt32("adaptive-playback", false); 14973a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 14983a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (err == OK) { 14993a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 15003a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15013a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (mFlags & kFlagIsGrallocUsageProtected) { 15023a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar // fallback is not supported for protected playback 15033a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = PERMISSION_DENIED; 15043a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } else if (err == OK) { 15053a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar err = setupVideoDecoder(mime, msg, false); 15063a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15073a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15083a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15093a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 15103a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar 15113a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar if (usingSwRenderer) { 15123a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar outputFormat->setInt32("using-sw-renderer", 1); 15133a01a71dcbb467d06cc5da4a72a82bb588648cfcLajos Molnar } 151442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_MPEG)) { 151542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber int32_t numChannels, sampleRate; 151642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber if (!msg->findInt32("channel-count", &numChannels) 151742392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 151842392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // Since we did not always check for these, leave them optional 151942392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber // and have the decoder figure it all out. 152042392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = OK; 152142392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } else { 152242392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber err = setupRawAudioFormat( 152342392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 152442392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber sampleRate, 152542392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber numChannels); 152642392e49e167c6a0c573e55e1c1b4c7fa0ceb213Andreas Huber } 1527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { 1528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t numChannels, sampleRate; 15295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels) 15305778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 15315778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 15325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 1533aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke int32_t isADTS, aacProfile; 1534b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi int32_t sbrMode; 15358045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t maxOutputChannelCount; 15362965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t pcmLimiterEnable; 15378045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drcParams_t drc; 1538ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (!msg->findInt32("is-adts", &isADTS)) { 1539ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS = 0; 1540ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1541aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke if (!msg->findInt32("aac-profile", &aacProfile)) { 1542aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke aacProfile = OMX_AUDIO_AACObjectNull; 1543aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke } 1544b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi if (!msg->findInt32("aac-sbr-mode", &sbrMode)) { 1545b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi sbrMode = -1; 1546b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 1547ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 15488045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-max-output-channel_count", &maxOutputChannelCount)) { 15498045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi maxOutputChannelCount = -1; 15508045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15512965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang if (!msg->findInt32("aac-pcm-limiter-enable", &pcmLimiterEnable)) { 15522965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang // value is unknown 15532965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang pcmLimiterEnable = -1; 15542965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang } 15558045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-encoded-target-level", &drc.encodedTargetLevel)) { 15568045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15578045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.encodedTargetLevel = -1; 15588045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15598045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-cut-level", &drc.drcCut)) { 15608045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15618045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcCut = -1; 15628045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15638045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-boost-level", &drc.drcBoost)) { 15648045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15658045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.drcBoost = -1; 15668045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15678045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-drc-heavy-compression", &drc.heavyCompression)) { 15688045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15698045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.heavyCompression = -1; 15708045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15718045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (!msg->findInt32("aac-target-ref-level", &drc.targetRefLevel)) { 15728045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // value is unknown 15738045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi drc.targetRefLevel = -1; 15748045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 15758045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 1576ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber err = setupAACCodec( 15774471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber encoder, numChannels, sampleRate, bitRate, aacProfile, 15782965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang isADTS != 0, sbrMode, maxOutputChannelCount, drc, 15792965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang pcmLimiterEnable); 15805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1581729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_NB)) { 15825778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, false /* isWAMR */, bitRate); 1583729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AMR_WB)) { 15845778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAMRCodec(encoder, true /* isWAMR */, bitRate); 1585729de186450f78c099637e1fce743fe531862c52Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_ALAW) 1586729de186450f78c099637e1fce743fe531862c52Andreas Huber || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_G711_MLAW)) { 1587729de186450f78c099637e1fce743fe531862c52Andreas Huber // These are PCM-like formats with a fixed sample rate but 1588729de186450f78c099637e1fce743fe531862c52Andreas Huber // a variable number of channels. 1589729de186450f78c099637e1fce743fe531862c52Andreas Huber 1590729de186450f78c099637e1fce743fe531862c52Andreas Huber int32_t numChannels; 15915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("channel-count", &numChannels)) { 15925778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = INVALID_OPERATION; 15935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 159417c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen int32_t sampleRate; 159517c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen if (!msg->findInt32("sample-rate", &sampleRate)) { 159617c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen sampleRate = 8000; 159717c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen } 159817c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen err = setupG711Codec(encoder, sampleRate, numChannels); 15995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 16002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_FLAC)) { 16012f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi int32_t numChannels, sampleRate, compressionLevel = -1; 16022f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder && 16032f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi (!msg->findInt32("channel-count", &numChannels) 16042f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi || !msg->findInt32("sample-rate", &sampleRate))) { 16052f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("missing channel count or sample rate for FLAC encoder"); 16062f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = INVALID_OPERATION; 16072f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else { 16082f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 1609516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber if (!msg->findInt32( 1610cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar "complexity", &compressionLevel) && 1611cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar !msg->findInt32( 1612516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "flac-compression-level", &compressionLevel)) { 1613cd39746f8d83bb3f12e8f613e77c3c3b5f77c077Lajos Molnar compressionLevel = 5; // default FLAC compression level 16142f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel < 0) { 1615516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1616516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 0", 1617516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 16182f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 0; 16192f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } else if (compressionLevel > 8) { 1620516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber ALOGW("compression level %d outside [0..8] range, " 1621516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber "using 8", 1622516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber compressionLevel); 16232f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi compressionLevel = 8; 16242f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 16252f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1626516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber err = setupFlacCodec( 1627516dacfb02d0b0eafe21114330c98ce0e7d90da9Andreas Huber encoder, numChannels, sampleRate, compressionLevel); 16282f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 1629ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_RAW)) { 1630ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber int32_t numChannels, sampleRate; 1631ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber if (encoder 1632ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("channel-count", &numChannels) 1633ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber || !msg->findInt32("sample-rate", &sampleRate)) { 1634ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = INVALID_OPERATION; 1635ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } else { 1636ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber err = setupRawAudioFormat(kPortIndexInput, sampleRate, numChannels); 1637ecdd39c5af016e2fa57cbfd837aa670b706dabd3Andreas Huber } 163897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AC3)) { 163997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t numChannels; 164097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu int32_t sampleRate; 164197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (!msg->findInt32("channel-count", &numChannels) 164297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu || !msg->findInt32("sample-rate", &sampleRate)) { 164397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = INVALID_OPERATION; 164497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } else { 164597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = setupAC3Codec(encoder, numChannels, sampleRate); 164697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 16478a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_EAC3)) { 16488a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad int32_t numChannels; 16498a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad int32_t sampleRate; 16508a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (!msg->findInt32("channel-count", &numChannels) 16518a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad || !msg->findInt32("sample-rate", &sampleRate)) { 16528a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = INVALID_OPERATION; 16538a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } else { 16548a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = setupEAC3Codec(encoder, numChannels, sampleRate); 16558a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 16565778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 1657729de186450f78c099637e1fce743fe531862c52Andreas Huber 16584471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber if (err != OK) { 16594471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber return err; 16604471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber } 16614471e47ece77be5b4159cc9cbbcef4d43900d36fAndreas Huber 16628b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-delay", &mEncoderDelay)) { 16638b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderDelay = 0; 16648b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 16659806555d3930be43e11106281dee354820ac1c88Andreas Huber 16668b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (!msg->findInt32("encoder-padding", &mEncoderPadding)) { 16678b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mEncoderPadding = 0; 16688b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 16698b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen 16709806555d3930be43e11106281dee354820ac1c88Andreas Huber if (msg->findInt32("channel-mask", &mChannelMask)) { 16719806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = true; 16729806555d3930be43e11106281dee354820ac1c88Andreas Huber } else { 16739806555d3930be43e11106281dee354820ac1c88Andreas Huber mChannelMaskPresent = false; 16749806555d3930be43e11106281dee354820ac1c88Andreas Huber } 16759806555d3930be43e11106281dee354820ac1c88Andreas Huber 1676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t maxInputSize; 1677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (msg->findInt32("max-input-size", &maxInputSize)) { 16785778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, (size_t)maxInputSize); 1679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!strcmp("OMX.Nvidia.aac.decoder", mComponentName.c_str())) { 16805778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setMinBufferSize(kPortIndexInput, 8192); // XXX 1681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 16825778822d86b0337407514b9372562b86edfa91cdAndreas Huber 16838b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu int32_t priority; 16848b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (msg->findInt32("priority", &priority)) { 16858b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu err = setPriority(priority); 16868b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 16878b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu 16884e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar mBaseOutputFormat = outputFormat; 16894e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar 1690e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexInput, inputFormat), (status_t)OK); 1691e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, outputFormat), (status_t)OK); 1692e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mInputFormat = inputFormat; 1693e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mOutputFormat = outputFormat; 1694e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 16955778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 1696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 16988b806ea894ca098366629458bfdd1df4866afcdfRonghua Wustatus_t ACodec::setPriority(int32_t priority) { 16998b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (priority < 0) { 17008b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu return BAD_VALUE; 17018b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 17028b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu OMX_PARAM_U32TYPE config; 17038b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu InitOMXParams(&config); 17048b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu config.nU32 = (OMX_U32)priority; 17058b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu status_t temp = mOMX->setConfig( 17068b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu mNode, (OMX_INDEXTYPE)OMX_IndexConfigPriority, 17078b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu &config, sizeof(config)); 17088b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu if (temp != OK) { 17098b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu ALOGI("codec does not support config priority (err %d)", temp); 17108b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu } 17118b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu return OK; 17128b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu} 17138b806ea894ca098366629458bfdd1df4866afcdfRonghua Wu 1714f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setMinBufferSize(OMX_U32 portIndex, size_t size) { 1715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 1716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 1717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 1718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 1720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize >= size) { 1727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = size; 1731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 1733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->getParameter( 1740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 1741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1745f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(def.nBufferSize >= size); 1747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 1749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 1750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 17515778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::selectAudioPortFormat( 17525778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 portIndex, OMX_AUDIO_CODINGTYPE desiredFormat) { 17535778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_PORTFORMATTYPE format; 17545778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&format); 17555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17565778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nPortIndex = portIndex; 17575778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (OMX_U32 index = 0;; ++index) { 17585778822d86b0337407514b9372562b86edfa91cdAndreas Huber format.nIndex = index; 17595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17605778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 17615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, 17625778822d86b0337407514b9372562b86edfa91cdAndreas Huber &format, sizeof(format)); 17635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17645778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17655778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17665778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (format.eEncoding == desiredFormat) { 17695778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 17705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17735778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 17745778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioPortFormat, &format, sizeof(format)); 17755778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 17765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17775778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAACCodec( 1778aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke bool encoder, int32_t numChannels, int32_t sampleRate, 17798045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi int32_t bitRate, int32_t aacProfile, bool isADTS, int32_t sbrMode, 17802965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t maxOutputChannelCount, const drcParams_t& drc, 17812965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang int32_t pcmLimiterEnable) { 1782ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (encoder && isADTS) { 1783ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber return -EINVAL; 1784ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 1785ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 17865778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setupRawAudioFormat( 17875778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 17885778822d86b0337407514b9372562b86edfa91cdAndreas Huber sampleRate, 17895778822d86b0337407514b9372562b86edfa91cdAndreas Huber numChannels); 17905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17925778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 17935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 17945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (encoder) { 17965778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = selectAudioPortFormat(kPortIndexOutput, OMX_AUDIO_CodingAAC); 17975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 17985778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 17995778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18015778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18025778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 18035778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 18045778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 18055778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18065778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 18075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 18085778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18095778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18125778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18135778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.bFlagErrorConcealment = OMX_TRUE; 18145778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingAAC; 18155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18165778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 18175778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 18185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18235778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 18245778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&profile); 18255778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nPortIndex = kPortIndexOutput; 18265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18275778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 18285778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 18295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18305778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18345778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nChannels = numChannels; 18355778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18365778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eChannelMode = 18375778822d86b0337407514b9372562b86edfa91cdAndreas Huber (numChannels == 1) 18385778822d86b0337407514b9372562b86edfa91cdAndreas Huber ? OMX_AUDIO_ChannelModeMono: OMX_AUDIO_ChannelModeStereo; 18395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18405778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nSampleRate = sampleRate; 18415778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nBitRate = bitRate; 18425778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAudioBandWidth = 0; 18435778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nFrameLength = 0; 18445778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACtools = OMX_AUDIO_AACToolAll; 18455778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.nAACERtools = OMX_AUDIO_AACERNone; 1846aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke profile.eAACProfile = (OMX_AUDIO_AACPROFILETYPE) aacProfile; 18475778822d86b0337407514b9372562b86edfa91cdAndreas Huber profile.eAACStreamFormat = OMX_AUDIO_AACStreamFormatMP4FF; 1848b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi switch (sbrMode) { 1849b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 0: 1850b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // disable sbr 1851b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1852b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1853b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1854b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 1: 1855b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable single-rate sbr 1856b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1857b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidDSBR; 1858b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1859b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case 2: 1860b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable dual-rate sbr 1861b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools &= ~OMX_AUDIO_AACToolAndroidSSBR; 1862b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1863b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1864b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi case -1: 1865b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // enable both modes -> the codec will decide which mode should be used 1866b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidSSBR; 1867b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi profile.nAACtools |= OMX_AUDIO_AACToolAndroidDSBR; 1868b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi break; 1869b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi default: 1870b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi // unsupported sbr mode 1871b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi return BAD_VALUE; 1872b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi } 1873b97cc6a9a3c81215e365c61b071a932073b56ff2Jean-Michel Trivi 18745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18755778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 18765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 18775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18785778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 18795778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 18825778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 18835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 18845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1885f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE profile; 1886f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&profile); 1887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nPortIndex = kPortIndexInput; 1888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 18895778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 1890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 1891f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 1893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 1894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 1895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nChannels = numChannels; 1897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber profile.nSampleRate = sampleRate; 1898ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 1899ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber profile.eAACStreamFormat = 1900ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber isADTS 1901ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber ? OMX_AUDIO_AACStreamFormatMP4ADTS 1902ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber : OMX_AUDIO_AACStreamFormatMP4FF; 1903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 19048045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi OMX_AUDIO_PARAM_ANDROID_AACPRESENTATIONTYPE presentation; 19058045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nMaxOutputChannels = maxOutputChannelCount; 19068045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcCut = drc.drcCut; 19078045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nDrcBoost = drc.drcBoost; 19088045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nHeavyCompression = drc.heavyCompression; 19098045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nTargetReferenceLevel = drc.targetRefLevel; 19108045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi presentation.nEncodedTargetLevel = drc.encodedTargetLevel; 19112965f4eb7dceaf1173f0e2d93c11c28293aeead7Chong Zhang presentation.nPCMLimiterEnable = pcmLimiterEnable; 19128045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi 19138045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi status_t res = mOMX->setParameter(mNode, OMX_IndexParamAudioAac, &profile, sizeof(profile)); 19148045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi if (res == OK) { 19158045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi // optional parameters, will not cause configuration failure 19168045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi mOMX->setParameter(mNode, (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAacPresentation, 19178045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi &presentation, sizeof(presentation)); 19188045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } else { 19198045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi ALOGW("did not set AudioAndroidAacPresentation due to error %d when setting AudioAac", res); 19208045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi } 19218045853d03649f43ea2f7107e7d2dbb9b2d20855Jean-Michel Trivi return res; 19225778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 1923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 192497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryustatus_t ACodec::setupAC3Codec( 192597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu bool encoder, int32_t numChannels, int32_t sampleRate) { 192697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu status_t err = setupRawAudioFormat( 192797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 192897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 192997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 193097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 193197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 193297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 193397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (encoder) { 193497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ALOGW("AC3 encoding is not supported."); 193597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return INVALID_OPERATION; 193697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 193797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 193897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE def; 193997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(&def); 194097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nPortIndex = kPortIndexInput; 194197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 194297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu err = mOMX->getParameter( 194397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 194497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 194597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 194697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 194797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 194897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu if (err != OK) { 194997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return err; 195097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 195197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 195297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nChannels = numChannels; 195397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu def.nSampleRate = sampleRate; 195497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 195597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu return mOMX->setParameter( 195697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 195797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 195897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu &def, 195997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(def)); 196097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu} 196197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 19628a4728966dc9c78e21c3c93a927707e93c05e5e0Rachadstatus_t ACodec::setupEAC3Codec( 19638a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad bool encoder, int32_t numChannels, int32_t sampleRate) { 19648a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad status_t err = setupRawAudioFormat( 19658a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad encoder ? kPortIndexInput : kPortIndexOutput, sampleRate, numChannels); 19668a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19678a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (err != OK) { 19688a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return err; 19698a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 19708a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19718a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (encoder) { 19728a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad ALOGW("EAC3 encoding is not supported."); 19738a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return INVALID_OPERATION; 19748a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 19758a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19768a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad OMX_AUDIO_PARAM_ANDROID_EAC3TYPE def; 19778a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad InitOMXParams(&def); 19788a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nPortIndex = kPortIndexInput; 19798a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19808a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad err = mOMX->getParameter( 19818a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 19828a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 19838a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad &def, 19848a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(def)); 19858a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19868a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad if (err != OK) { 19878a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return err; 19888a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 19898a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19908a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nChannels = numChannels; 19918a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad def.nSampleRate = sampleRate; 19928a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 19938a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad return mOMX->setParameter( 19948a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 19958a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 19968a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad &def, 19978a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(def)); 19988a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad} 19998a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 20005778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_AUDIO_AMRBANDMODETYPE pickModeFromBitRate( 20015778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool isAMRWB, int32_t bps) { 20025778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (isAMRWB) { 20035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 6600) { 20045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB0; 20055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 8850) { 20065778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB1; 20075778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 12650) { 20085778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB2; 20095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 14250) { 20105778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB3; 20115778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 15850) { 20125778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB4; 20135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 18250) { 20145778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB5; 20155778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 19850) { 20165778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB6; 20175778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 23050) { 20185778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB7; 20195778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20205778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20215778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 23850 bps 20225778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeWB8; 20235778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { // AMRNB 20245778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (bps <= 4750) { 20255778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB0; 20265778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5150) { 20275778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB1; 20285778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 5900) { 20295778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB2; 20305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 6700) { 20315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB3; 20325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7400) { 20335778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB4; 20345778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 7950) { 20355778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB5; 20365778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (bps <= 10200) { 20375778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB6; 20385778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 20395778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20405778822d86b0337407514b9372562b86edfa91cdAndreas Huber // 12200 bps 20415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OMX_AUDIO_AMRBandModeNB7; 20425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2043f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 20455778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAMRCodec(bool encoder, bool isWAMR, int32_t bitrate) { 2046729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_AMRTYPE def; 2047729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 20485778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = encoder ? kPortIndexOutput : kPortIndexInput; 2049729de186450f78c099637e1fce743fe531862c52Andreas Huber 2050729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = 2051729de186450f78c099637e1fce743fe531862c52Andreas Huber mOMX->getParameter(mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 2052729de186450f78c099637e1fce743fe531862c52Andreas Huber 2053729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2054729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2055729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2056729de186450f78c099637e1fce743fe531862c52Andreas Huber 2057729de186450f78c099637e1fce743fe531862c52Andreas Huber def.eAMRFrameFormat = OMX_AUDIO_AMRFrameFormatFSF; 20585778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.eAMRBandMode = pickModeFromBitRate(isWAMR, bitrate); 20595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 20605778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 20615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamAudioAmr, &def, sizeof(def)); 2062729de186450f78c099637e1fce743fe531862c52Andreas Huber 20635778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 20645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 20655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 2066729de186450f78c099637e1fce743fe531862c52Andreas Huber 20675778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupRawAudioFormat( 20685778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder ? kPortIndexInput : kPortIndexOutput, 20695778822d86b0337407514b9372562b86edfa91cdAndreas Huber isWAMR ? 16000 : 8000 /* sampleRate */, 20705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 1 /* numChannels */); 2071729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2072729de186450f78c099637e1fce743fe531862c52Andreas Huber 207317c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissenstatus_t ACodec::setupG711Codec(bool encoder, int32_t sampleRate, int32_t numChannels) { 20745778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(!encoder); // XXX TODO 20755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2076729de186450f78c099637e1fce743fe531862c52Andreas Huber return setupRawAudioFormat( 207717c39e708ed657b8fa66f8acce5128e51696915cMarco Nelissen kPortIndexInput, sampleRate, numChannels); 2078729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2079729de186450f78c099637e1fce743fe531862c52Andreas Huber 20802f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivistatus_t ACodec::setupFlacCodec( 20812f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi bool encoder, int32_t numChannels, int32_t sampleRate, int32_t compressionLevel) { 20822f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 20832f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (encoder) { 20842f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi OMX_AUDIO_PARAM_FLACTYPE def; 20852f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi InitOMXParams(&def); 20862f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nPortIndex = kPortIndexOutput; 20872f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 20882f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi // configure compression level 20892f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi status_t err = mOMX->getParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 20902f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 20912f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d getting OMX_IndexParamAudioFlac parameter", err); 20922f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 20932f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 20942f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi def.nCompressionLevel = compressionLevel; 20952f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi err = mOMX->setParameter(mNode, OMX_IndexParamAudioFlac, &def, sizeof(def)); 20962f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi if (err != OK) { 20972f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi ALOGE("setupFlacCodec(): Error %d setting OMX_IndexParamAudioFlac parameter", err); 20982f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return err; 20992f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 21002f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi } 21012f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 21022f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi return setupRawAudioFormat( 21032f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi encoder ? kPortIndexInput : kPortIndexOutput, 21042f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi sampleRate, 21052f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi numChannels); 21062f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi} 21072f74ef3cdc192f817ee1121f41765f0852c1d81eJean-Michel Trivi 2108729de186450f78c099637e1fce743fe531862c52Andreas Huberstatus_t ACodec::setupRawAudioFormat( 2109729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_U32 portIndex, int32_t sampleRate, int32_t numChannels) { 2110729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 2111729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&def); 2112729de186450f78c099637e1fce743fe531862c52Andreas Huber def.nPortIndex = portIndex; 2113729de186450f78c099637e1fce743fe531862c52Andreas Huber 2114729de186450f78c099637e1fce743fe531862c52Andreas Huber status_t err = mOMX->getParameter( 2115729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2116729de186450f78c099637e1fce743fe531862c52Andreas Huber 2117729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2118729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2119729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2120729de186450f78c099637e1fce743fe531862c52Andreas Huber 2121729de186450f78c099637e1fce743fe531862c52Andreas Huber def.format.audio.eEncoding = OMX_AUDIO_CodingPCM; 2122729de186450f78c099637e1fce743fe531862c52Andreas Huber 2123729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->setParameter( 2124729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 2125729de186450f78c099637e1fce743fe531862c52Andreas Huber 2126729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2127729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2128729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2129729de186450f78c099637e1fce743fe531862c52Andreas Huber 2130729de186450f78c099637e1fce743fe531862c52Andreas Huber OMX_AUDIO_PARAM_PCMMODETYPE pcmParams; 2131729de186450f78c099637e1fce743fe531862c52Andreas Huber InitOMXParams(&pcmParams); 2132729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nPortIndex = portIndex; 2133729de186450f78c099637e1fce743fe531862c52Andreas Huber 2134729de186450f78c099637e1fce743fe531862c52Andreas Huber err = mOMX->getParameter( 2135729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 2136729de186450f78c099637e1fce743fe531862c52Andreas Huber 2137729de186450f78c099637e1fce743fe531862c52Andreas Huber if (err != OK) { 2138729de186450f78c099637e1fce743fe531862c52Andreas Huber return err; 2139729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2140729de186450f78c099637e1fce743fe531862c52Andreas Huber 2141729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nChannels = numChannels; 2142729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.eNumData = OMX_NumericalDataSigned; 2143729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.bInterleaved = OMX_TRUE; 2144729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nBitPerSample = 16; 2145729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.nSamplingRate = sampleRate; 2146729de186450f78c099637e1fce743fe531862c52Andreas Huber pcmParams.ePCMMode = OMX_AUDIO_PCMModeLinear; 2147729de186450f78c099637e1fce743fe531862c52Andreas Huber 2148c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber if (getOMXChannelMapping(numChannels, pcmParams.eChannelMapping) != OK) { 2149c1d8115e8a0bdaeb2b723d395b9a85a02c90c933Andreas Huber return OMX_ErrorNone; 2150729de186450f78c099637e1fce743fe531862c52Andreas Huber } 2151729de186450f78c099637e1fce743fe531862c52Andreas Huber 2152729de186450f78c099637e1fce743fe531862c52Andreas Huber return mOMX->setParameter( 2153729de186450f78c099637e1fce743fe531862c52Andreas Huber mNode, OMX_IndexParamAudioPcm, &pcmParams, sizeof(pcmParams)); 2154729de186450f78c099637e1fce743fe531862c52Andreas Huber} 2155729de186450f78c099637e1fce743fe531862c52Andreas Huber 21565a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t ACodec::configureTunneledVideoPlayback( 215797827bd7c7e64dec22c8fe0f9e734a3c432ad7eeRachad int32_t audioHwSync, const sp<ANativeWindow> &nativeWindow) { 21585a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad native_handle_t* sidebandHandle; 21595a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 21605a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad status_t err = mOMX->configureVideoTunnelMode( 21615a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad mNode, kPortIndexOutput, OMX_TRUE, audioHwSync, &sidebandHandle); 21625a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 21635a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("configureVideoTunnelMode failed! (err %d).", err); 21645a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 21655a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 21665a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 21675a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad err = native_window_set_sideband_stream(nativeWindow.get(), sidebandHandle); 21685a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad if (err != OK) { 21695a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad ALOGE("native_window_set_sideband_stream(%p) failed! (err %d).", 21705a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad sidebandHandle, err); 21715a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return err; 21725a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad } 21735a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 21745a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad return OK; 21755a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad} 21765a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad 2177f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoPortFormatType( 2178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 2179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_CODINGTYPE compressionFormat, 21800d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat, 21810d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar bool usingNativeBuffers) { 2182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PARAM_PORTFORMATTYPE format; 2183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 2184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = portIndex; 2185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = 0; 2186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool found = false; 2187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 index = 0; 2189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (;;) { 2190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nIndex = index; 2191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 2192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2199229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // substitute back flexible color format to codec supported format 2200229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_U32 flexibleEquivalent; 22010d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (compressionFormat == OMX_VIDEO_CodingUnused 22020d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && isFlexibleColorFormat( 22030d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mOMX, mNode, format.eColorFormat, usingNativeBuffers, &flexibleEquivalent) 22040d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && colorFormat == flexibleEquivalent) { 2205229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar ALOGI("[%s] using color format %#x in place of %#x", 2206229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar mComponentName.c_str(), format.eColorFormat, colorFormat); 2207229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar colorFormat = format.eColorFormat; 2208229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 2209229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 2210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The following assertion is violated by TI's video decoder. 2211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // CHECK_EQ(format.nIndex, index); 2212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!strcmp("OMX.TI.Video.encoder", mComponentName.c_str())) { 2214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput 2215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && colorFormat == format.eColorFormat) { 2216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eCompressionFormat does not seem right. 2217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput 2221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && compressionFormat == format.eCompressionFormat) { 2222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // eColorFormat does not seem right. 2223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (format.eCompressionFormat == compressionFormat 2229f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && format.eColorFormat == colorFormat) { 2230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber found = true; 2231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 2232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ++index; 2235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!found) { 2238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return UNKNOWN_ERROR; 2239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->setParameter( 2242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22480d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// Set optimal output format. OMX component lists output formats in the order 22490d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// of preference, but this got more complicated since the introduction of flexible 22500d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// YUV formats. We support a legacy behavior for applications that do not use 22510d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// surface output, do not specify an output format, but expect a "usable" standard 22520d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// OMX format. SW readable and standard formats must be flex-YUV. 22530d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// 22540d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// Suggested preference order: 22550d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal format for texture rendering (mediaplayer behavior) 22560d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal SW readable & texture renderable format (flex-YUV support) 22570d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - optimal SW readable non-renderable format (flex-YUV bytebuffer support) 22580d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// - legacy "usable" standard formats 22590d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// 22600d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// For legacy support, we prefer a standard format, but will settle for a SW readable 22610d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar// flex-YUV format. 22620d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnarstatus_t ACodec::setSupportedOutputFormat(bool getLegacyFlexibleFormat) { 22630d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_VIDEO_PARAM_PORTFORMATTYPE format, legacyFormat; 2264f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&format); 2265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber format.nPortIndex = kPortIndexOutput; 2266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22670d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar InitOMXParams(&legacyFormat); 22680d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // this field will change when we find a suitable legacy format 22690d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar legacyFormat.eColorFormat = OMX_COLOR_FormatUnused; 2270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 22710d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar for (OMX_U32 index = 0; ; ++index) { 22720d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar format.nIndex = index; 22730d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar status_t err = mOMX->getParameter( 22740d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mNode, OMX_IndexParamVideoPortFormat, 22750d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &format, sizeof(format)); 22760d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (err != OK) { 22770d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // no more formats, pick legacy format if found 22780d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (legacyFormat.eColorFormat != OMX_COLOR_FormatUnused) { 22790d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar memcpy(&format, &legacyFormat, sizeof(format)); 22800d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 22810d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22820d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar return err; 22830d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22840d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (format.eCompressionFormat != OMX_VIDEO_CodingUnused) { 22850d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar return OMX_ErrorBadParameter; 22860d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22870d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (!getLegacyFlexibleFormat) { 22880d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 22890d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22900d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // standard formats that were exposed to users before 22910d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (format.eColorFormat == OMX_COLOR_FormatYUV420Planar 22920d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420PackedPlanar 22930d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420SemiPlanar 22940d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_COLOR_FormatYUV420PackedSemiPlanar 22950d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar || format.eColorFormat == OMX_TI_COLOR_FormatYUV420PackedSemiPlanar) { 22960d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar break; 22970d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 22980d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar // find best legacy non-standard format 22990d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar OMX_U32 flexibleEquivalent; 23000d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (legacyFormat.eColorFormat == OMX_COLOR_FormatUnused 23010d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && isFlexibleColorFormat( 23020d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar mOMX, mNode, format.eColorFormat, false /* usingNativeBuffers */, 23030d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &flexibleEquivalent) 23040d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar && flexibleEquivalent == OMX_COLOR_FormatYUV420Flexible) { 23050d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar memcpy(&legacyFormat, &format, sizeof(format)); 23060d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 23070d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 2308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->setParameter( 2309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamVideoPortFormat, 2310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber &format, sizeof(format)); 2311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2312f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2313e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic const struct VideoCodingMapEntry { 2314e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber const char *mMime; 2315e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE mVideoCodingType; 2316e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} kVideoCodingMapEntry[] = { 2317e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_AVC, OMX_VIDEO_CodingAVC }, 23182472b1c0d63454e5d90a982bd6c555de6c3127bdRachad { MEDIA_MIMETYPE_VIDEO_HEVC, OMX_VIDEO_CodingHEVC }, 2319e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG4, OMX_VIDEO_CodingMPEG4 }, 2320e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_H263, OMX_VIDEO_CodingH263 }, 2321e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { MEDIA_MIMETYPE_VIDEO_MPEG2, OMX_VIDEO_CodingMPEG2 }, 232294705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP8, OMX_VIDEO_CodingVP8 }, 232394705aff3c9eef58cbb72ec6fe5d2dcfd9481646hkuang { MEDIA_MIMETYPE_VIDEO_VP9, OMX_VIDEO_CodingVP9 }, 2324e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber}; 2325e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 23265778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic status_t GetVideoCodingTypeFromMime( 23275778822d86b0337407514b9372562b86edfa91cdAndreas Huber const char *mime, OMX_VIDEO_CODINGTYPE *codingType) { 2328e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2329e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2330e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2331e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (!strcasecmp(mime, kVideoCodingMapEntry[i].mMime)) { 2332e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = kVideoCodingMapEntry[i].mVideoCodingType; 2333e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2334e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2336f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2337e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *codingType = OMX_VIDEO_CodingUnused; 2338e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2339e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 2340e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber} 2341e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2342e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huberstatic status_t GetMimeTypeForVideoCoding( 2343e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_VIDEO_CODINGTYPE codingType, AString *mime) { 2344e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber for (size_t i = 0; 2345e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber i < sizeof(kVideoCodingMapEntry) / sizeof(kVideoCodingMapEntry[0]); 2346e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ++i) { 2347e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (codingType == kVideoCodingMapEntry[i].mVideoCodingType) { 2348e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber *mime = kVideoCodingMapEntry[i].mMime; 2349e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return OK; 2350e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2351e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 2352e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2353e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mime->clear(); 2354e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 2355e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber return ERROR_UNSUPPORTED; 23565778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 23575778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23585778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoDecoder( 23590d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar const char *mime, const sp<AMessage> &msg, bool haveNativeWindow) { 236089869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t width, height; 236189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (!msg->findInt32("width", &width) 236289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar || !msg->findInt32("height", &height)) { 236389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar return INVALID_OPERATION; 236489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 236589869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar 23665778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 23675778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 23685778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23695778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 23705778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 23715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 23725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 23735778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 2374f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexInput, compressionFormat, OMX_COLOR_FormatUnused); 2375f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2378f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 238089869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar int32_t tmp; 238189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (msg->findInt32("color-format", &tmp)) { 238289869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar OMX_COLOR_FORMATTYPE colorFormat = 238389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar static_cast<OMX_COLOR_FORMATTYPE>(tmp); 238489869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar err = setVideoPortFormatType( 23850d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar kPortIndexOutput, OMX_VIDEO_CodingUnused, colorFormat, haveNativeWindow); 238689869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar if (err != OK) { 238789869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar ALOGW("[%s] does not support color format %d", 238889869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar mComponentName.c_str(), colorFormat); 23890d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setSupportedOutputFormat(!haveNativeWindow /* getLegacyFlexibleFormat */); 239089869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 239189869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } else { 23920d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar err = setSupportedOutputFormat(!haveNativeWindow /* getLegacyFlexibleFormat */); 239389869f692c35d0ca914c7de4a1f5ff63c9920634Lajos Molnar } 2394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2396f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2397f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2398f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 239978b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad int32_t frameRateInt; 240078b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad float frameRateFloat; 240178b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (!msg->findFloat("frame-rate", &frameRateFloat)) { 240278b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (!msg->findInt32("frame-rate", &frameRateInt)) { 240378b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad frameRateInt = -1; 240478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 240578b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad frameRateFloat = (float)frameRateInt; 240678b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 240778b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad 2408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 240978b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad kPortIndexInput, width, height, compressionFormat, frameRateFloat); 2410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2414f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2415f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = setVideoFormatOnPort( 2416f933441648ef6a71dee783d733aac17b9508b452Andreas Huber kPortIndexOutput, width, height, OMX_VIDEO_CodingUnused); 2417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 2419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 2420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 2421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 2422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 2423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 2424f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 24255778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupVideoEncoder(const char *mime, const sp<AMessage> &msg) { 24265778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 24275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("color-format", &tmp)) { 24285778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24295778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24315778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_COLOR_FORMATTYPE colorFormat = 24325778822d86b0337407514b9372562b86edfa91cdAndreas Huber static_cast<OMX_COLOR_FORMATTYPE>(tmp); 24335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24345778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = setVideoPortFormatType( 24355778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexInput, OMX_VIDEO_CodingUnused, colorFormat); 24365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24385778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support color format %d", 24395778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), colorFormat); 24405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24415778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24425778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24445778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Input port configuration */ 24455778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24465778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 24475778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&def); 24485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24495778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 24505778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24515778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexInput; 24525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24535778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 24545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 24555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 24575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 24585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24605778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t width, height, bitrate; 24615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("width", &width) 24625778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("height", &height) 24635778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("bitrate", &bitrate)) { 24645778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24665778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24675778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 24685778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 24695778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24705778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t stride; 24715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("stride", &stride)) { 24725778822d86b0337407514b9372562b86edfa91cdAndreas Huber stride = width; 24735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24755778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nStride = stride; 24765778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24775778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t sliceHeight; 24785778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("slice-height", &sliceHeight)) { 24795778822d86b0337407514b9372562b86edfa91cdAndreas Huber sliceHeight = height; 24805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24825778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nSliceHeight = sliceHeight; 24835778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24845778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nBufferSize = (video_def->nStride * video_def->nSliceHeight * 3) / 2; 24855778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24865778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 24875778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 24885778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 24895778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 24905778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 24915778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24925778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 24932c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mTimePerFrameUs = (int64_t) (1000000.0f / frameRate); 24945778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 24955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 24965778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 24975778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = OMX_VIDEO_CodingUnused; 2498a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar // this is redundant as it was already set up in setVideoPortFormatType 2499a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar // FIXME for now skip this only for flexible YUV formats 2500a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar if (colorFormat != OMX_COLOR_FormatYUV420Flexible) { 2501a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar video_def->eColorFormat = colorFormat; 2502a32d5435d9585794b72dd12546054f13adb845f2Lajos Molnar } 25035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25045778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 25055778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 25065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25085778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set input port definition parameters.", 25095778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 25105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25115778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25125778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25145778822d86b0337407514b9372562b86edfa91cdAndreas Huber /* Output port configuration */ 25155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25165778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_CODINGTYPE compressionFormat; 25175778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = GetVideoCodingTypeFromMime(mime, &compressionFormat); 25185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25225778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25235778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setVideoPortFormatType( 25245778822d86b0337407514b9372562b86edfa91cdAndreas Huber kPortIndexOutput, compressionFormat, OMX_COLOR_FormatUnused); 25255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25265778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25275778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] does not support compression format %d", 25285778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str(), compressionFormat); 25295778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25305778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25315778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25325778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25335778822d86b0337407514b9372562b86edfa91cdAndreas Huber def.nPortIndex = kPortIndexOutput; 25345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25355778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->getParameter( 25365778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 25375778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25385778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25395778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25405778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25425778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameWidth = width; 25435778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nFrameHeight = height; 25445778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->xFramerate = 0; 25455778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->nBitrate = bitrate; 25465778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eCompressionFormat = compressionFormat; 25475778822d86b0337407514b9372562b86edfa91cdAndreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 25485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25495778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 25505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 25515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 25535778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGE("[%s] failed to set output port definition parameters.", 25545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentName.c_str()); 25555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25565778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25575778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25595778822d86b0337407514b9372562b86edfa91cdAndreas Huber switch (compressionFormat) { 25605778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingMPEG4: 25615778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupMPEG4EncoderParameters(msg); 25625778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 25635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25645778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingH263: 25655778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupH263EncoderParameters(msg); 25665778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 25675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25685778822d86b0337407514b9372562b86edfa91cdAndreas Huber case OMX_VIDEO_CodingAVC: 25695778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = setupAVCEncoderParameters(msg); 25705778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 25715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2572c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad case OMX_VIDEO_CodingHEVC: 2573c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = setupHEVCEncoderParameters(msg); 2574c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad break; 2575c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 257689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP8: 257789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber case OMX_VIDEO_CodingVP9: 257889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber err = setupVPXEncoderParameters(msg); 257989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber break; 258089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 25815778822d86b0337407514b9372562b86edfa91cdAndreas Huber default: 25825778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 25835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 25845778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25855778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGI("setupVideoEncoder succeeded"); 25865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25875778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 25885778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 25895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 25900dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dongstatus_t ACodec::setCyclicIntraMacroblockRefresh(const sp<AMessage> &msg, int32_t mode) { 25910dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong OMX_VIDEO_PARAM_INTRAREFRESHTYPE params; 25920dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong InitOMXParams(¶ms); 25930dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nPortIndex = kPortIndexOutput; 25940dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25950dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode = static_cast<OMX_VIDEO_INTRAREFRESHTYPE>(mode); 25960dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 25970dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshCyclic || 25980dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 25990dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 26000dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-CIR-mbs", &mbs)) { 26010dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 26020dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 26030dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nCirMBs = mbs; 26040dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 26050dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 26060dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (params.eRefreshMode == OMX_VIDEO_IntraRefreshAdaptive || 26070dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.eRefreshMode == OMX_VIDEO_IntraRefreshBoth) { 26080dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t mbs; 26090dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-mbs", &mbs)) { 26100dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 26110dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 26120dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirMBs = mbs; 26130dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 26140dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t ref; 26150dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (!msg->findInt32("intra-refresh-AIR-ref", &ref)) { 26160dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return INVALID_OPERATION; 26170dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 26180dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong params.nAirRef = ref; 26190dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 26200dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 26210dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = mOMX->setParameter( 26220dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong mNode, OMX_IndexParamVideoIntraRefresh, 26230dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ¶ms, sizeof(params)); 26240dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 26250dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong} 26260dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 26275778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatic OMX_U32 setPFramesSpacing(int32_t iFramesInterval, int32_t frameRate) { 26285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (iFramesInterval < 0) { 26295778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0xFFFFFFFF; 26305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (iFramesInterval == 0) { 26315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return 0; 26325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26335778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_U32 ret = frameRate * iFramesInterval; 26345778822d86b0337407514b9372562b86edfa91cdAndreas Huber return ret; 26355778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 26365778822d86b0337407514b9372562b86edfa91cdAndreas Huber 263796076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatic OMX_VIDEO_CONTROLRATETYPE getBitrateMode(const sp<AMessage> &msg) { 263896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t tmp; 263996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber if (!msg->findInt32("bitrate-mode", &tmp)) { 264096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return OMX_Video_ControlRateVariable; 264196076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber } 264296076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 264396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return static_cast<OMX_VIDEO_CONTROLRATETYPE>(tmp); 264496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber} 264596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 26465778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupMPEG4EncoderParameters(const sp<AMessage> &msg) { 26475778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 26485778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 26495778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 26505778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26515778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 265396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 265496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 26555778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 26565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 26575778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 26585778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 26595778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26615778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 26625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26635778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26645778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_MPEG4TYPE mpeg4type; 26655778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&mpeg4type); 26665778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPortIndex = kPortIndexOutput; 26675778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26685778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 26695778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 26705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26715778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 26725778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 26735778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26745778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26755778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nSliceHeaderSpacing = 0; 26765778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bSVH = OMX_FALSE; 26775778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bGov = OMX_FALSE; 26785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26795778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = 26805778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 26815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26825778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 26835778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mpeg4type.nPFrames == 0) { 26845778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 26855778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 26865778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nBFrames = 0; 26875778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nIDCVLCThreshold = 0; 26885778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bACPred = OMX_TRUE; 26895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nMaxPacketSize = 256; 26905778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nTimeIncRes = 1000; 26915778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.nHeaderExtension = 0; 26925778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.bReversibleVLC = OMX_FALSE; 26935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 26945778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 26955778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 26965778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 26975778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 26985778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 26995778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27005778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27015778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 27025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27035778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27045778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27055778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eProfile = static_cast<OMX_VIDEO_MPEG4PROFILETYPE>(profile); 27085778822d86b0337407514b9372562b86edfa91cdAndreas Huber mpeg4type.eLevel = static_cast<OMX_VIDEO_MPEG4LEVELTYPE>(level); 27095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27115778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 27125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoMpeg4, &mpeg4type, sizeof(mpeg4type)); 27135778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27145778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27155778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27165778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27175778822d86b0337407514b9372562b86edfa91cdAndreas Huber 271896076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 27195778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27205778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27215778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27235778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27245778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 27255778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 27265778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27275778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupH263EncoderParameters(const sp<AMessage> &msg) { 27285778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 27295778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 27305778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 27315778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27335778822d86b0337407514b9372562b86edfa91cdAndreas Huber 273496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 273596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 27365778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 27375778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 27385778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 27395778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 27405778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27415778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27425778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 27435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27455778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_H263TYPE h263type; 27465778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h263type); 27475778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPortIndex = kPortIndexOutput; 27485778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27495778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 27505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 27515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27525778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27535778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27545778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27565778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = 27575778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 27585778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27595778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 27605778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h263type.nPFrames == 0) { 27615778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 27625778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27635778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nBFrames = 0; 27645778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27655778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 27665778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 27675778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 27685778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 27695778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 27705778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27715778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27725778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 27735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27755778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27765778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27775778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27785778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eProfile = static_cast<OMX_VIDEO_H263PROFILETYPE>(profile); 27795778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.eLevel = static_cast<OMX_VIDEO_H263LEVELTYPE>(level); 27805778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27815778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27825778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bPLUSPTYPEAllowed = OMX_FALSE; 27835778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.bForceRoundingTypeToZero = OMX_FALSE; 27845778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nPictureHeaderRepetition = 0; 27855778822d86b0337407514b9372562b86edfa91cdAndreas Huber h263type.nGOBHeaderInterval = 0; 27865778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27875778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 27885778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoH263, &h263type, sizeof(h263type)); 27895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27915778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 279496076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber err = configureBitrate(bitrate, bitrateMode); 27955778822d86b0337407514b9372562b86edfa91cdAndreas Huber 27965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 27975778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 27985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 27995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28005778822d86b0337407514b9372562b86edfa91cdAndreas Huber return setupErrorCorrectionParameters(); 28015778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 28025778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2803a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar// static 2804a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnarint /* OMX_VIDEO_AVCLEVELTYPE */ ACodec::getAVCLevelFor( 2805a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int width, int height, int rate, int bitrate, 2806a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar OMX_VIDEO_AVCPROFILETYPE profile) { 2807a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar // convert bitrate to main/baseline profile kbps equivalent 2808a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar switch (profile) { 2809a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar case OMX_VIDEO_AVCProfileHigh10: 2810a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 3000); break; 2811a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar case OMX_VIDEO_AVCProfileHigh: 2812a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 1250); break; 2813a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar default: 2814a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar bitrate = divUp(bitrate, 1000); break; 2815a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2816a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2817a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar // convert size and rate to MBs 2818a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar width = divUp(width, 16); 2819a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar height = divUp(height, 16); 2820a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int mbs = width * height; 2821a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar rate *= mbs; 2822a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar int maxDimension = max(width, height); 2823a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2824a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar static const int limits[][5] = { 2825a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar /* MBps MB dim bitrate level */ 2826a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 1485, 99, 28, 64, OMX_VIDEO_AVCLevel1 }, 2827a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 1485, 99, 28, 128, OMX_VIDEO_AVCLevel1b }, 2828a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 3000, 396, 56, 192, OMX_VIDEO_AVCLevel11 }, 2829a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 6000, 396, 56, 384, OMX_VIDEO_AVCLevel12 }, 2830a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 11880, 396, 56, 768, OMX_VIDEO_AVCLevel13 }, 2831a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 11880, 396, 56, 2000, OMX_VIDEO_AVCLevel2 }, 2832a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 19800, 792, 79, 4000, OMX_VIDEO_AVCLevel21 }, 2833a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 20250, 1620, 113, 4000, OMX_VIDEO_AVCLevel22 }, 2834a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 40500, 1620, 113, 10000, OMX_VIDEO_AVCLevel3 }, 2835a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 108000, 3600, 169, 14000, OMX_VIDEO_AVCLevel31 }, 2836a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 216000, 5120, 202, 20000, OMX_VIDEO_AVCLevel32 }, 2837a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 245760, 8192, 256, 20000, OMX_VIDEO_AVCLevel4 }, 2838a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 245760, 8192, 256, 50000, OMX_VIDEO_AVCLevel41 }, 2839a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 522240, 8704, 263, 50000, OMX_VIDEO_AVCLevel42 }, 2840a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 589824, 22080, 420, 135000, OMX_VIDEO_AVCLevel5 }, 2841a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 983040, 36864, 543, 240000, OMX_VIDEO_AVCLevel51 }, 2842a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar { 2073600, 36864, 543, 240000, OMX_VIDEO_AVCLevel52 }, 2843a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar }; 2844a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 2845a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar for (size_t i = 0; i < ARRAY_SIZE(limits); i++) { 2846a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar const int (&limit)[5] = limits[i]; 2847a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar if (rate <= limit[0] && mbs <= limit[1] && maxDimension <= limit[2] 2848a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar && bitrate <= limit[3]) { 2849a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar return limit[4]; 2850a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2851a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar } 2852a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar return 0; 2853a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar} 2854a147b4f91143d9f2fb608e22f9fca14bbd029573Lajos Molnar 28555778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupAVCEncoderParameters(const sp<AMessage> &msg) { 28565778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t bitrate, iFrameInterval; 28575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("bitrate", &bitrate) 28585778822d86b0337407514b9372562b86edfa91cdAndreas Huber || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 28595778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28605778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28615778822d86b0337407514b9372562b86edfa91cdAndreas Huber 286296076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 286396076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber 28645778822d86b0337407514b9372562b86edfa91cdAndreas Huber float frameRate; 28655778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findFloat("frame-rate", &frameRate)) { 28665778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 28675778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("frame-rate", &tmp)) { 28685778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 28695778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28705778822d86b0337407514b9372562b86edfa91cdAndreas Huber frameRate = (float)tmp; 28715778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28730dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong status_t err = OK; 28740dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong int32_t intraRefreshMode = 0; 28750dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (msg->findInt32("intra-refresh-mode", &intraRefreshMode)) { 28760dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = setCyclicIntraMacroblockRefresh(msg, intraRefreshMode); 28770dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong if (err != OK) { 28780dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong ALOGE("Setting intra macroblock refresh mode (%d) failed: 0x%x", 28790dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err, intraRefreshMode); 28800dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong return err; 28810dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 28820dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong } 28830dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong 28845778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_AVCTYPE h264type; 28855778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&h264type); 28865778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPortIndex = kPortIndexOutput; 28875778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28880dbe5a9321b24b6883fbb2fe97cd9d525128b0b5James Dong err = mOMX->getParameter( 28895778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 28905778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28915778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 28925778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 28935778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 28945778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28955778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = 28965778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP; 28975778822d86b0337407514b9372562b86edfa91cdAndreas Huber 28985778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile; 28995778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findInt32("profile", &profile)) { 29005778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t level; 29015778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("level", &level)) { 29025778822d86b0337407514b9372562b86edfa91cdAndreas Huber return INVALID_OPERATION; 29035778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29055778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = verifySupportForProfileAndLevel(profile, level); 29065778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29075778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29085778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29095778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29115778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = static_cast<OMX_VIDEO_AVCPROFILETYPE>(profile); 29125778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLevel = static_cast<OMX_VIDEO_AVCLEVELTYPE>(level); 29135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29145778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29155778822d86b0337407514b9372562b86edfa91cdAndreas Huber // XXX 29167c25df82dfc8bbedb58608242f0d923a4594bb14James Dong if (h264type.eProfile != OMX_VIDEO_AVCProfileBaseline) { 29177c25df82dfc8bbedb58608242f0d923a4594bb14James Dong ALOGW("Use baseline profile instead of %d for AVC recording", 29187c25df82dfc8bbedb58608242f0d923a4594bb14James Dong h264type.eProfile); 29195778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eProfile = OMX_VIDEO_AVCProfileBaseline; 29205778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29215778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29225778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.eProfile == OMX_VIDEO_AVCProfileBaseline) { 29235778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nSliceHeaderSpacing = 0; 29245778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bUseHadamard = OMX_TRUE; 29255778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefFrames = 1; 29265778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nBFrames = 0; 29275778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nPFrames = setPFramesSpacing(iFrameInterval, frameRate); 29285778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nPFrames == 0) { 29295778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes = OMX_VIDEO_PictureTypeI; 29305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29315778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx10ActiveMinus1 = 0; 29325778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nRefIdx11ActiveMinus1 = 0; 29335778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEntropyCodingCABAC = OMX_FALSE; 29345778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bWeightedPPrediction = OMX_FALSE; 29355778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bconstIpred = OMX_FALSE; 29365778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirect8x8Inference = OMX_FALSE; 29375778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bDirectSpatialTemporal = OMX_FALSE; 29385778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nCabacInitIdc = 0; 29395778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29405778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29415778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (h264type.nBFrames != 0) { 29425778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.nAllowedPictureTypes |= OMX_VIDEO_PictureTypeB; 29435778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29445778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29455778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableUEP = OMX_FALSE; 29465778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableFMO = OMX_FALSE; 29475778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableASO = OMX_FALSE; 29485778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bEnableRS = OMX_FALSE; 29495778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bFrameMBsOnly = OMX_TRUE; 29505778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.bMBAFF = OMX_FALSE; 29515778822d86b0337407514b9372562b86edfa91cdAndreas Huber h264type.eLoopFilterMode = OMX_VIDEO_AVCLoopFilterEnable; 29525778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29535778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = mOMX->setParameter( 29545778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoAvc, &h264type, sizeof(h264type)); 29555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 29565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 29575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 29585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 29595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 296096076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber return configureBitrate(bitrate, bitrateMode); 29615778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 29625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 2963c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachadstatus_t ACodec::setupHEVCEncoderParameters(const sp<AMessage> &msg) { 2964c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t bitrate, iFrameInterval; 2965c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("bitrate", &bitrate) 2966c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad || !msg->findInt32("i-frame-interval", &iFrameInterval)) { 2967c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2968c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2969c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2970c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 2971c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2972c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad float frameRate; 2973c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findFloat("frame-rate", &frameRate)) { 2974c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t tmp; 2975c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("frame-rate", &tmp)) { 2976c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2977c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2978c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad frameRate = (float)tmp; 2979c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2980c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2981c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad OMX_VIDEO_PARAM_HEVCTYPE hevcType; 2982c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad InitOMXParams(&hevcType); 2983c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.nPortIndex = kPortIndexOutput; 2984c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2985c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad status_t err = OK; 2986c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->getParameter( 2987c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 2988c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 2989c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 2990c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2991c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2992c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t profile; 2993c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (msg->findInt32("profile", &profile)) { 2994c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad int32_t level; 2995c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (!msg->findInt32("level", &level)) { 2996c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return INVALID_OPERATION; 2997c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 2998c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 2999c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = verifySupportForProfileAndLevel(profile, level); 3000c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 3001c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 3002c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3003c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3004c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eProfile = static_cast<OMX_VIDEO_HEVCPROFILETYPE>(profile); 3005c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad hevcType.eLevel = static_cast<OMX_VIDEO_HEVCLEVELTYPE>(level); 3006c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3007c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3008c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad // TODO: Need OMX structure definition for setting iFrameInterval 3009c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3010c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad err = mOMX->setParameter( 3011c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoHevc, &hevcType, sizeof(hevcType)); 3012c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad if (err != OK) { 3013c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return err; 3014c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad } 3015c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 3016c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad return configureBitrate(bitrate, bitrateMode); 3017c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad} 3018c8efda9e9cd61dfe8e486c93fa8940b77cc3ccebRachad 301989b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huberstatus_t ACodec::setupVPXEncoderParameters(const sp<AMessage> &msg) { 302089b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber int32_t bitrate; 30214154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t iFrameInterval = 0; 30224154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev size_t tsLayers = 0; 30234154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_ANDROID_VPXTEMPORALLAYERPATTERNTYPE pattern = 30244154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_VPXTemporalLayerPatternNone; 30254154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev static const uint32_t kVp8LayerRateAlloction 30264154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] 30274154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev [OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS] = { 30284154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev {100, 100, 100}, // 1 layer 30294154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 60, 100, 100}, // 2 layers {60%, 40%} 30304154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev { 40, 60, 100}, // 3 layers {40%, 20%, 40%} 30314154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev }; 303289b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber if (!msg->findInt32("bitrate", &bitrate)) { 303389b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return INVALID_OPERATION; 303489b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber } 30354154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev msg->findInt32("i-frame-interval", &iFrameInterval); 303689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 303789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber OMX_VIDEO_CONTROLRATETYPE bitrateMode = getBitrateMode(msg); 303889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 30394154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev float frameRate; 30404154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findFloat("frame-rate", &frameRate)) { 30414154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev int32_t tmp; 30424154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (!msg->findInt32("frame-rate", &tmp)) { 30434154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev return INVALID_OPERATION; 30444154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30454154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev frameRate = (float)tmp; 30464154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30474154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 30484154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev AString tsSchema; 30494154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (msg->findString("ts-schema", &tsSchema)) { 30504154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsSchema == "webrtc.vp8.1-layer") { 30514154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 30524154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 1; 30534154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.2-layer") { 30544154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 30554154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 2; 30564154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else if (tsSchema == "webrtc.vp8.3-layer") { 30574154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev pattern = OMX_VIDEO_VPXTemporalLayerPatternWebRTC; 30584154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev tsLayers = 3; 30594154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } else { 30604154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Unsupported ts-schema [%s]", tsSchema.c_str()); 30614154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30624154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30634154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 30644154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 30654154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev InitOMXParams(&vp8type); 30664154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nPortIndex = kPortIndexOutput; 30674154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev status_t err = mOMX->getParameter( 30684154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 30694154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 30704154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 30714154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err == OK) { 30724154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (iFrameInterval > 0) { 30734154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nKeyFrameInterval = setPFramesSpacing(iFrameInterval, frameRate); 30744154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30754154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.eTemporalPattern = pattern; 30764154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerCount = tsLayers; 30774154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (tsLayers > 0) { 30784154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev for (size_t i = 0; i < OMX_VIDEO_ANDROID_MAXVP8TEMPORALLAYERS; i++) { 30794154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nTemporalLayerBitrateRatio[i] = 30804154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev kVp8LayerRateAlloction[tsLayers - 1][i]; 30814154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30824154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30834154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (bitrateMode == OMX_Video_ControlRateConstant) { 30844154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMinQuantizer = 2; 30854154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev vp8type.nMaxQuantizer = 63; 30864154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30874154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 30884154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev err = mOMX->setParameter( 30894154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev mNode, (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 30904154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev &vp8type, sizeof(vp8type)); 30914154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev if (err != OK) { 30924154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev ALOGW("Extended VP8 parameters set failed: %d", err); 30934154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30944154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev } 30954154795d5526750b7aec5f774831a9e1ba0a3f15Alex Glaznev 309689b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber return configureBitrate(bitrate, bitrateMode); 309789b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber} 309889b31a3f670d8bec87bed50aaad9bcd8edec66b6Andreas Huber 30995778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::verifySupportForProfileAndLevel( 31005778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t profile, int32_t level) { 31015778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_PROFILELEVELTYPE params; 31025778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(¶ms); 31035778822d86b0337407514b9372562b86edfa91cdAndreas Huber params.nPortIndex = kPortIndexOutput; 31045778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31055778822d86b0337407514b9372562b86edfa91cdAndreas Huber for (params.nProfileIndex = 0;; ++params.nProfileIndex) { 31065778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 31075778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, 31085778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_IndexParamVideoProfileLevelQuerySupported, 31095778822d86b0337407514b9372562b86edfa91cdAndreas Huber ¶ms, 31105778822d86b0337407514b9372562b86edfa91cdAndreas Huber sizeof(params)); 31115778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31125778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 31135778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 31145778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 31155778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31165778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedProfile = static_cast<int32_t>(params.eProfile); 31175778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t supportedLevel = static_cast<int32_t>(params.eLevel); 31185778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31195778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (profile == supportedProfile && level <= supportedLevel) { 31205778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; 31215778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 31225778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 31235778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 31245778822d86b0337407514b9372562b86edfa91cdAndreas Huber 312596076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huberstatus_t ACodec::configureBitrate( 312696076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode) { 31275778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_BITRATETYPE bitrateType; 31285778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&bitrateType); 31295778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nPortIndex = kPortIndexOutput; 31305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31315778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 31325778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 31335778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 31345778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31355778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 31365778822d86b0337407514b9372562b86edfa91cdAndreas Huber return err; 31375778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 31385778822d86b0337407514b9372562b86edfa91cdAndreas Huber 313996076964863ee6887f0bed9d0f11f424b48ab9b9Andreas Huber bitrateType.eControlRate = bitrateMode; 31405778822d86b0337407514b9372562b86edfa91cdAndreas Huber bitrateType.nTargetBitrate = bitrate; 31415778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31425778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 31435778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoBitrate, 31445778822d86b0337407514b9372562b86edfa91cdAndreas Huber &bitrateType, sizeof(bitrateType)); 31455778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 31465778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31475778822d86b0337407514b9372562b86edfa91cdAndreas Huberstatus_t ACodec::setupErrorCorrectionParameters() { 31485778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType; 31495778822d86b0337407514b9372562b86edfa91cdAndreas Huber InitOMXParams(&errorCorrectionType); 31505778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nPortIndex = kPortIndexOutput; 31515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31525778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mOMX->getParameter( 31535778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 31545778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 31555778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31565778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 31575778822d86b0337407514b9372562b86edfa91cdAndreas Huber return OK; // Optional feature. Ignore this failure 31585778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 31595778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31605778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableHEC = OMX_FALSE; 31615778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableResync = OMX_TRUE; 31625778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.nResynchMarkerSpacing = 256; 31635778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableDataPartitioning = OMX_FALSE; 31645778822d86b0337407514b9372562b86edfa91cdAndreas Huber errorCorrectionType.bEnableRVLC = OMX_FALSE; 31655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 31665778822d86b0337407514b9372562b86edfa91cdAndreas Huber return mOMX->setParameter( 31675778822d86b0337407514b9372562b86edfa91cdAndreas Huber mNode, OMX_IndexParamVideoErrorCorrection, 31685778822d86b0337407514b9372562b86edfa91cdAndreas Huber &errorCorrectionType, sizeof(errorCorrectionType)); 31695778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 31705778822d86b0337407514b9372562b86edfa91cdAndreas Huber 3171f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::setVideoFormatOnPort( 3172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex, 317378b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad int32_t width, int32_t height, OMX_VIDEO_CODINGTYPE compressionFormat, 317478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad float frameRate) { 3175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 3176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber InitOMXParams(&def); 3177f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nPortIndex = portIndex; 3178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *video_def = &def.format.video; 3180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3181f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mOMX->getParameter( 3182f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 3183f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3184f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(err, (status_t)OK); 3185f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3186f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 3187f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX Need a (much) better heuristic to compute input buffer sizes. 3188f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const size_t X = 64 * 1024; 3189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (def.nBufferSize < X) { 3190f933441648ef6a71dee783d733aac17b9508b452Andreas Huber def.nBufferSize = X; 3191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)def.eDomain, (int)OMX_PortDomainVideo); 3195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameWidth = width; 3197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->nFrameHeight = height; 3198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexInput) { 3200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eCompressionFormat = compressionFormat; 3201f933441648ef6a71dee783d733aac17b9508b452Andreas Huber video_def->eColorFormat = OMX_COLOR_FormatUnused; 320278b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad if (frameRate >= 0) { 320378b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad video_def->xFramerate = (OMX_U32)(frameRate * 65536.0f); 320478b01639c08fe5e7e9c1be5e9dc5de560f1383f9Rachad } 3205f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3206f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3207f933441648ef6a71dee783d733aac17b9508b452Andreas Huber err = mOMX->setParameter( 3208f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)); 3209f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3210f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 3211f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3213f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::initNativeWindow() { 3214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mNativeWindow != NULL) { 3215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_TRUE); 3216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mOMX->enableGraphicBuffers(mNode, kPortIndexOutput, OMX_FALSE); 3219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return OK; 3220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3222d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Hubersize_t ACodec::countBuffersOwnedByComponent(OMX_U32 portIndex) const { 3223d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber size_t n = 0; 3224d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3225d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 3226d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber const BufferInfo &info = mBuffers[portIndex].itemAt(i); 3227d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3228d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_COMPONENT) { 3229d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber ++n; 3230d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 3231d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber } 3232d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 3233d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber return n; 3234d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber} 3235d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 32367e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubersize_t ACodec::countBuffersOwnedByNativeWindow() const { 32377e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber size_t n = 0; 32387e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 32397e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber for (size_t i = 0; i < mBuffers[kPortIndexOutput].size(); ++i) { 32407e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber const BufferInfo &info = mBuffers[kPortIndexOutput].itemAt(i); 32417e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 32427e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (info.mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 32437e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber ++n; 32447e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 32457e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 32467e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 32477e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return n; 32487e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 32497e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 32507e7013392e302a28364df1dcee79b82ad90978b4Andreas Hubervoid ACodec::waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs() { 32517e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber if (mNativeWindow == NULL) { 32527e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber return; 32537e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 32547e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 3255e257e5ebefdd50f808ee3b4d1596db261c9b62ddLajos Molnar while (countBuffersOwnedByNativeWindow() > mNumUndequeuedBuffers 32567e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber && dequeueBufferFromNativeWindow() != NULL) { 3257c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar // these buffers will be submitted as regular buffers; account for this 3258c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar if (mStoreMetaDataInOutputBuffers && mMetaDataBuffersToSubmit > 0) { 3259c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar --mMetaDataBuffersToSubmit; 3260c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar } 32617e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber } 32627e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber} 32637e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 3264f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs( 3265f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 3266f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mBuffers[portIndex].size(); ++i) { 3267f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mBuffers[portIndex].editItemAt(i); 3268f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3269f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus != BufferInfo::OWNED_BY_US 3270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && info->mStatus != BufferInfo::OWNED_BY_NATIVE_WINDOW) { 3271609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] Buffer %u on port %u still has status %d", 3272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mComponentName.c_str(), 3273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mBufferID, portIndex, info->mStatus); 3274f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 3275f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3276f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3277f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 3279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3281f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::allYourBuffersAreBelongToUs() { 3282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return allYourBuffersAreBelongToUs(kPortIndexInput) 3283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && allYourBuffersAreBelongToUs(kPortIndexOutput); 3284f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3286f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::deferMessage(const sp<AMessage> &msg) { 3287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.push_back(msg); 3288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3290f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::processDeferredMessages() { 3291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> > queue = mDeferredQueue; 3292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mDeferredQueue.clear(); 3293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 3294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber List<sp<AMessage> >::iterator it = queue.begin(); 3295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber while (it != queue.end()) { 3296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onMessageReceived(*it++); 3297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 3298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 3299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 330003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar// static 3301229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeDefaultColorFormat(DescribeColorFormatParams ¶ms) { 330203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar MediaImage &image = params.sMediaImage; 330303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar memset(&image, 0, sizeof(image)); 330403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 330503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 330603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 0; 330703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 330803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar const OMX_COLOR_FORMATTYPE fmt = params.eColorFormat; 330903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mWidth = params.nFrameWidth; 331003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mHeight = params.nFrameHeight; 331103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 331203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // only supporting YUV420 331303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar if (fmt != OMX_COLOR_FormatYUV420Planar && 331403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedPlanar && 331503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar fmt != OMX_COLOR_FormatYUV420SemiPlanar && 33165a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar fmt != OMX_COLOR_FormatYUV420PackedSemiPlanar && 33175a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar fmt != HAL_PIXEL_FORMAT_YV12) { 331803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar ALOGW("do not know color format 0x%x = %d", fmt, fmt); 3319229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 332003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 332103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3322b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar // TEMPORARY FIX for some vendors that advertise sliceHeight as 0 3323b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar if (params.nStride != 0 && params.nSliceHeight == 0) { 3324b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar ALOGW("using sliceHeight=%u instead of what codec advertised (=0)", 3325b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar params.nFrameHeight); 3326b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar params.nSliceHeight = params.nFrameHeight; 3327b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar } 3328b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar 3329b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar // we need stride and slice-height to be non-zero 3330b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar if (params.nStride == 0 || params.nSliceHeight == 0) { 3331b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar ALOGW("cannot describe color format 0x%x = %d with stride=%u and sliceHeight=%u", 3332b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar fmt, fmt, params.nStride, params.nSliceHeight); 3333b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar return false; 3334b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar } 3335b32ebac7e3afb49b41eeccf130c8a96c1dae85d1Lajos Molnar 333603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // set-up YUV format 333703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mType = MediaImage::MEDIA_IMAGE_TYPE_YUV; 333803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mNumPlanes = 3; 333903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mBitDepth = 8; 334003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mOffset = 0; 334103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mColInc = 1; 334203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mRowInc = params.nStride; 334303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mHorizSubsampling = 1; 334403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.Y].mVertSubsampling = 1; 334503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 33465a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar switch ((int)fmt) { 33475a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar case HAL_PIXEL_FORMAT_YV12: 33485a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar if (params.bUsingNativeBuffers) { 33495a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar size_t ystride = align(params.nStride, 16); 33505a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar size_t cstride = align(params.nStride / 2, 16); 33515a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.Y].mRowInc = ystride; 33525a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 33535a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mOffset = ystride * params.nSliceHeight; 33545a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mColInc = 1; 33555a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mRowInc = cstride; 33565a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 33575a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 33585a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 33595a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mOffset = image.mPlane[image.V].mOffset 33605a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar + (cstride * params.nSliceHeight / 2); 33615a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mColInc = 1; 33625a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mRowInc = cstride; 33635a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 33645a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 33655a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar break; 33665a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } else { 33675a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar // fall through as YV12 is used for YUV420Planar by some codecs 33685a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar } 33695a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 33705a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar case OMX_COLOR_FormatYUV420Planar: 337103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedPlanar: 337203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 337303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 1; 337403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride / 2; 337503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 337603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 337703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 337803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset 337903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar + (params.nStride * params.nSliceHeight / 4); 338003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 1; 338103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride / 2; 338203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 338303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 338403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 338503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 338603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420SemiPlanar: 338703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // FIXME: NV21 for sw-encoder, NV12 for decoder and hw-encoder 338803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar case OMX_COLOR_FormatYUV420PackedSemiPlanar: 338903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar // NV12 339003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mOffset = params.nStride * params.nSliceHeight; 339103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mColInc = 2; 339203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mRowInc = params.nStride; 339303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mHorizSubsampling = 2; 339403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.U].mVertSubsampling = 2; 339503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 339603c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mOffset = image.mPlane[image.U].mOffset + 1; 339703c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mColInc = 2; 339803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mRowInc = params.nStride; 339903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mHorizSubsampling = 2; 340003c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar image.mPlane[image.V].mVertSubsampling = 2; 340103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar break; 340203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 340303c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar default: 340403c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar TRESPASS(); 340503c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 3406229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3407229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3408229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3409229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3410229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::describeColorFormat( 3411229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 3412229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams &describeParams) 3413229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar{ 3414229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar OMX_INDEXTYPE describeColorFormatIndex; 3415229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (omx->getExtensionIndex( 3416229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, "OMX.google.android.index.describeColorFormat", 3417229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeColorFormatIndex) != OK || 3418229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar omx->getParameter( 3419229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar node, describeColorFormatIndex, 3420229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar &describeParams, sizeof(describeParams)) != OK) { 3421229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeDefaultColorFormat(describeParams); 3422229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3423229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return describeParams.sMediaImage.mType != 3424229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN; 3425229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar} 3426229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3427229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar// static 3428229d242665c612fd97431d1e7ac004823b47f181Lajos Molnarbool ACodec::isFlexibleColorFormat( 3429229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const sp<IOMX> &omx, IOMX::node_id node, 34300d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar uint32_t colorFormat, bool usingNativeBuffers, OMX_U32 *flexibleEquivalent) { 3431229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar DescribeColorFormatParams describeParams; 3432229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar InitOMXParams(&describeParams); 3433229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.eColorFormat = (OMX_COLOR_FORMATTYPE)colorFormat; 3434229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // reasonable dummy values 3435229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameWidth = 128; 3436229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nFrameHeight = 128; 3437229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nStride = 128; 3438229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar describeParams.nSliceHeight = 128; 34390d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.bUsingNativeBuffers = (OMX_BOOL)usingNativeBuffers; 3440229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3441229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar CHECK(flexibleEquivalent != NULL); 3442229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3443229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (!describeColorFormat(omx, node, describeParams)) { 3444229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3445229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3446229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3447229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar const MediaImage &img = describeParams.sMediaImage; 3448229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mType == MediaImage::MEDIA_IMAGE_TYPE_YUV) { 3449229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mNumPlanes != 3 || 3450229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mHorizSubsampling != 1 || 3451229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar img.mPlane[img.Y].mVertSubsampling != 1) { 3452229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 3453229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3454229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar 3455229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // YUV 420 3456229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mPlane[img.U].mHorizSubsampling == 2 3457229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.U].mVertSubsampling == 2 3458229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mHorizSubsampling == 2 3459229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar && img.mPlane[img.V].mVertSubsampling == 2) { 3460229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar // possible flexible YUV420 format 3461229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar if (img.mBitDepth <= 8) { 3462229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar *flexibleEquivalent = OMX_COLOR_FormatYUV420Flexible; 3463229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return true; 3464229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3465229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3466229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar } 3467229d242665c612fd97431d1e7ac004823b47f181Lajos Molnar return false; 346803c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar} 346903c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 3470e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarstatus_t ACodec::getPortFormat(OMX_U32 portIndex, sp<AMessage> ¬ify) { 3471e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // TODO: catch errors an return them instead of using CHECK 347231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_PARAM_PORTDEFINITIONTYPE def; 347331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber InitOMXParams(&def); 3474e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar def.nPortIndex = portIndex; 347531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 347631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber CHECK_EQ(mOMX->getParameter( 347731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mNode, OMX_IndexParamPortDefinition, &def, sizeof(def)), 347831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber (status_t)OK); 347931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3480e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ((int)def.eDir, 3481e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (int)(portIndex == kPortIndexOutput ? OMX_DirOutput : OMX_DirInput)); 348231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 348331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber switch (def.eDomain) { 348431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainVideo: 348531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 348631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_VIDEO_PORTDEFINITIONTYPE *videoDef = &def.format.video; 3487e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar switch ((int)videoDef->eCompressionFormat) { 3488e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_VIDEO_CodingUnused: 3489e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3490e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexOutput)); 3491e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_VIDEO_RAW); 3492e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3493e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("stride", videoDef->nStride); 3494e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("slice-height", videoDef->nSliceHeight); 3495e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("color-format", videoDef->eColorFormat); 3496e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 34970d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (mNativeWindow == NULL) { 34980d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar DescribeColorFormatParams describeParams; 34990d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar InitOMXParams(&describeParams); 35000d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.eColorFormat = videoDef->eColorFormat; 35010d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nFrameWidth = videoDef->nFrameWidth; 35020d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nFrameHeight = videoDef->nFrameHeight; 35030d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nStride = videoDef->nStride; 35040d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.nSliceHeight = videoDef->nSliceHeight; 35050d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar describeParams.bUsingNativeBuffers = OMX_FALSE; 35060d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar 35070d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar if (describeColorFormat(mOMX, mNode, describeParams)) { 35080d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar notify->setBuffer( 35090d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar "image-data", 35100d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar ABuffer::CreateAsCopy( 35110d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar &describeParams.sMediaImage, 35120d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar sizeof(describeParams.sMediaImage))); 35135a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 35145a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar MediaImage *img = &describeParams.sMediaImage; 35155a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("[%s] MediaImage { F(%zux%zu) @%zu+%zu+%zu @%zu+%zu+%zu @%zu+%zu+%zu }", 35165a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar mComponentName.c_str(), img->mWidth, img->mHeight, 35175a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[0].mOffset, img->mPlane[0].mColInc, img->mPlane[0].mRowInc, 35185a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[1].mOffset, img->mPlane[1].mColInc, img->mPlane[1].mRowInc, 35195a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar img->mPlane[2].mOffset, img->mPlane[2].mColInc, img->mPlane[2].mRowInc); 35200d09182a1dde960f7acda1c28469e5deead1b996Lajos Molnar } 352103c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar } 352203c556ae1eb409ad088c49037e185946c54e1d25Lajos Molnar 352391a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar if (portIndex != kPortIndexOutput) { 352491a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar // TODO: also get input crop 352591a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar break; 352691a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar } 352791a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar 3528e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_CONFIG_RECTTYPE rect; 3529e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(&rect); 353091a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar rect.nPortIndex = portIndex; 3531e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3532e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mOMX->getConfig( 353391a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar mNode, 353491a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar (portIndex == kPortIndexOutput ? 353591a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar OMX_IndexConfigCommonOutputCrop : 353691a3cc00db31a713a25848f345bd624ac2ad8dc5Lajos Molnar OMX_IndexConfigCommonInputCrop), 3537e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar &rect, sizeof(rect)) != OK) { 3538e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft = 0; 3539e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop = 0; 3540e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nWidth = videoDef->nFrameWidth; 3541e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nHeight = videoDef->nFrameHeight; 3542e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 354331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3544e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nLeft, 0); 3545e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nTop, 0); 3546e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nWidth, 0u); 3547e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_GE(rect.nHeight, 0u); 3548e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nLeft + rect.nWidth - 1, videoDef->nFrameWidth); 3549e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_LE(rect.nTop + rect.nHeight - 1, videoDef->nFrameHeight); 3550e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3551e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setRect( 3552577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar "crop", 3553577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nLeft, 3554577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar rect.nTop, 3555e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nLeft + rect.nWidth - 1, 3556e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar rect.nTop + rect.nHeight - 1); 3557e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3558e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3559e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 35604730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 35614730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP8: 35624730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case OMX_VIDEO_CodingVP9: 35634730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35644730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia OMX_VIDEO_PARAM_ANDROID_VP8ENCODERTYPE vp8type; 35654730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia InitOMXParams(&vp8type); 35664730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia vp8type.nPortIndex = kPortIndexOutput; 35674730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia status_t err = mOMX->getParameter( 35684730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia mNode, 35694730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia (OMX_INDEXTYPE)OMX_IndexParamVideoAndroidVp8Encoder, 35704730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia &vp8type, 35714730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia sizeof(vp8type)); 35724730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 35734730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (err == OK) { 35744730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia AString tsSchema = "none"; 35754730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia if (vp8type.eTemporalPattern 35764730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia == OMX_VIDEO_VPXTemporalLayerPatternWebRTC) { 35774730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia switch (vp8type.nTemporalLayerCount) { 35784730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 1: 35794730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35804730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.1-layer"; 35814730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 35824730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35834730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 2: 35844730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35854730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.2-layer"; 35864730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 35874730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35884730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia case 3: 35894730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35904730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia tsSchema = "webrtc.vp8.3-layer"; 35914730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 35924730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35934730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia default: 35944730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia { 35954730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia break; 35964730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35974730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35984730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 35994730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia notify->setString("ts-schema", tsSchema); 36004730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 36014730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia // Fall through to set up mime. 36024730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia } 36034730fa07a3290cc3a904dcb16dbb92fcf46c36acWei Jia 3604e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar default: 3605e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3606e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(mIsEncoder ^ (portIndex == kPortIndexInput)); 3607e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 3608e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (GetMimeTypeForVideoCoding( 3609e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar videoDef->eCompressionFormat, &mime) != OK) { 3610e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", "application/octet-stream"); 3611e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else { 3612e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", mime.c_str()); 3613e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3614e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3615e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 361631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 3617e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("width", videoDef->nFrameWidth); 3618e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("height", videoDef->nFrameHeight); 36195a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar ALOGV("[%s] %s format is %s", mComponentName.c_str(), 36205a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar portIndex == kPortIndexInput ? "input" : "output", 36215a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar notify->debugString().c_str()); 36225a52a060fcbe4804bcf4f61b8a457fe0e18a9014Lajos Molnar 362331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 362431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 362531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 362631e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber case OMX_PortDomainAudio: 362731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber { 362831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber OMX_AUDIO_PORTDEFINITIONTYPE *audioDef = &def.format.audio; 362931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 363097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu switch ((int)audioDef->eEncoding) { 3631e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingPCM: 3632e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3633e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_PCMMODETYPE params; 3634e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3635e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3636e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3637e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3638e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioPcm, 3639e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3640e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3641e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 364214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_GT(params.nChannels, 0); 3643e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK(params.nChannels == 1 || params.bInterleaved); 3644e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(params.nBitPerSample, 16u); 364514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 364614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.eNumData, 364714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_NumericalDataSigned); 364814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 364914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber CHECK_EQ((int)params.ePCMMode, 365014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber (int)OMX_AUDIO_PCMModeLinear); 3651e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3652e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_RAW); 3653e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3654e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSamplingRate); 3655e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3656e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (mChannelMaskPresent) { 3657e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-mask", mChannelMask); 36588b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 3659e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 36608b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 36619806555d3930be43e11106281dee354820ac1c88Andreas Huber 3662e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAAC: 3663e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3664e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AACPROFILETYPE params; 3665e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3666e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3667e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3668e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3669e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAac, 3670e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3671e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3672e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3673e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AAC); 3674e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3675e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3676e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3677e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3678e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3679e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingAMR: 3680e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3681e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_AMRTYPE params; 3682e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3683e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 36849806555d3930be43e11106281dee354820ac1c88Andreas Huber 3685e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3686e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioAmr, 3687e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3688e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3689e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3690e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", 1); 3691e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber if (params.eAMRBandMode >= OMX_AUDIO_AMRBandModeWB0) { 3692e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3693e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_WB); 3694e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3695e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 16000); 3696e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } else { 3697e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString( 3698e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber "mime", MEDIA_MIMETYPE_AUDIO_AMR_NB); 3699e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3700e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", 8000); 3701e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3702e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3703e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3704e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3705e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber case OMX_AUDIO_CodingFLAC: 3706e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber { 3707e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber OMX_AUDIO_PARAM_FLACTYPE params; 3708e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber InitOMXParams(¶ms); 3709e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3710e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3711e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber CHECK_EQ(mOMX->getParameter( 3712e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber mNode, OMX_IndexParamAudioFlac, 3713e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber ¶ms, sizeof(params)), 3714e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber (status_t)OK); 3715e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3716e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setString("mime", MEDIA_MIMETYPE_AUDIO_FLAC); 3717e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("channel-count", params.nChannels); 3718e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber notify->setInt32("sample-rate", params.nSampleRate); 3719e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber break; 3720e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 3721e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 3722e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingMP3: 3723e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3724e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_MP3TYPE params; 3725e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3726e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3727e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3728e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3729e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioMp3, 3730e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3731e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3732e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3733e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MPEG); 3734e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3735e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3736e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3737e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3738e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3739e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar case OMX_AUDIO_CodingVORBIS: 3740e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar { 3741e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar OMX_AUDIO_PARAM_VORBISTYPE params; 3742e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar InitOMXParams(¶ms); 3743e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 3744e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3745e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(mOMX->getParameter( 3746e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNode, OMX_IndexParamAudioVorbis, 3747e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ¶ms, sizeof(params)), 3748e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (status_t)OK); 3749e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3750e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setString("mime", MEDIA_MIMETYPE_AUDIO_VORBIS); 3751e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("channel-count", params.nChannels); 3752e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("sample-rate", params.nSampleRate); 3753e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar break; 3754e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3755e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 375697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu case OMX_AUDIO_CodingAndroidAC3: 375797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu { 375897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu OMX_AUDIO_PARAM_ANDROID_AC3TYPE params; 375997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu InitOMXParams(¶ms); 3760e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar params.nPortIndex = portIndex; 376197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 376297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu CHECK_EQ((status_t)OK, mOMX->getParameter( 376397358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu mNode, 376497358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidAc3, 376597358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu ¶ms, 376697358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu sizeof(params))); 376797358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu 376897358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setString("mime", MEDIA_MIMETYPE_AUDIO_AC3); 376997358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("channel-count", params.nChannels); 377097358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu notify->setInt32("sample-rate", params.nSampleRate); 377197358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu break; 377297358c3e1adaf4a744cad78891a16d12e3e9c88eChangwan Ryu } 3773e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber 37748a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad case OMX_AUDIO_CodingAndroidEAC3: 37758a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad { 37768a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad OMX_AUDIO_PARAM_ANDROID_EAC3TYPE params; 37778a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad InitOMXParams(¶ms); 37788a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad params.nPortIndex = portIndex; 37798a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 37808a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad CHECK_EQ((status_t)OK, mOMX->getParameter( 37818a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad mNode, 37828a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidEac3, 37838a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad ¶ms, 37848a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad sizeof(params))); 37858a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 37868a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setString("mime", MEDIA_MIMETYPE_AUDIO_EAC3); 37878a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setInt32("channel-count", params.nChannels); 37888a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad notify->setInt32("sample-rate", params.nSampleRate); 37898a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad break; 37908a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad } 37918a4728966dc9c78e21c3c93a927707e93c05e5e0Rachad 37928c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian case OMX_AUDIO_CodingAndroidOPUS: 37938c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian { 37948c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian OMX_AUDIO_PARAM_ANDROID_OPUSTYPE params; 37958c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian InitOMXParams(¶ms); 37968c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian params.nPortIndex = portIndex; 37978c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 37988c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian CHECK_EQ((status_t)OK, mOMX->getParameter( 37998c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian mNode, 38008c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian (OMX_INDEXTYPE)OMX_IndexParamAudioAndroidOpus, 38018c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian ¶ms, 38028c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian sizeof(params))); 38038c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 38048c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setString("mime", MEDIA_MIMETYPE_AUDIO_OPUS); 38058c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("channel-count", params.nChannels); 38068c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian notify->setInt32("sample-rate", params.nSampleRate); 38078c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian break; 38088c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian } 38098c6693b73cb4aed9d1dcb8d5d0828a77b7471a55Vignesh Venkatasubramanian 381010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang case OMX_AUDIO_CodingG711: 381110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang { 381210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang OMX_AUDIO_PARAM_PCMMODETYPE params; 381310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang InitOMXParams(¶ms); 381410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang params.nPortIndex = portIndex; 381510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 381610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang CHECK_EQ((status_t)OK, mOMX->getParameter( 381710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mNode, 381810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang (OMX_INDEXTYPE)OMX_IndexParamAudioPcm, 381910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang ¶ms, 382010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang sizeof(params))); 382110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 382210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang const char *mime = NULL; 382310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang if (params.ePCMMode == OMX_AUDIO_PCMModeMULaw) { 382410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_G711_MLAW; 382510d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } else if (params.ePCMMode == OMX_AUDIO_PCMModeALaw) { 382610d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_G711_ALAW; 382710d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } else { // params.ePCMMode == OMX_AUDIO_PCMModeLinear 382810d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang mime = MEDIA_MIMETYPE_AUDIO_RAW; 382910d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 383010d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setString("mime", mime); 383110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setInt32("channel-count", params.nChannels); 383210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang notify->setInt32("sample-rate", params.nSamplingRate); 383310d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang break; 383410d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 383541d3f579d2c166984958263533284209b90c87d5Marco Nelissen 383641d3f579d2c166984958263533284209b90c87d5Marco Nelissen case OMX_AUDIO_CodingGSMFR: 383741d3f579d2c166984958263533284209b90c87d5Marco Nelissen { 383841d3f579d2c166984958263533284209b90c87d5Marco Nelissen OMX_AUDIO_PARAM_MP3TYPE params; 383941d3f579d2c166984958263533284209b90c87d5Marco Nelissen InitOMXParams(¶ms); 384041d3f579d2c166984958263533284209b90c87d5Marco Nelissen params.nPortIndex = portIndex; 384141d3f579d2c166984958263533284209b90c87d5Marco Nelissen 384241d3f579d2c166984958263533284209b90c87d5Marco Nelissen CHECK_EQ(mOMX->getParameter( 384341d3f579d2c166984958263533284209b90c87d5Marco Nelissen mNode, OMX_IndexParamAudioPcm, 384441d3f579d2c166984958263533284209b90c87d5Marco Nelissen ¶ms, sizeof(params)), 384541d3f579d2c166984958263533284209b90c87d5Marco Nelissen (status_t)OK); 384641d3f579d2c166984958263533284209b90c87d5Marco Nelissen 384741d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setString("mime", MEDIA_MIMETYPE_AUDIO_MSGSM); 384841d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setInt32("channel-count", params.nChannels); 384941d3f579d2c166984958263533284209b90c87d5Marco Nelissen notify->setInt32("sample-rate", params.nSampleRate); 385041d3f579d2c166984958263533284209b90c87d5Marco Nelissen break; 385110d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang } 385210d023beb0544591d0f5ff556f7f67356f0d9189Chong Zhang 3853e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber default: 3854e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGE("UNKNOWN AUDIO CODING: %d\n", audioDef->eEncoding); 3855e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber TRESPASS(); 3856e96ee699aca0f711d41e6c0833e5de2341c4a36dAndreas Huber } 385731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber break; 385831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 385931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 386031e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber default: 386131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber TRESPASS(); 386231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } 386331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 3864e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar return OK; 3865e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar} 3866e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3867e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnarvoid ACodec::sendFormatChange(const sp<AMessage> &reply) { 38684e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar sp<AMessage> notify = mBaseOutputFormat->dup(); 3869e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setInt32("what", kWhatOutputFormatChanged); 3870e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3871e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK_EQ(getPortFormat(kPortIndexOutput, notify), (status_t)OK); 3872e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3873e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar AString mime; 3874e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findString("mime", &mime)); 3875e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 3876e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t left, top, right, bottom; 3877e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mime == MEDIA_MIMETYPE_VIDEO_RAW && 3878e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mNativeWindow != NULL && 3879e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->findRect("crop", &left, &top, &right, &bottom)) { 3880e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // notify renderer of the crop change 3881e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar // NOTE: native window uses extended right-bottom coordinate 3882e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar reply->setRect("crop", left, top, right + 1, bottom + 1); 3883e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } else if (mime == MEDIA_MIMETYPE_AUDIO_RAW && 3884e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar (mEncoderDelay || mEncoderPadding)) { 3885e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar int32_t channelCount; 3886e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar CHECK(notify->findInt32("channel-count", &channelCount)); 3887e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t frameSize = channelCount * sizeof(int16_t); 3888e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (mSkipCutBuffer != NULL) { 3889e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar size_t prevbufsize = mSkipCutBuffer->size(); 3890e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar if (prevbufsize != 0) { 3891e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar ALOGW("Replacing SkipCutBuffer holding %d " 3892e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar "bytes", 3893e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar prevbufsize); 3894e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3895e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3896e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mSkipCutBuffer = new SkipCutBuffer( 3897e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderDelay * frameSize, 3898e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mEncoderPadding * frameSize); 3899e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar } 3900e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar 390131e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber notify->post(); 390231e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 390331e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mSentFormat = true; 390431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber} 390531e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 39065778822d86b0337407514b9372562b86edfa91cdAndreas Hubervoid ACodec::signalError(OMX_ERRORTYPE error, status_t internalError) { 3907cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber sp<AMessage> notify = mNotify->dup(); 3908d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatError); 3909251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGE("signalError(omxError %#x, internalError %d)", error, internalError); 3910251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung 3911251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (internalError == UNKNOWN_ERROR) { // find better error code 3912251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung const status_t omxStatus = statusFromOMXError(error); 3913251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (omxStatus != 0) { 3914251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung internalError = omxStatus; 3915251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } else { 3916251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", error); 3917251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 3918251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 39195778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("err", internalError); 3920251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung notify->setInt32("actionCode", ACTION_CODE_FATAL); // could translate from OMX error. 3921cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber notify->post(); 3922cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber} 3923cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber 3924bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huberstatus_t ACodec::pushBlankBuffersToNativeWindow() { 3925bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber status_t err = NO_ERROR; 3926bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ANativeWindowBuffer* anb = NULL; 3927bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int numBufs = 0; 3928bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber int minUndequeuedBufs = 0; 3929bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3930bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We need to reconnect to the ANativeWindow as a CPU client to ensure that 3931bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // no frames get dropped by SurfaceFlinger assuming that these are video 3932bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // frames. 3933bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 3934bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 3935bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3936bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 3937bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3938bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3939bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3940bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3941bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 3942bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 3943bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3944bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 3945bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3946bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 3947bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3948bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3949bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffers_geometry(mNativeWindow.get(), 1, 1, 3950bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber HAL_PIXEL_FORMAT_RGBX_8888); 3951bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3952bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffers_geometry failed: %s (%d)", 3953bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3954bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3955bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3956bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 395787eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin err = native_window_set_scaling_mode(mNativeWindow.get(), 395887eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin NATIVE_WINDOW_SCALING_MODE_SCALE_TO_WINDOW); 395987eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin if (err != NO_ERROR) { 396087eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin ALOGE("error pushing blank_frames: set_scaling_mode failed: %s (%d)", 396187eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin strerror(-err), -err); 396287eb285dca94b20dc5f0ff8e60a0d395a4ca3be9Dima Zavin goto error; 3963bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3964bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3965bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_usage(mNativeWindow.get(), 3966bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber GRALLOC_USAGE_SW_WRITE_OFTEN); 3967bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3968bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_usage failed: %s (%d)", 3969bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3970bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3971bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3972bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3973bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->query(mNativeWindow.get(), 3974bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &minUndequeuedBufs); 3975bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3976bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: MIN_UNDEQUEUED_BUFFERS query " 3977bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber "failed: %s (%d)", strerror(-err), -err); 3978bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3979bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3980bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3981bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber numBufs = minUndequeuedBufs + 1; 3982bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_set_buffer_count(mNativeWindow.get(), numBufs); 3983bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3984bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: set_buffer_count failed: %s (%d)", 3985bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3986bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3987bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 3988bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 3989bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push numBufs + 1 buffers to ensure that we've drawn into the same 3990bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // buffer twice. This should guarantee that the buffer has been displayed 3991bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // on the screen and then been replaced, so an previous video frames are 3992bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // guaranteed NOT to be currently displayed. 3993bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber for (int i = 0; i < numBufs + 1; i++) { 39941e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis err = native_window_dequeue_buffer_and_wait(mNativeWindow.get(), &anb); 3995bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 3996bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: dequeueBuffer failed: %s (%d)", 3997bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 3998bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 3999bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4000bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4001bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber sp<GraphicBuffer> buf(new GraphicBuffer(anb, false)); 4002bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4003bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Fill the buffer with the a 1x1 checkerboard pattern ;) 4004bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber uint32_t* img = NULL; 4005bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->lock(GRALLOC_USAGE_SW_WRITE_OFTEN, (void**)(&img)); 4006bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 4007bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: lock failed: %s (%d)", 4008bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 4009bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 4010bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4011bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4012bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber *img = 0; 4013bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4014bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = buf->unlock(); 4015bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 4016bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: unlock failed: %s (%d)", 4017bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 4018bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 4019bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4020bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4021bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = mNativeWindow->queueBuffer(mNativeWindow.get(), 40221e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis buf->getNativeBuffer(), -1); 4023bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 4024bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: queueBuffer failed: %s (%d)", 4025bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 4026bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber goto error; 4027bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4028bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4029bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber anb = NULL; 4030bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4031bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4032bc098410be55f9d96f394b3981a0c482b83859b6Andreas Hubererror: 4033bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4034bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 4035bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after an error. 4036bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (anb != NULL) { 40371e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis mNativeWindow->cancelBuffer(mNativeWindow.get(), anb, -1); 4038bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4039bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4040bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_disconnect(mNativeWindow.get(), 4041bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 4042bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber native_window_api_connect(mNativeWindow.get(), 4043bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 4044bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4045bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 4046bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } else { 4047bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // Clean up after success. 4048bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_disconnect(mNativeWindow.get(), 4049bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_CPU); 4050bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 4051bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_disconnect failed: %s (%d)", 4052bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 4053bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 4054bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4055bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4056bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber err = native_window_api_connect(mNativeWindow.get(), 4057bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber NATIVE_WINDOW_API_MEDIA); 4058bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber if (err != NO_ERROR) { 4059bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber ALOGE("error pushing blank frames: api_connect failed: %s (%d)", 4060bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber strerror(-err), -err); 4061bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return err; 4062bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4063bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4064bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber return NO_ERROR; 4065bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 4066bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber} 4067bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 4068f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4069f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4070eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberACodec::PortDescription::PortDescription() { 4071eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4072eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4073496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huberstatus_t ACodec::requestIDRFrame() { 4074496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (!mIsEncoder) { 4075496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return ERROR_UNSUPPORTED; 4076496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 4077496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4078496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_CONFIG_INTRAREFRESHVOPTYPE params; 4079496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber InitOMXParams(¶ms); 4080496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4081496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.nPortIndex = kPortIndexOutput; 4082496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber params.IntraRefreshVOP = OMX_TRUE; 4083496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4084496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber return mOMX->setConfig( 4085496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber mNode, 4086496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber OMX_IndexConfigVideoIntraVOPRefresh, 4087496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ¶ms, 4088496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber sizeof(params)); 4089496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber} 4090496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 4091eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubervoid ACodec::PortDescription::addBuffer( 4092eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber IOMX::buffer_id id, const sp<ABuffer> &buffer) { 4093eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBufferIDs.push_back(id); 4094eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber mBuffers.push_back(buffer); 4095eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4096eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4097eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersize_t ACodec::PortDescription::countBuffers() { 4098eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.size(); 4099eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4100eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4101eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas HuberIOMX::buffer_id ACodec::PortDescription::bufferIDAt(size_t index) const { 4102eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBufferIDs.itemAt(index); 4103eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4104eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4105eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Hubersp<ABuffer> ACodec::PortDescription::bufferAt(size_t index) const { 4106eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber return mBuffers.itemAt(index); 4107eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber} 4108eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4109eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber//////////////////////////////////////////////////////////////////////////////// 4110eb61431af13741aa8b7e57a39f69bba5a6c190dcAndreas Huber 4111f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::BaseState(ACodec *codec, const sp<AState> &parentState) 4112f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : AState(parentState), 4113f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec(codec) { 4114f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4115f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4116ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas HuberACodec::BaseState::PortMode ACodec::BaseState::getPortMode( 4117ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 4118f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return KEEP_BUFFERS; 4119f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4120f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4121f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onMessageReceived(const sp<AMessage> &msg) { 4122f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4123f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatInputBufferFilled: 4124f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4125f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onInputBufferFilled(msg); 4126f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4127f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4128f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4129f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatOutputBufferDrained: 4130f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4131f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onOutputBufferDrained(msg); 4132f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4133f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4134f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4135f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatOMXMessage: 4136f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4137f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXMessage(msg); 4138f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4139f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 41417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 41427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 4143251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This may result in an app illegal state exception. 41447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("Message 0x%x was not handled", msg->what()); 41457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->signalError(OMX_ErrorUndefined, INVALID_OPERATION); 41467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden return true; 41477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 41487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 4149ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber case ACodec::kWhatOMXDied: 4150ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber { 4151251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // This will result in kFlagSawMediaServerDie handling in MediaCodec. 4152ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber ALOGE("OMX/mediaserver died, signalling error!"); 4153ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->signalError(OMX_ErrorResourcesLost, DEAD_OBJECT); 4154ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber break; 4155ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4156ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 415730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar case ACodec::kWhatReleaseCodecInstance: 415830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar { 415930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar ALOGI("[%s] forcing the release of codec", 416030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar mCodec->mComponentName.c_str()); 416130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar status_t err = mCodec->mOMX->freeNode(mCodec->mNode); 416230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar ALOGE_IF("[%s] failed to release codec instance: err=%d", 416330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar mCodec->mComponentName.c_str(), err); 416430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 416530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 416630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar notify->post(); 416730358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar break; 416830358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 416930358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 4170f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4171f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4172f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4173f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4174f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4175f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4176f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4177f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXMessage(const sp<AMessage> &msg) { 4178f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t type; 4179f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("type", &type)); 4180f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 41815e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // there is a possibility that this is an outstanding message for a 41825e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar // codec that we have already destroyed 41835e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar if (mCodec->mNode == NULL) { 41845e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar ALOGI("ignoring message as already freed component: %s", 41855e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar msg->debugString().c_str()); 41865e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar return true; 41875e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar } 41885e184b0d12f1ec436246a391da8d9355cc21ee08Lajos Molnar 4189f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::node_id nodeID; 4190609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("node", (int32_t*)&nodeID)); 4191f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(nodeID, mCodec->mNode); 4192f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4193f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (type) { 4194f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EVENT: 4195f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4196f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t event, data1, data2; 4197f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("event", &event)); 4198f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data1", &data1)); 4199f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("data2", &data2)); 4200f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 42010af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber if (event == OMX_EventCmdComplete 42020af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data1 == OMX_CommandFlush 42030af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber && data2 == (int32_t)OMX_ALL) { 42040af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // Use of this notification is not consistent across 42050af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // implementations. We'll drop this notification and rely 42060af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // on flush-complete notifications on the individual port 42070af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber // indices instead. 42080af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 42090af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber return true; 42100af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber } 42110af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 4212f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEvent( 4213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_EVENTTYPE>(event), 4214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data1), 4215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber static_cast<OMX_U32>(data2)); 4216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::EMPTY_BUFFER_DONE: 4219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4220f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4221609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 4222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXEmptyBufferDone(bufferID); 4224f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4225f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case omx_message::FILL_BUFFER_DONE: 4227f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4228f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4229609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer", (int32_t*)&bufferID)); 4230f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4231f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t rangeOffset, rangeLength, flags; 4232f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 4233f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4234f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_offset", &rangeOffset)); 4235f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("range_length", &rangeLength)); 4236f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("flags", &flags)); 4237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt64("timestamp", &timeUs)); 4238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4239f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return onOMXFillBufferDone( 4240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (size_t)rangeOffset, (size_t)rangeLength, 4242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (OMX_U32)flags, 4243784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung timeUs); 4244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 4248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4249f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4251f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4252f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEvent( 4253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 4254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (event != OMX_EventError) { 42553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] EVENT(%d, 0x%08lx, 0x%08lx)", 4256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), event, data1, data2); 4257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4258f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 4259f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4260f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 426129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("[%s] ERROR(0x%08lx)", mCodec->mComponentName.c_str(), data1); 4262f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4263251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung // verify OMX component sends back an error we expect. 4264251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung OMX_ERRORTYPE omxError = (OMX_ERRORTYPE)data1; 4265251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung if (!isOMXError(omxError)) { 4266251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung ALOGW("Invalid OMX error %#x", omxError); 4267251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung omxError = OMX_ErrorUndefined; 4268251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung } 4269251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(omxError); 4270f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4271f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4272f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4273f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4274f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) { 42753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] onOMXEmptyBufferDone %p", 4276349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 4277349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4278f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexInput, bufferID); 4280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 428496e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // We're in "store-metadata-in-buffers" mode, the underlying 428596e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // OMX component had access to data that's implicitly refcounted 428696e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // by this "MediaBuffer" object. Now that the OMX component has 428796e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // told us that it's done with the input buffer, we can decrement 428896e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia // the mediaBuffer's reference count. 428996e92b58b7e9647b4c7c2f54b62a1b357ab06b66Wei Jia info->mData->setMediaBufferBase(NULL); 4290d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexInput); 4292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(info); 4299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); // Not currently used 4305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4308f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4312f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::postFillThisBuffer(BufferInfo *info) { 4313f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4316f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 4318f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4320d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFillThisBuffer); 4321609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 4322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mData->meta()->clear(); 43242d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 4325f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43261d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> reply = new AMessage(kWhatInputBufferFilled, mCodec); 4327609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4328f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4329f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->setMessage("reply", reply); 4330f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4331f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4332f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4333f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_UPSTREAM; 4334f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4335f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4336f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) { 4337f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4338609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 43392d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber sp<ABuffer> buffer; 4340f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t err = OK; 43415778822d86b0337407514b9372562b86edfa91cdAndreas Huber bool eos = false; 4342a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar PortMode mode = getPortMode(kPortIndexInput); 43435778822d86b0337407514b9372562b86edfa91cdAndreas Huber 43442d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber if (!msg->findBuffer("buffer", &buffer)) { 4345a73c954d947748a3b6f630cf2c160fe55ec596e3Lajos Molnar /* these are unfilled buffers returned by client */ 4346f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(msg->findInt32("err", &err)); 4347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43487fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar if (err == OK) { 43497fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar /* buffers with no errors are returned on MediaCodec.flush */ 43507fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mode = KEEP_BUFFERS; 43517fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } else { 43527fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar ALOGV("[%s] saw error %d instead of an input buffer", 43537fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar mCodec->mComponentName.c_str(), err); 43547fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar eos = true; 43557fa015217e618265ff5a844cf6961ecc316c81a4Lajos Molnar } 43563831a066bcf1019864a94d2bc7b4c9241efc5c22Andreas Huber 43572d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber buffer.clear(); 4358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43605778822d86b0337407514b9372562b86edfa91cdAndreas Huber int32_t tmp; 43615778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) { 43625778822d86b0337407514b9372562b86edfa91cdAndreas Huber eos = true; 43635778822d86b0337407514b9372562b86edfa91cdAndreas Huber err = ERROR_END_OF_STREAM; 43645778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 43655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = mCodec->findBufferByID(kPortIndexInput, bufferID); 4367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_UPSTREAM); 4368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4373f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 43745778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 4375dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (!mCodec->mPortEOS[kPortIndexInput]) { 4376dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4377dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4378dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 4379f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4383f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4384f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 43855778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (buffer != NULL && !mCodec->mPortEOS[kPortIndexInput]) { 4386f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int64_t timeUs; 4387f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(buffer->meta()->findInt64("timeUs", &timeUs)); 4388f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4389f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags = OMX_BUFFERFLAG_ENDOFFRAME; 4390f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4391f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t isCSD; 4392f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer->meta()->findInt32("csd", &isCSD) && isCSD != 0) { 4393f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags |= OMX_BUFFERFLAG_CODECCONFIG; 4394f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4395f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 43965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (eos) { 43975778822d86b0337407514b9372562b86edfa91cdAndreas Huber flags |= OMX_BUFFERFLAG_EOS; 43985778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 43995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (buffer != info->mData) { 4401d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGV("[%s] Needs to copy input data for buffer %p. (%p != %p)", 4402d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), 4403d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber bufferID, 4404d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber buffer.get(), info->mData.get()); 4405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_LE(buffer->size(), info->mData->capacity()); 4407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber memcpy(info->mData->data(), buffer->data(), buffer->size()); 4408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4410078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber if (flags & OMX_BUFFERFLAG_CODECCONFIG) { 44113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ codec specific data", 4412078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID); 44135778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else if (flags & OMX_BUFFERFLAG_EOS) { 44145778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] calling emptyBuffer %p w/ EOS", 44155778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID); 4416078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } else { 4417d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4418d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("[%s] calling emptyBuffer %p w/ time %lld us", 4419d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 4420d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#else 44213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p w/ time %lld us", 4422078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs); 4423d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4424078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber } 4425349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4426d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4427d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats stats; 4428d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mEmptyBufferTimeUs = ALooper::GetNowUs(); 4429d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats.mFillBufferDoneTimeUs = -1ll; 4430d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.add(timeUs, stats); 4431d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4432d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4433054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 4434054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // try to submit an output buffer for each input buffer 4435054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar PortMode outputMode = getPortMode(kPortIndexOutput); 4436054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4437054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar ALOGV("MetaDataBuffersToSubmit=%u portMode=%s", 4438054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit, 4439054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar (outputMode == FREE_BUFFERS ? "FREE" : 4440054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar outputMode == KEEP_BUFFERS ? "KEEP" : "RESUBMIT")); 4441054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (outputMode == RESUBMIT_BUFFERS) { 4442e53350373ac516257b4f8956ff1e3f1ac48f607eLajos Molnar mCodec->submitOutputMetaDataBuffer(); 4443054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4444054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 4445054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4446f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 4447f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4448f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4449f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4450f933441648ef6a71dee783d733aac17b9508b452Andreas Huber buffer->size(), 4451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber flags, 4452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber timeUs), 4453f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4454f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44575778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!eos) { 44585778822d86b0337407514b9372562b86edfa91cdAndreas Huber getMoreInputDataIfPossible(); 44595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 44605778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] Signalled EOS on the input port", 44615778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str()); 44625778822d86b0337407514b9372562b86edfa91cdAndreas Huber 44635778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 44645778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mInputEOSResult = err; 44655778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4466f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (!mCodec->mPortEOS[kPortIndexInput]) { 4467dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber if (err != ERROR_END_OF_STREAM) { 44683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port " 4469dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber "due to error %d", 4470dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str(), err); 4471dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } else { 44723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Signalling EOS on the input port", 4473dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mComponentName.c_str()); 4474dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber } 4475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 44763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling emptyBuffer %p signalling EOS", 4477349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), bufferID); 4478349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->emptyBuffer( 4480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 4481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bufferID, 4482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0, 4484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_BUFFERFLAG_EOS, 4485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 0), 4486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 4487f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4488f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4489f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4490f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = true; 4491dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = err; 4492f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4493f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4494f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4495625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih 4496625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih default: 4497625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4498625b93f1971039a547b239f87a2dc8a8d5716589Robert Shih break; 4499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4502f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::getMoreInputDataIfPossible() { 4503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mPortEOS[kPortIndexInput]) { 4504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *eligible = NULL; 4508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 4510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 4511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#if 0 4513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_UPSTREAM) { 4514f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // There's already a "read" pending. 4515f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4516f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4517f933441648ef6a71dee783d733aac17b9508b452Andreas Huber#endif 4518f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4519f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_US) { 4520f933441648ef6a71dee783d733aac17b9508b452Andreas Huber eligible = info; 4521f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4522f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4523f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4524f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (eligible == NULL) { 4525f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return; 4526f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4527f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4528f933441648ef6a71dee783d733aac17b9508b452Andreas Huber postFillThisBuffer(eligible); 4529f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4530f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4531f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::BaseState::onOMXFillBufferDone( 4532f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID, 4533f933441648ef6a71dee783d733aac17b9508b452Andreas Huber size_t rangeOffset, size_t rangeLength, 4534f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 flags, 4535784e24e386b088c05d653ab482f2e95cb53e3d01Andy Hung int64_t timeUs) { 4536609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] onOMXFillBufferDone %u time %" PRId64 " us, flags = 0x%08x", 45375778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), bufferID, timeUs, flags); 4538349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4539f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4540d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4541d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#if TRACK_BUFFER_TIMING 4542d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber index = mCodec->mBufferStats.indexOfKey(timeUs); 4543d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber if (index >= 0) { 4544d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ACodec::BufferStats *stats = &mCodec->mBufferStats.editValueAt(index); 4545d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs = ALooper::GetNowUs(); 4546d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4547d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber ALOGI("frame PTS %lld: %lld", 4548d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber timeUs, 4549d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats->mFillBufferDoneTimeUs - stats->mEmptyBufferTimeUs); 4550d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4551d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber mCodec->mBufferStats.removeItemsAt(index); 4552d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber stats = NULL; 4553d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber } 4554d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber#endif 4555d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber 4556f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4557f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4558f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4559f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_COMPONENT); 4560f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4561054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar info->mDequeuedAt = ++mCodec->mDequeueCounter; 4562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4570f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4571f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4572a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar if (rangeLength == 0 && (!(flags & OMX_BUFFERFLAG_EOS) 4573a0940a569f2bc24b00dc10ce0fa7658b1dc3a3a5Lajos Molnar || mCodec->mPortEOS[kPortIndexOutput])) { 4574609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 45755778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4576349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 45775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer( 45785778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, info->mBufferID), 45795778822d86b0337407514b9372562b86edfa91cdAndreas Huber (status_t)OK); 4580f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 45815778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 45825778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 45835778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 458431e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 4585577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar sp<AMessage> reply = 45861d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar new AMessage(kWhatOutputBufferDrained, mCodec); 4587577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 45884bdda35319d5f46efea2089b865c8a64816389cdMarco Nelissen if (!mCodec->mSentFormat && rangeLength > 0) { 4589577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->sendFormatChange(reply); 45905778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4591f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4592308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang if (mCodec->mUseMetadataOnEncoderOutput) { 4593308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang native_handle_t* handle = 4594308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang *(native_handle_t**)(info->mData->data() + 4); 4595308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setPointer("handle", handle); 4596308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeOffset", rangeOffset); 4597308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->meta()->setInt32("rangeLength", rangeLength); 4598308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } else { 4599308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang info->mData->setRange(rangeOffset, rangeLength); 4600308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang } 4601496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber#if 0 460221ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen if (mCodec->mNativeWindow == NULL) { 4603496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (IsIDR(info->mData)) { 4604496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGI("IDR frame"); 4605496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 46065778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 460721ad778dcfcddb8f8fd9dc3fe4992fbef246c511Marco Nelissen#endif 4608f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46098b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 46108b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen mCodec->mSkipCutBuffer->submit(info->mData); 46118b71241ce7353731ab75322c46e090ee35014a33Marco Nelissen } 46125778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mData->meta()->setInt64("timeUs", timeUs); 4613f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46145778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4615d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatDrainThisBuffer); 4616609b815a3131d22da38b2f452faa9f89daad4039Andy Hung notify->setInt32("buffer-id", info->mBufferID); 46172d8bedd05437b6fccdbc6bf70f673ffd86744d59Andreas Huber notify->setBuffer("buffer", info->mData); 46185778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setInt32("flags", flags); 4619f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4620609b815a3131d22da38b2f452faa9f89daad4039Andy Hung reply->setInt32("buffer-id", info->mBufferID); 4621f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46225778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setMessage("reply", reply); 4623f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 46245778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 46255778822d86b0337407514b9372562b86edfa91cdAndreas Huber 46265778822d86b0337407514b9372562b86edfa91cdAndreas Huber info->mStatus = BufferInfo::OWNED_BY_DOWNSTREAM; 4627f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4628f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (flags & OMX_BUFFERFLAG_EOS) { 46295778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("[%s] saw output EOS", mCodec->mComponentName.c_str()); 46305778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4631f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4632d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatEOS); 4633dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber notify->setInt32("err", mCodec->mInputEOSResult); 4634f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4635f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4636f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = true; 4637f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4638f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4639f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4640f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4641f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4642f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4643f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4644f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4645f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4646f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4647f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4648f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4649f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4650f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 4652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4654f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) { 4655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber IOMX::buffer_id bufferID; 4656609b815a3131d22da38b2f452faa9f89daad4039Andy Hung CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID)); 4657f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ssize_t index; 4658f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = 4659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); 4660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); 4661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4662577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar android_native_rect_t crop; 4663577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar if (msg->findRect("crop", 4664577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar &crop.left, &crop.top, &crop.right, &crop.bottom)) { 4665577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar CHECK_EQ(0, native_window_set_crop( 4666577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar mCodec->mNativeWindow.get(), &crop)); 4667577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar } 4668577db6d42b8d83b3578c7e56b1391bdaca9cb705Lajos Molnar 4669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber int32_t render; 4670f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL 46716aade6058521b0dbd35a9a4620f4d04f02f90444Marco Nelissen && msg->findInt32("render", &render) && render != 0 467279ee2399b67c7a11042c5904dc1309712a76f8cbJianzheng Zhou && info->mData != NULL && info->mData->size() != 0) { 46736fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("render"); 4674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // The client wants this buffer to be rendered. 4675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4676fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar int64_t timestampNs = 0; 4677fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (!msg->findInt64("timestampNs", ×tampNs)) { 4678fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // TODO: it seems like we should use the timestamp 4679fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // in the (media)buffer as it potentially came from 4680fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // an input surface, but we did not propagate it prior to 4681fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar // API 20. Perhaps check for target SDK version. 4682fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#if 0 4683fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (info->mData->meta()->findInt64("timeUs", ×tampNs)) { 468447aea1f7c58f5302b16822f9e7e1763f2af04ef5Lajos Molnar ALOGV("using buffer PTS of %" PRId64, timestampNs); 4685fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar timestampNs *= 1000; 4686fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4687fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar#endif 4688fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4689fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 46905778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err; 4691fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar err = native_window_set_buffers_timestamp(mCodec->mNativeWindow.get(), timestampNs); 4692fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar if (err != OK) { 4693fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar ALOGW("failed to set buffer timestamp: %d", err); 4694fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar } 4695fc7fca77caa12993dd938d5ff43797d781291027Lajos Molnar 46965778822d86b0337407514b9372562b86edfa91cdAndreas Huber if ((err = mCodec->mNativeWindow->queueBuffer( 4697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNativeWindow.get(), 46981e5b2b3361ddd07259bf4b29820ca4aa5f3a861bJamie Gennis info->mGraphicBuffer.get(), -1)) == OK) { 4699cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW; 4700cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } else { 4701251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 4702cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4703cc54fbaa69c0b69929467449d2c19192f15b5039Andreas Huber } 4704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 47056fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar if (mCodec->mNativeWindow != NULL && 47066fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar (info->mData == NULL || info->mData->size() != 0)) { 47076fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar ATRACE_NAME("frame-drop"); 47086fbc1afd36f514f8b8d36ce67f5e69776c690bd2Lajos Molnar } 4709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_US; 4710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4712f933441648ef6a71dee783d733aac17b9508b452Andreas Huber PortMode mode = getPortMode(kPortIndexOutput); 4713f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (mode) { 4715f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case KEEP_BUFFERS: 4716f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4717f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // XXX fishy, revisit!!! What about the FREE_BUFFERS case below? 4718f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case RESUBMIT_BUFFERS: 4729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!mCodec->mPortEOS[kPortIndexOutput]) { 4731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 4732f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We cannot resubmit the buffer we just rendered, dequeue 4733f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // the spare instead. 4734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info = mCodec->dequeueBufferFromNativeWindow(); 4736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4737f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4738c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (info != NULL) { 4739609b815a3131d22da38b2f452faa9f89daad4039Andy Hung ALOGV("[%s] calling fillBuffer %u", 4740c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 4741349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 4742c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 4743c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber (status_t)OK); 4744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4745c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 4746c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)mode, (int)FREE_BUFFERS); 4754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4755f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((status_t)OK, 4756f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->freeBuffer(kPortIndexOutput, index)); 4757f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4758f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4759f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4760f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4761f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4762f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4763f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4764f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::UninitializedState::UninitializedState(ACodec *codec) 4765f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 4766f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4767f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4768c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::UninitializedState::stateEntered() { 4769c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("Now uninitialized"); 4770ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4771ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber if (mDeathNotifier != NULL) { 4772f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen IInterface::asBinder(mCodec->mOMX)->unlinkToDeath(mDeathNotifier); 4773ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4774ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4775ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4776ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNativeWindow.clear(); 4777ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mNode = NULL; 4778ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mOMX.clear(); 4779ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mQuirks = 0; 4780ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mFlags = 0; 4781308bcaa44e578279e61be32b572fdb0b11b1e4c7Chong Zhang mCodec->mUseMetadataOnEncoderOutput = 0; 4782ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mCodec->mComponentName.clear(); 4783c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4784c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4785f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::UninitializedState::onMessageReceived(const sp<AMessage> &msg) { 4786f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 4787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 4789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatSetup: 4790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber onSetup(msg); 4792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 4795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 47975778822d86b0337407514b9372562b86edfa91cdAndreas Huber case ACodec::kWhatAllocateComponent: 47985778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 47995778822d86b0337407514b9372562b86edfa91cdAndreas Huber onAllocateComponent(msg); 48005778822d86b0337407514b9372562b86edfa91cdAndreas Huber handled = true; 48015778822d86b0337407514b9372562b86edfa91cdAndreas Huber break; 48025778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 48035778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4804f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatShutdown: 4805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4806c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 4807c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 4808c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 480954b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar ALOGW_IF(keepComponentAllocated, 481054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar "cannot keep component allocated on shutdown in Uninitialized state"); 4811c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4813d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 4814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4817c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case ACodec::kWhatFlush: 4821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 4822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4823d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 4824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 4825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 4827c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber break; 4828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 483030358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar case ACodec::kWhatReleaseCodecInstance: 483130358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar { 483230358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar // nothing to do, as we have already signaled shutdown 483330358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar handled = true; 483430358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar break; 483530358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar } 483630358faf33fb9b638257b017fadb4c5f7352d903Lajos Molnar 4837f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 4838f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 4839f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 4840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 4842f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 4843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4844f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::UninitializedState::onSetup( 4845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 4846c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (onAllocateComponent(msg) 4847c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber && mCodec->mLoadedState->onConfigureComponent(msg)) { 4848c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mLoadedState->onStart(); 4849c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 48505778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 48515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4852c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::UninitializedState::onAllocateComponent(const sp<AMessage> &msg) { 48535778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onAllocateComponent"); 48545778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4855c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(mCodec->mNode == NULL); 48565778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4857f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMXClient client; 4858f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(client.connect(), (status_t)OK); 4859f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4860f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<IOMX> omx = client.interface(); 4861f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48621d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> notify = new AMessage(kWhatOMXDied, mCodec); 4863ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4864ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier = new DeathNotifier(notify); 4865f888020c6e2735624f2b2a30e72aca24e17b8b4dMarco Nelissen if (IInterface::asBinder(omx)->linkToDeath(mDeathNotifier) != OK) { 4866ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // This was a local binder, if it dies so do we, we won't care 4867ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber // about any notifications in the afterlife. 4868ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber mDeathNotifier.clear(); 4869ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber } 4870ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber 4871e671207115fac3914134c61b336d5fa0242c68caAndreas Huber Vector<OMXCodec::CodecNameAndQuirks> matchingCodecs; 48725778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber AString mime; 4874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 48755778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString componentName; 4876d7bee3a9d2ad76d073d91f0ee36d5ac5f9df480cAndreas Huber uint32_t quirks = 0; 48777791cf11186a22b3f84d98cfde67393bee748cb0Marco Nelissen int32_t encoder = false; 48785778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (msg->findString("componentName", &componentName)) { 4879e671207115fac3914134c61b336d5fa0242c68caAndreas Huber ssize_t index = matchingCodecs.add(); 4880e671207115fac3914134c61b336d5fa0242c68caAndreas Huber OMXCodec::CodecNameAndQuirks *entry = &matchingCodecs.editItemAt(index); 4881e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mName = String8(componentName.c_str()); 4882afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4883e671207115fac3914134c61b336d5fa0242c68caAndreas Huber if (!OMXCodec::findCodecQuirks( 4884e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName.c_str(), &entry->mQuirks)) { 4885e671207115fac3914134c61b336d5fa0242c68caAndreas Huber entry->mQuirks = 0; 4886afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber } 48875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 48885778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 48895778822d86b0337407514b9372562b86edfa91cdAndreas Huber 48905778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!msg->findInt32("encoder", &encoder)) { 48915778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder = false; 48925778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 48935778822d86b0337407514b9372562b86edfa91cdAndreas Huber 48945778822d86b0337407514b9372562b86edfa91cdAndreas Huber OMXCodec::findMatchingCodecs( 48955778822d86b0337407514b9372562b86edfa91cdAndreas Huber mime.c_str(), 48965778822d86b0337407514b9372562b86edfa91cdAndreas Huber encoder, // createEncoder 48975778822d86b0337407514b9372562b86edfa91cdAndreas Huber NULL, // matchComponentName 48985778822d86b0337407514b9372562b86edfa91cdAndreas Huber 0, // flags 4899e671207115fac3914134c61b336d5fa0242c68caAndreas Huber &matchingCodecs); 49005778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 49011065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 49021065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber sp<CodecObserver> observer = new CodecObserver; 49031065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber IOMX::node_id node = NULL; 49041065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 49059f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu status_t err = OMX_ErrorComponentNotFound; 49061065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber for (size_t matchIndex = 0; matchIndex < matchingCodecs.size(); 49071065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber ++matchIndex) { 4908e671207115fac3914134c61b336d5fa0242c68caAndreas Huber componentName = matchingCodecs.itemAt(matchIndex).mName.string(); 4909e671207115fac3914134c61b336d5fa0242c68caAndreas Huber quirks = matchingCodecs.itemAt(matchIndex).mQuirks; 4910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4911da153975581fb3161a30452348a5b26ee72d9255Elliott Hughes pid_t tid = gettid(); 4912078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber int prevPriority = androidGetThreadPriority(tid); 4913078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, ANDROID_PRIORITY_FOREGROUND); 49149f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu err = omx->allocateNode(componentName.c_str(), observer, &node); 4915078cfcf7cce9185ec7559910d08b0bc02bfc88a3Andreas Huber androidSetThreadPriority(tid, prevPriority); 4916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49171065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber if (err == OK) { 49181065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber break; 49197a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He } else { 49207a727021b86c2fb2c9f60af2c999154dce1766ebZhijun He ALOGW("Allocating component '%s' failed, try next one.", componentName.c_str()); 49211065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 49221065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 49231065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber node = NULL; 49241065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber } 49251065b3f17d3048948e7d522049d1980b90df3dc1Andreas Huber 4926c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber if (node == NULL) { 49275778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (!mime.empty()) { 49289f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu ALOGE("Unable to instantiate a %scoder for type '%s' with err %#x.", 49299f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu encoder ? "en" : "de", mime.c_str(), err); 49305778822d86b0337407514b9372562b86edfa91cdAndreas Huber } else { 49319f41ee5a4dd73093d107bc80df5cebb9a273cc72Ronghua Wu ALOGE("Unable to instantiate codec '%s' with err %#x.", componentName.c_str(), err); 49325778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4933c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber 493452e88b2986536e83a7a6da63461556b8734a85f3Ronghua Wu mCodec->signalError((OMX_ERRORTYPE)err, makeNoSideEffectStatus(err)); 4935c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 4936c92fd24c10a6bf80b346d7e261325434d9c6964bAndreas Huber } 4937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49381d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar notify = new AMessage(kWhatOMXMessage, mCodec); 4939f933441648ef6a71dee783d733aac17b9508b452Andreas Huber observer->setNotificationMessage(notify); 4940f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 4941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName = componentName; 4942ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags = 0; 4943ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4944ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber if (componentName.endsWith(".secure")) { 4945ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber mCodec->mFlags |= kFlagIsSecure; 49461713460104b86f6be3a5d9993d9ace864d889b2dChong Zhang mCodec->mFlags |= kFlagIsGrallocUsageProtected; 49470167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber mCodec->mFlags |= kFlagPushBlankBuffersToNativeWindowOnShutdown; 4948ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber } 4949ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 4950afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber mCodec->mQuirks = quirks; 4951f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mOMX = omx; 4952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode = node; 4953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 49545778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 49555778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 4956d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentAllocated); 49575778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->setString("componentName", mCodec->mComponentName.c_str()); 49585778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 49595778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 4960c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4961c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 4962c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4963c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 49645778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 49655778822d86b0337407514b9372562b86edfa91cdAndreas Huber 4966c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber//////////////////////////////////////////////////////////////////////////////// 4967c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4968c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas HuberACodec::LoadedState::LoadedState(ACodec *codec) 4969c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber : BaseState(codec) { 4970c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4971c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4972c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::stateEntered() { 4973c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber ALOGV("[%s] Now Loaded", mCodec->mComponentName.c_str()); 4974c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4975f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 4976f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 4977f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4978f6f38287b97ec69b169387add6458f859b770e65Andreas Huber mCodec->mInputEOSResult = OK; 4979f6f38287b97ec69b169387add6458f859b770e65Andreas Huber 4980054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mDequeueCounter = 0; 4981054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 4982a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mRepeatFrameDelayUs = -1ll; 4983e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mInputFormat.clear(); 4984e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar mCodec->mOutputFormat.clear(); 49854e865a3cfe4c955e0890321a6b488cf661808b63Lajos Molnar mCodec->mBaseOutputFormat.clear(); 4986054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 4987c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (mCodec->mShutdownInProgress) { 4988c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool keepComponentAllocated = mCodec->mKeepComponentAllocated; 4989c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4990c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = false; 4991c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = false; 4992c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 4993c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 4994c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 499554b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 4996f393c33e65ae51a7cf168b4e15771b152f996b32Wei Jia 4997f393c33e65ae51a7cf168b4e15771b152f996b32Wei Jia mCodec->processDeferredMessages(); 4998c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 4999c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5000c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onShutdown(bool keepComponentAllocated) { 5001c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber if (!keepComponentAllocated) { 5002c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK_EQ(mCodec->mOMX->freeNode(mCodec->mNode), (status_t)OK); 5003c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5004c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mUninitializedState); 5005c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5006c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 500754b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar if (mCodec->mExplicitShutdown) { 500854b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar sp<AMessage> notify = mCodec->mNotify->dup(); 5009d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatShutdownCompleted); 501054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar notify->post(); 501154b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = false; 501254b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar } 5013c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5014c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5015c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onMessageReceived(const sp<AMessage> &msg) { 5016c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber bool handled = false; 5017c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5018c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber switch (msg->what()) { 5019c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatConfigureComponent: 5020c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5021c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onConfigureComponent(msg); 5022c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5023c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5024c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5025c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 50267cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatCreateInputSurface: 50277cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 50287cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden onCreateInputSurface(msg); 50297cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 50307cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 50317cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 50327cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 5033c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatStart: 5034c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5035c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onStart(); 5036c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5037c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5038c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5039c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5040c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatShutdown: 5041c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5042c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 5043c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 5044c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 5045c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 504654b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 5047c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber onShutdown(keepComponentAllocated); 5048c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5049c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5050c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5051c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5052c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5053c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber case ACodec::kWhatFlush: 5054c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber { 5055c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5056d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5057c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber notify->post(); 5058c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5059c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber handled = true; 5060c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber break; 5061c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5062c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5063c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber default: 5064c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return BaseState::onMessageReceived(msg); 5065c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber } 5066c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5067c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return handled; 5068c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber} 5069c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5070c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huberbool ACodec::LoadedState::onConfigureComponent( 50715778822d86b0337407514b9372562b86edfa91cdAndreas Huber const sp<AMessage> &msg) { 50725778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onConfigureComponent"); 50735778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50745778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(mCodec->mNode != NULL); 50755778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50765778822d86b0337407514b9372562b86edfa91cdAndreas Huber AString mime; 50775778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK(msg->findString("mime", &mime)); 50785778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50795778822d86b0337407514b9372562b86edfa91cdAndreas Huber status_t err = mCodec->configureCodec(mime.c_str(), msg); 50805778822d86b0337407514b9372562b86edfa91cdAndreas Huber 50815778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (err != OK) { 5082c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber ALOGE("[%s] configureCodec returning error %d", 5083c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber mCodec->mComponentName.c_str(), err); 5084c5255ac5b1bd313dcb50159566163b24dce7483fAndreas Huber 5085251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5086c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return false; 50875778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 50895778822d86b0337407514b9372562b86edfa91cdAndreas Huber { 50905778822d86b0337407514b9372562b86edfa91cdAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5091d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatComponentConfigured); 5092e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("input-format", mCodec->mInputFormat); 5093e0381245dff04aa823a59aa8b85869eddab0f39fLajos Molnar notify->setMessage("output-format", mCodec->mOutputFormat); 50945778822d86b0337407514b9372562b86edfa91cdAndreas Huber notify->post(); 50955778822d86b0337407514b9372562b86edfa91cdAndreas Huber } 5096c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5097c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber return true; 50985778822d86b0337407514b9372562b86edfa91cdAndreas Huber} 50995778822d86b0337407514b9372562b86edfa91cdAndreas Huber 51007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenvoid ACodec::LoadedState::onCreateInputSurface( 5101ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber const sp<AMessage> & /* msg */) { 51027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGV("onCreateInputSurface"); 51037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 51047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<AMessage> notify = mCodec->mNotify->dup(); 5105d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatInputSurfaceCreated); 51067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 51077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden sp<IGraphicBufferProducer> bufferProducer; 51087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden status_t err; 51097cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 51107cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden err = mCodec->mOMX->createInputSurface(mCodec->mNode, kPortIndexInput, 51117cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden &bufferProducer); 5112a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5113a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err == OK && mCodec->mRepeatFrameDelayUs > 0ll) { 5114a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err = mCodec->mOMX->setInternalOption( 5115a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mNode, 5116a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber kPortIndexInput, 5117a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber IOMX::INTERNAL_OPTION_REPEAT_PREVIOUS_FRAME_DELAY, 5118a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber &mCodec->mRepeatFrameDelayUs, 5119a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber sizeof(mCodec->mRepeatFrameDelayUs)); 5120a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 5121a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber if (err != OK) { 5122a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber ALOGE("[%s] Unable to configure option to repeat previous " 5123a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber "frames (err %d)", 5124a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber mCodec->mComponentName.c_str(), 5125a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber err); 5126a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 5127a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber } 5128a61285dcf1da8a2cf40c499ee3a7b9fc4d74ac58Andreas Huber 51292c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err == OK && mCodec->mMaxPtsGapUs > 0ll) { 513094ee4b708acfa941581160b267afb79192b1d816Chong Zhang err = mCodec->mOMX->setInternalOption( 513194ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mNode, 513294ee4b708acfa941581160b267afb79192b1d816Chong Zhang kPortIndexInput, 513394ee4b708acfa941581160b267afb79192b1d816Chong Zhang IOMX::INTERNAL_OPTION_MAX_TIMESTAMP_GAP, 513494ee4b708acfa941581160b267afb79192b1d816Chong Zhang &mCodec->mMaxPtsGapUs, 513594ee4b708acfa941581160b267afb79192b1d816Chong Zhang sizeof(mCodec->mMaxPtsGapUs)); 513694ee4b708acfa941581160b267afb79192b1d816Chong Zhang 513794ee4b708acfa941581160b267afb79192b1d816Chong Zhang if (err != OK) { 513894ee4b708acfa941581160b267afb79192b1d816Chong Zhang ALOGE("[%s] Unable to configure max timestamp gap (err %d)", 513972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mComponentName.c_str(), 514072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err); 51412c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51422c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51432c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 514437b2b389139ed638831e49708c947863eef631efRonghua Wu if (err == OK && mCodec->mMaxFps > 0) { 514537b2b389139ed638831e49708c947863eef631efRonghua Wu err = mCodec->mOMX->setInternalOption( 514637b2b389139ed638831e49708c947863eef631efRonghua Wu mCodec->mNode, 514737b2b389139ed638831e49708c947863eef631efRonghua Wu kPortIndexInput, 514837b2b389139ed638831e49708c947863eef631efRonghua Wu IOMX::INTERNAL_OPTION_MAX_FPS, 514937b2b389139ed638831e49708c947863eef631efRonghua Wu &mCodec->mMaxFps, 515037b2b389139ed638831e49708c947863eef631efRonghua Wu sizeof(mCodec->mMaxFps)); 515137b2b389139ed638831e49708c947863eef631efRonghua Wu 515237b2b389139ed638831e49708c947863eef631efRonghua Wu if (err != OK) { 515337b2b389139ed638831e49708c947863eef631efRonghua Wu ALOGE("[%s] Unable to configure max fps (err %d)", 515437b2b389139ed638831e49708c947863eef631efRonghua Wu mCodec->mComponentName.c_str(), 515537b2b389139ed638831e49708c947863eef631efRonghua Wu err); 515637b2b389139ed638831e49708c947863eef631efRonghua Wu } 515737b2b389139ed638831e49708c947863eef631efRonghua Wu } 515837b2b389139ed638831e49708c947863eef631efRonghua Wu 51592c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err == OK && mCodec->mTimePerCaptureUs > 0ll 51602c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang && mCodec->mTimePerFrameUs > 0ll) { 51612c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang int64_t timeLapse[2]; 51622c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[0] = mCodec->mTimePerFrameUs; 51632c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang timeLapse[1] = mCodec->mTimePerCaptureUs; 51642c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err = mCodec->mOMX->setInternalOption( 51652c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mNode, 51662c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang kPortIndexInput, 51672c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang IOMX::INTERNAL_OPTION_TIME_LAPSE, 51682c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang &timeLapse[0], 51692c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang sizeof(timeLapse)); 51702c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang 51712c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang if (err != OK) { 51722c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang ALOGE("[%s] Unable to configure time lapse (err %d)", 51732c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang mCodec->mComponentName.c_str(), 51742c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang err); 51752c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 51762c9c8cba8562cc3a27532e4cd348912cc78d8d98Chong Zhang } 517772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 517872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err == OK && mCodec->mCreateInputBuffersSuspended) { 517972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang bool suspend = true; 518072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang err = mCodec->mOMX->setInternalOption( 518172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mCodec->mNode, 518272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 518372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_SUSPEND, 518472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &suspend, 518572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(suspend)); 518672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 518772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 518872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("[%s] Unable to configure option to suspend (err %d)", 518994ee4b708acfa941581160b267afb79192b1d816Chong Zhang mCodec->mComponentName.c_str(), 519094ee4b708acfa941581160b267afb79192b1d816Chong Zhang err); 519194ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 519294ee4b708acfa941581160b267afb79192b1d816Chong Zhang } 519394ee4b708acfa941581160b267afb79192b1d816Chong Zhang 51947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden if (err == OK) { 51957cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setObject("input-surface", 51967cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden new BufferProducerWrapper(bufferProducer)); 51977cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } else { 51987cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // Can't use mCodec->signalError() here -- MediaCodec won't forward 51997cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // the error through because it's in the "configured" state. We 52007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden // send a kWhatInputSurfaceCreated with an error value instead. 52017cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden ALOGE("[%s] onCreateInputSurface returning error %d", 52027cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden mCodec->mComponentName.c_str(), err); 52037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->setInt32("err", err); 52047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 52057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden notify->post(); 52067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden} 52077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 5208c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Hubervoid ACodec::LoadedState::onStart() { 52095778822d86b0337407514b9372562b86edfa91cdAndreas Huber ALOGV("onStart"); 52105778822d86b0337407514b9372562b86edfa91cdAndreas Huber 52115778822d86b0337407514b9372562b86edfa91cdAndreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 52125778822d86b0337407514b9372562b86edfa91cdAndreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 5213f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5214f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5215f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mLoadedToIdleState); 5216f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5217f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5218f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5219f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5220f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec) 5221f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5222f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5223f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5224f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::LoadedToIdleState::stateEntered() { 52253856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str()); 5226f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5227cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5228cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = allocateBuffers()) != OK) { 522929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate buffers after transitioning to IDLE state " 5230cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "(error 0x%08x)", 5231cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5232cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5233251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 523491bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber 523591bfadb4aa75444c60e9949232de3c184cfe060aAndreas Huber mCodec->changeState(mCodec->mLoadedState); 5236cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5237f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5238f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5239f933441648ef6a71dee783d733aac17b9508b452Andreas Huberstatus_t ACodec::LoadedToIdleState::allocateBuffers() { 5240f933441648ef6a71dee783d733aac17b9508b452Andreas Huber status_t err = mCodec->allocateBuffersOnPort(kPortIndexInput); 5241f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5242f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (err != OK) { 5243f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return err; 5244f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5245f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5246f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return mCodec->allocateBuffersOnPort(kPortIndexOutput); 5247f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5248f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5249f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5250f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 525172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 5252f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5253f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5254f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5255f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5256f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5257f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 52586507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 52596507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 52606507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 52616507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 52626507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 52636507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 52646463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatResume: 52656463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 52666463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We'll be active soon enough. 52676463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 52686463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 52696463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 52706463e76d41430f9b03a79b221de84255f2475658Marco Nelissen case kWhatFlush: 52716463e76d41430f9b03a79b221de84255f2475658Marco Nelissen { 52726463e76d41430f9b03a79b221de84255f2475658Marco Nelissen // We haven't even started yet, so we're flushed alright... 52736463e76d41430f9b03a79b221de84255f2475658Marco Nelissen sp<AMessage> notify = mCodec->mNotify->dup(); 5274d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 52756463e76d41430f9b03a79b221de84255f2475658Marco Nelissen notify->post(); 52766463e76d41430f9b03a79b221de84255f2475658Marco Nelissen return true; 52776463e76d41430f9b03a79b221de84255f2475658Marco Nelissen } 52786463e76d41430f9b03a79b221de84255f2475658Marco Nelissen 5279f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5280f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 5281f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5282f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5283f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5284f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::LoadedToIdleState::onOMXEvent( 5285f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5286f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5287f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5288f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5289f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5290f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5291f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5292f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5293f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateExecuting), 5294f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5295f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5296f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToExecutingState); 5297f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5298f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5299f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5300f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5301f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5302f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5303f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5304f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5305f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5306f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5307f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5308f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToExecutingState::IdleToExecutingState(ACodec *codec) 5309f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5310f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5311f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5312f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToExecutingState::stateEntered() { 53133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Executing", mCodec->mComponentName.c_str()); 5314f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5315f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5316f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onMessageReceived(const sp<AMessage> &msg) { 5317f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 531872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang case kWhatSetParameters: 5319f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5320f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5321f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5322f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5323f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5324f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5325d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatResume: 5326d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 5327d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We'll be active soon enough. 5328d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 5329d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 5330d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 5331d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber case kWhatFlush: 5332d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber { 5333d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber // We haven't even started yet, so we're flushed alright... 5334d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 5335d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 5336d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber notify->post(); 5337d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 5338d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber return true; 5339d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber } 5340d477b8d071826c0768620f7ac302f31d8b12b1caAndreas Huber 53416507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden case kWhatSignalEndOfInputStream: 53426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden { 53436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 53446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden return true; 53456507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 53466507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5347f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5348f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onMessageReceived(msg); 5349f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5350f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5351f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5352f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToExecutingState::onOMXEvent( 5353f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5354f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5355f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5356f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5357f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5358f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateExecuting); 5359f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5360f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mExecutingState->resume(); 5361f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5362f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5363f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5364f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5365f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5366f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5367f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5368f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5369f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5370f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5371f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5372f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5373f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingState::ExecutingState(ACodec *codec) 5374349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber : BaseState(codec), 5375349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive(false) { 5376f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5377f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5378f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::ExecutingState::getPortMode( 5379ccb067b1d8424ba610cbd3de83368bd55b532b5bAndreas Huber OMX_U32 /* portIndex */) { 5380f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5381f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5382f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5383054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputMetaBuffers() { 5384054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // submit as many buffers as there are input buffers with the codec 5385054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar // in case we are in port reconfiguring 5386054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); ++i) { 5387054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 5388054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5389054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_COMPONENT) { 5390054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->submitOutputMetaDataBuffer() != OK) 5391054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar break; 5392054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5393054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 53944dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 53954dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 53964dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 5397054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 5398054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5399054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitRegularOutputBuffers() { 5400f933441648ef6a71dee783d733aac17b9508b452Andreas Huber for (size_t i = 0; i < mCodec->mBuffers[kPortIndexOutput].size(); ++i) { 5401f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BufferInfo *info = &mCodec->mBuffers[kPortIndexOutput].editItemAt(i); 5402f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5403f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mCodec->mNativeWindow != NULL) { 5404f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(info->mStatus == BufferInfo::OWNED_BY_US 5405f933441648ef6a71dee783d733aac17b9508b452Andreas Huber || info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW); 5406f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5407f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (info->mStatus == BufferInfo::OWNED_BY_NATIVE_WINDOW) { 5408f933441648ef6a71dee783d733aac17b9508b452Andreas Huber continue; 5409f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5410f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 5411f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_US); 5412f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5413f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54143856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] calling fillBuffer %p", 5415349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str(), info->mBufferID); 5416349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5417f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->fillBuffer(mCodec->mNode, info->mBufferID), 5418f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5419f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5420f933441648ef6a71dee783d733aac17b9508b452Andreas Huber info->mStatus = BufferInfo::OWNED_BY_COMPONENT; 5421f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5422f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5423f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5424054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnarvoid ACodec::ExecutingState::submitOutputBuffers() { 5425c38fcfba95f711e5738e4c72bd5499317a2f30d9Lajos Molnar submitRegularOutputBuffers(); 5426054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar if (mCodec->mStoreMetaDataInOutputBuffers) { 5427054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar submitOutputMetaBuffers(); 5428054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar } 5429054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar} 5430054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar 5431f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::resume() { 5432349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mActive) { 54333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] We're already active, no need to resume.", 5434349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 5435349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5436349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return; 5437349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5438349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5439f933441648ef6a71dee783d733aac17b9508b452Andreas Huber submitOutputBuffers(); 5440f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 54413cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar // Post all available input buffers 5442f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_GT(mCodec->mBuffers[kPortIndexInput].size(), 0u); 54433cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar for (size_t i = 0; i < mCodec->mBuffers[kPortIndexInput].size(); i++) { 54443cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar BufferInfo *info = &mCodec->mBuffers[kPortIndexInput].editItemAt(i); 54453cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar if (info->mStatus == BufferInfo::OWNED_BY_US) { 54463cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar postFillThisBuffer(info); 54473cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 54483cb576166020bfdc1522b33919fe5ff8d211d0a3Lajos Molnar } 5449349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5450349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = true; 5451f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5452f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5453f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingState::stateEntered() { 54543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing", mCodec->mComponentName.c_str()); 5455f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5456f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->processDeferredMessages(); 5457f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5458f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5459f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onMessageReceived(const sp<AMessage> &msg) { 5460f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5461f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5462f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5463f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5464f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5465c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber int32_t keepComponentAllocated; 5466c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber CHECK(msg->findInt32( 5467c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber "keepComponentAllocated", &keepComponentAllocated)); 5468c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5469c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mShutdownInProgress = true; 547054b0bc74e051bd7df10cd657b481d88db6cdaa27Lajos Molnar mCodec->mExplicitShutdown = true; 5471c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->mKeepComponentAllocated = keepComponentAllocated; 5472c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber 5473349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 5474349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5475f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5476f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle), 5477f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5478f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5479f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingToIdleState); 5480f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5481f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5482f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5483f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5484f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5485f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5486f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 54877a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] ExecutingState flushing now " 5488d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber "(codec owns %d/%d input, %d/%d output).", 5489d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), 5490d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexInput), 5491d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexInput].size(), 5492d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->countBuffersOwnedByComponent(kPortIndexOutput), 5493d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mBuffers[kPortIndexOutput].size()); 5494d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5495349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mActive = false; 5496349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5497f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5498f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandFlush, OMX_ALL), 5499f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5500f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5501f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mFlushingState); 5502f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5503f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5504f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5505f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5506f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatResume: 5507f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5508f933441648ef6a71dee783d733aac17b9508b452Andreas Huber resume(); 5509f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5510f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5511f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5512f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5513f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5514496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber case kWhatRequestIDRFrame: 5515496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber { 5516496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber status_t err = mCodec->requestIDRFrame(); 5517496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber if (err != OK) { 5518496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber ALOGW("Requesting an IDR frame failed."); 5519496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5520496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5521496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber handled = true; 5522496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber break; 5523496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber } 5524496238cc7551d414067dcbbb4fe3bd801f205f95Andreas Huber 5525a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber case kWhatSetParameters: 5526a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber { 5527a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> params; 5528a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber CHECK(msg->findMessage("params", ¶ms)); 5529a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5530a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mCodec->setParameters(params); 5531a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5532a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sp<AMessage> reply; 5533a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (msg->findMessage("reply", &reply)) { 5534a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->setInt32("err", err); 5535a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber reply->post(); 5536a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5537a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5538a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber handled = true; 5539a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber break; 5540a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5541a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 55427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden case ACodec::kWhatSignalEndOfInputStream: 55437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden { 55446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden mCodec->onSignalEndOfInputStream(); 55457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden handled = true; 55467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden break; 55477cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden } 55487cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden 55494dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar // *** NOTE: THE FOLLOWING WORKAROUND WILL BE REMOVED *** 55504dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar case kWhatSubmitOutputMetaDataBufferIfEOS: 55514dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar { 55524dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (mCodec->mPortEOS[kPortIndexInput] && 55534dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar !mCodec->mPortEOS[kPortIndexOutput]) { 55544dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar status_t err = mCodec->submitOutputMetaDataBuffer(); 55554dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar if (err == OK) { 55564dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar mCodec->signalSubmitOutputMetaDataBufferIfEOS_workaround(); 55574dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 55584dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 55594dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar return true; 55604dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar } 55614dd0a8a3d66c2853faf2834565b3c5df4f68734dLajos Molnar 5562f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5563f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5564f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5565f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5566f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5567f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5568f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5569f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5570a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huberstatus_t ACodec::setParameters(const sp<AMessage> ¶ms) { 5571a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber int32_t videoBitrate; 5572530fdbdc1b5491f3fbf172752834d1515701e142Lajos Molnar if (params->findInt32("video-bitrate", &videoBitrate)) { 5573a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_VIDEO_CONFIG_BITRATETYPE configParams; 5574a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber InitOMXParams(&configParams); 5575a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nPortIndex = kPortIndexOutput; 5576a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber configParams.nEncodeBitrate = videoBitrate; 5577a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5578a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber status_t err = mOMX->setConfig( 5579a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber mNode, 5580a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber OMX_IndexConfigVideoBitrate, 5581a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber &configParams, 5582a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber sizeof(configParams)); 5583a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5584a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber if (err != OK) { 5585a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber ALOGE("setConfig(OMX_IndexConfigVideoBitrate, %d) failed w/ err %d", 5586a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber videoBitrate, err); 5587a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 5588a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return err; 5589a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5590a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber } 5591a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 559272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang int64_t skipFramesBeforeUs; 559372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (params->findInt64("skip-frames-before", &skipFramesBeforeUs)) { 559472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang status_t err = 559572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mOMX->setInternalOption( 559672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang mNode, 559772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang kPortIndexInput, 559872cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang IOMX::INTERNAL_OPTION_START_TIME, 559972cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang &skipFramesBeforeUs, 560072cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang sizeof(skipFramesBeforeUs)); 560172cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 560272cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang if (err != OK) { 560372cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang ALOGE("Failed to set parameter 'skip-frames-before' (err %d)", err); 560472cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang return err; 560572cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 560672cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang } 560772cecca17d735db6532c45f0a7e10c47ee6f065aChong Zhang 5608e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber int32_t dropInputFrames; 5609e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber if (params->findInt32("drop-input-frames", &dropInputFrames)) { 5610e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber bool suspend = dropInputFrames != 0; 5611e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 5612b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = 5613b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber mOMX->setInternalOption( 5614e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber mNode, 5615e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber kPortIndexInput, 5616e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber IOMX::INTERNAL_OPTION_SUSPEND, 5617e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber &suspend, 5618b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber sizeof(suspend)); 5619b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5620b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5621b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Failed to set parameter 'drop-input-frames' (err %d)", err); 5622b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5623b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5624b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5625b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5626b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber int32_t dummy; 5627b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (params->findInt32("request-sync", &dummy)) { 5628b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber status_t err = requestIDRFrame(); 5629b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber 5630b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber if (err != OK) { 5631b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber ALOGE("Requesting a sync frame failed w/ err %d", err); 5632b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber return err; 5633b8689b31813f55cbc1bf8e9ca0d46a9ee113e38aAndreas Huber } 5634e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber } 5635e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber 5636a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber return OK; 5637a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber} 5638a2eb22c1de262aa3fa7c356537ac2fe165afdf3dAndreas Huber 56396507d14c6d10f93d390de62b9eed267f9b544985Andy McFaddenvoid ACodec::onSignalEndOfInputStream() { 56406507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden sp<AMessage> notify = mNotify->dup(); 5641d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatSignaledInputEOS); 56426507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 56436507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden status_t err = mOMX->signalEndOfInputStream(mNode); 56446507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden if (err != OK) { 56456507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->setInt32("err", err); 56466507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden } 56476507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden notify->post(); 56486507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden} 56496507d14c6d10f93d390de62b9eed267f9b544985Andy McFadden 5650f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingState::onOMXEvent( 5651f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5652f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5653f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventPortSettingsChanged: 5654f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5655f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)kPortIndexOutput); 5656f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 565731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber if (data2 == 0 || data2 == OMX_IndexParamPortDefinition) { 5658054e7347cc60ad4b9dd2e8f456406f122f9f5879Lajos Molnar mCodec->mMetaDataBuffersToSubmit = 0; 5659f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5660f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, 5661f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_CommandPortDisable, kPortIndexOutput), 5662f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5663f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5664349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->freeOutputBuffersNotOwnedByComponent(); 5665f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5666f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mOutputPortSettingsChangedState); 566731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber } else if (data2 == OMX_IndexConfigCommonOutputCrop) { 566831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5669f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 56703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] OMX_EventPortSettingsChanged 0x%08lx", 5671f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str(), data2); 5672f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5673f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5674f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5675f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5676f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5677f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventBufferFlag: 5678f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5679f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5680f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5681f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5682f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5683f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5684f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5685f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5686f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5687f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5688f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5689f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::OutputPortSettingsChangedState::OutputPortSettingsChangedState( 5690f933441648ef6a71dee783d733aac17b9508b452Andreas Huber ACodec *codec) 5691f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5692f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5693f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5694f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::BaseState::PortMode ACodec::OutputPortSettingsChangedState::getPortMode( 5695f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_U32 portIndex) { 5696f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (portIndex == kPortIndexOutput) { 5697f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return FREE_BUFFERS; 5698f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5699f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5700f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(portIndex, (OMX_U32)kPortIndexInput); 5701f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5702f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return RESUBMIT_BUFFERS; 5703f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5704f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5705f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onMessageReceived( 5706f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5707f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5708f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5709f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5710f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5711f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5712349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case kWhatResume: 5713e6eea3a6b6e0cf92287ec1ceb8350f201d17e1acPer Persson case kWhatSetParameters: 5714f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5715349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (msg->what() == kWhatResume) { 57163856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring resume", mCodec->mComponentName.c_str()); 5717349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5718349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5719f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5720f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5721f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5722f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5723f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5724f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5725f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5726f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5727f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5728f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5729f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5730f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5731f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5732f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::OutputPortSettingsChangedState::stateEntered() { 57333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now handling output port settings change", 5734f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5735f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5736f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5737f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::OutputPortSettingsChangedState::onOMXEvent( 5738f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5739f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5740f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5741f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5742f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data1 == (OMX_U32)OMX_CommandPortDisable) { 5743f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5744f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 57453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now disabled.", 5746f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5747f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5748f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mCodec->mBuffers[kPortIndexOutput].isEmpty()); 5749f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mDealer[kPortIndexOutput].clear(); 5750f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5751f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5752f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput), 5753f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5754f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5755cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber status_t err; 5756cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber if ((err = mCodec->allocateBuffersOnPort( 5757cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber kPortIndexOutput)) != OK) { 575829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Failed to allocate output port buffers after " 5759cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber "port reconfiguration (error 0x%08x)", 5760cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber err); 5761cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber 5762251d4be8aa5ab80bc915a82a2420233bdc62018eAndy Hung mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err)); 5763d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 5764755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // This is technically not correct, but appears to be 5765755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the only way to free the component instance. 5766755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // Controlled transitioning from excecuting->idle 5767755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // and idle->loaded seem impossible probably because 5768755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber // the output port never finishes re-enabling. 5769755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mShutdownInProgress = true; 5770755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->mKeepComponentAllocated = false; 5771755b9861197f1566f916785ba7d35cf86fd5b2d5Andreas Huber mCodec->changeState(mCodec->mLoadedState); 5772cb67cd1b51ff9ab221e3124cf7e546515fef3c87Andreas Huber } 5773f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5774f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5775f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else if (data1 == (OMX_U32)OMX_CommandPortEnable) { 5776f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)kPortIndexOutput); 5777f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 577831e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 577931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 57803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Output port now reenabled.", 5781f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mComponentName.c_str()); 5782f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5783349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber if (mCodec->mExecutingState->active()) { 5784349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mExecutingState->submitOutputBuffers(); 5785349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5786349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5787f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 5788f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5789f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5790f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5791f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5792f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5793f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5794f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5795f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5796f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return false; 5797f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5798f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5799f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5800f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5801f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5802f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::ExecutingToIdleState::ExecutingToIdleState(ACodec *codec) 58035778822d86b0337407514b9372562b86edfa91cdAndreas Huber : BaseState(codec), 58045778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle(false) { 5805f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5806f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5807f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onMessageReceived(const sp<AMessage> &msg) { 5808f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5809f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5810f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5811f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5812f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5813f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5814f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5815f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5816f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5817f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5818f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5819f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5820f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5821f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5822f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5823f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5824f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5825f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5826f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5827f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5828f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5829f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5830f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5831f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5832f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5833f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5834f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5835f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::stateEntered() { 58363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Executing->Idle", mCodec->mComponentName.c_str()); 583731e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber 58385778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = false; 583931e2508c75018145a8238925ff1a08cbde4e799aAndreas Huber mCodec->mSentFormat = false; 5840f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5841f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5842f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::ExecutingToIdleState::onOMXEvent( 5843f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5844f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5845f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5846f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5847f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5848f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateIdle); 5849f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58505778822d86b0337407514b9372562b86edfa91cdAndreas Huber mComponentNowIdle = true; 58515778822d86b0337407514b9372562b86edfa91cdAndreas Huber 5852f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5853f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5854f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5855f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5856f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5857349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 5858349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventBufferFlag: 5859349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 5860349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber // We're shutting down and don't care about this anymore. 5861349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 5862349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 5863349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 5864f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5865f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5866f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5867f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 58680af941927ef8f35f2da5380dfd8d04b7f4ed3532Andreas Huber 5869f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::changeStateIfWeOwnAllBuffers() { 58705778822d86b0337407514b9372562b86edfa91cdAndreas Huber if (mComponentNowIdle && mCodec->allYourBuffersAreBelongToUs()) { 5871f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->mOMX->sendCommand( 5872f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mNode, OMX_CommandStateSet, OMX_StateLoaded), 5873f933441648ef6a71dee783d733aac17b9508b452Andreas Huber (status_t)OK); 5874f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5875f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexInput), (status_t)OK); 5876f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(mCodec->freeBuffersOnPort(kPortIndexOutput), (status_t)OK); 5877f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 58780167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber if ((mCodec->mFlags & kFlagPushBlankBuffersToNativeWindowOnShutdown) 58790167414e261f88a96b5e4bf6cb592e6ca11e5a95Andreas Huber && mCodec->mNativeWindow != NULL) { 5880bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // We push enough 1x1 blank buffers to ensure that one of 5881bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // them has made it to the display. This allows the OMX 5882bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // component teardown to zero out any protected buffers 5883bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber // without the risk of scanning out one of those buffers. 5884bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber mCodec->pushBlankBuffersToNativeWindow(); 5885bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber } 5886bc098410be55f9d96f394b3981a0c482b83859b6Andreas Huber 5887f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mIdleToLoadedState); 5888f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5889f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5890f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5891f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onInputBufferFilled( 5892f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5893f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 5894f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5895f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5896f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5897f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5898f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::ExecutingToIdleState::onOutputBufferDrained( 5899f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const sp<AMessage> &msg) { 5900f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 5901f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5902f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 5903f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5904f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5905f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5906f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5907f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::IdleToLoadedState::IdleToLoadedState(ACodec *codec) 5908f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5909f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5910f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5911f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onMessageReceived(const sp<AMessage> &msg) { 5912f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5913f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5914f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5915f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5916f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5917f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing that... 5918f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5919f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5920f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5921f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5922f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5923f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5924f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5925f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // Don't send me a flush request if you previously wanted me 5926f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // to shutdown. 5927f933441648ef6a71dee783d733aac17b9508b452Andreas Huber TRESPASS(); 5928f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5929f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5930f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5931f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5932f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5933f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5934f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5935f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5936f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5937f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5938f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5939f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::IdleToLoadedState::stateEntered() { 59403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Idle->Loaded", mCodec->mComponentName.c_str()); 5941f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5942f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5943f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::IdleToLoadedState::onOMXEvent( 5944f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 5945f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 5946f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 5947f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5948f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandStateSet); 5949f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, (OMX_U32)OMX_StateLoaded); 5950f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5951c95c2ddcdfc974f42408a377fbe2de51b94a8c94Andreas Huber mCodec->changeState(mCodec->mLoadedState); 5952f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5953f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 5954f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5955f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5956f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5957f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 5958f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5959f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5960f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5961f933441648ef6a71dee783d733aac17b9508b452Andreas Huber//////////////////////////////////////////////////////////////////////////////// 5962f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5963f933441648ef6a71dee783d733aac17b9508b452Andreas HuberACodec::FlushingState::FlushingState(ACodec *codec) 5964f933441648ef6a71dee783d733aac17b9508b452Andreas Huber : BaseState(codec) { 5965f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5966f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5967f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::stateEntered() { 59683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Now Flushing", mCodec->mComponentName.c_str()); 5969f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5970f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[kPortIndexInput] = mFlushComplete[kPortIndexOutput] = false; 5971f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5972f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5973f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onMessageReceived(const sp<AMessage> &msg) { 5974f933441648ef6a71dee783d733aac17b9508b452Andreas Huber bool handled = false; 5975f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5976f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (msg->what()) { 5977f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatShutdown: 5978f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5979f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->deferMessage(msg); 5980f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5981f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5982f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5983f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case kWhatFlush: 5984f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 5985f933441648ef6a71dee783d733aac17b9508b452Andreas Huber // We're already doing this right now. 5986f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = true; 5987f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5988f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5989f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5990f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 5991f933441648ef6a71dee783d733aac17b9508b452Andreas Huber handled = BaseState::onMessageReceived(msg); 5992f933441648ef6a71dee783d733aac17b9508b452Andreas Huber break; 5993f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 5994f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5995f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return handled; 5996f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 5997f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 5998f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool ACodec::FlushingState::onOMXEvent( 5999f933441648ef6a71dee783d733aac17b9508b452Andreas Huber OMX_EVENTTYPE event, OMX_U32 data1, OMX_U32 data2) { 60007a3a2b2f9bb9421dcf83fbd47276e57917078aefJames Dong ALOGV("[%s] FlushingState onOMXEvent(%d,%ld)", 6001d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber mCodec->mComponentName.c_str(), event, data1); 6002d3d822204249eaca4259bdf46f6f0357b96e8e21Andreas Huber 6003f933441648ef6a71dee783d733aac17b9508b452Andreas Huber switch (event) { 6004f933441648ef6a71dee783d733aac17b9508b452Andreas Huber case OMX_EventCmdComplete: 6005f933441648ef6a71dee783d733aac17b9508b452Andreas Huber { 6006f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data1, (OMX_U32)OMX_CommandFlush); 6007f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6008f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (data2 == kPortIndexInput || data2 == kPortIndexOutput) { 6009f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(!mFlushComplete[data2]); 6010f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mFlushComplete[data2] = true; 6011e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber 6012e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber if (mFlushComplete[kPortIndexInput] 6013e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber && mFlushComplete[kPortIndexOutput]) { 6014e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber changeStateIfWeOwnAllBuffers(); 6015e5bf6409774fe73f968b7db215f535b64de66139Andreas Huber } 6016f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } else { 6017f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK_EQ(data2, OMX_ALL); 6018f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexInput]); 6019f933441648ef6a71dee783d733aac17b9508b452Andreas Huber CHECK(mFlushComplete[kPortIndexOutput]); 6020f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6021f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6022f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6023f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6024f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 6025f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6026f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6027349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber case OMX_EventPortSettingsChanged: 6028349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber { 60291d15ab58bf8239069ef343de6cb21aabf3ef7d78Lajos Molnar sp<AMessage> msg = new AMessage(kWhatOMXMessage, mCodec); 6030349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("type", omx_message::EVENT); 6031609b815a3131d22da38b2f452faa9f89daad4039Andy Hung msg->setInt32("node", mCodec->mNode); 6032349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("event", event); 6033349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data1", data1); 6034349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber msg->setInt32("data2", data2); 6035349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 60363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("[%s] Deferring OMX_EventPortSettingsChanged", 6037349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->mComponentName.c_str()); 6038349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6039349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber mCodec->deferMessage(msg); 6040349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6041349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber return true; 6042349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber } 6043349d3fcb4afacf754f7b5b5186d2f258f5bf35e7Andreas Huber 6044f933441648ef6a71dee783d733aac17b9508b452Andreas Huber default: 6045f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return BaseState::onOMXEvent(event, data1, data2); 6046f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6047f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6048f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return true; 6049f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6050f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6051f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onOutputBufferDrained(const sp<AMessage> &msg) { 6052f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onOutputBufferDrained(msg); 6053f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6054f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6055f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6056f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6057f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::onInputBufferFilled(const sp<AMessage> &msg) { 6058f933441648ef6a71dee783d733aac17b9508b452Andreas Huber BaseState::onInputBufferFilled(msg); 6059f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6060f933441648ef6a71dee783d733aac17b9508b452Andreas Huber changeStateIfWeOwnAllBuffers(); 6061f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6062f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6063f933441648ef6a71dee783d733aac17b9508b452Andreas Hubervoid ACodec::FlushingState::changeStateIfWeOwnAllBuffers() { 6064f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (mFlushComplete[kPortIndexInput] 6065f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mFlushComplete[kPortIndexOutput] 6066f933441648ef6a71dee783d733aac17b9508b452Andreas Huber && mCodec->allYourBuffersAreBelongToUs()) { 60677e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // We now own all buffers except possibly those still queued with 60687e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber // the native window for rendering. Let's get those back as well. 60697e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber mCodec->waitUntilAllPossibleNativeWindowBuffersAreReturnedToUs(); 60707e7013392e302a28364df1dcee79b82ad90978b4Andreas Huber 6071f933441648ef6a71dee783d733aac17b9508b452Andreas Huber sp<AMessage> notify = mCodec->mNotify->dup(); 6072d8cbe4a024ef54adf043b6ea31fa22271b8b2c51Lajos Molnar notify->setInt32("what", CodecBase::kWhatFlushCompleted); 6073f933441648ef6a71dee783d733aac17b9508b452Andreas Huber notify->post(); 6074f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6075f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexInput] = 6076f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->mPortEOS[kPortIndexOutput] = false; 6077f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6078dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber mCodec->mInputEOSResult = OK; 6079dc9bacd838442a524585887e6ea6696836be2edaAndreas Huber 6080f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen if (mCodec->mSkipCutBuffer != NULL) { 6081f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen mCodec->mSkipCutBuffer->clear(); 6082f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen } 6083f3bd1972e039c6ded5154db715e5a32f1813a239Marco Nelissen 6084f933441648ef6a71dee783d733aac17b9508b452Andreas Huber mCodec->changeState(mCodec->mExecutingState); 6085f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 6086f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 6087f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 6088f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} // namespace android 6089