OMXNodeInstance.cpp revision 9f4557ed0b29c85df1f2219408bad91ae4e29cbb
1784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber/* 2784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * Copyright (C) 2009 The Android Open Source Project 3784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * 4784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * you may not use this file except in compliance with the License. 6784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * You may obtain a copy of the License at 7784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * 8784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * 10784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * Unless required by applicable law or agreed to in writing, software 11784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * See the License for the specific language governing permissions and 14784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber * limitations under the License. 15784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber */ 16784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 17784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber//#define LOG_NDEBUG 0 18784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#define LOG_TAG "OMXNodeInstance" 19784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <utils/Log.h> 20784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 21784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include "../include/OMXNodeInstance.h" 22fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber#include "OMXMaster.h" 23784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 24b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <OMX_Component.h> 25784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 26784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <binder/IMemory.h> 27784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <media/stagefright/MediaDebug.h> 28784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 29784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubernamespace android { 30784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 31784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstruct BufferMeta { 32784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(const sp<IMemory> &mem, bool is_backup = false) 33784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mMem(mem), 34784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mIsBackup(is_backup) { 35784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 36784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 37784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(size_t size) 38784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mSize(size), 39784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mIsBackup(false) { 40784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 41784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 42784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) { 43784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (!mIsBackup) { 44784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return; 45784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 46784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 47784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber memcpy((OMX_U8 *)mMem->pointer() + header->nOffset, 48784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->pBuffer + header->nOffset, 49784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen); 50784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 51784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 52784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) { 53784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (!mIsBackup) { 54784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return; 55784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber memcpy(header->pBuffer + header->nOffset, 58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber (const OMX_U8 *)mMem->pointer() + header->nOffset, 59784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen); 60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberprivate: 63784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber sp<IMemory> mMem; 64784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber size_t mSize; 65784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber bool mIsBackup; 66784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 67784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(const BufferMeta &); 68784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta &operator=(const BufferMeta &); 69784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}; 70784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 71784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 72784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { 73784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone 74784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}; 75784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 76784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::OMXNodeInstance( 77784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX *owner, const sp<IOMXObserver> &observer) 78784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mOwner(owner), 79784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID(NULL), 80784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle(NULL), 812ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber mObserver(observer), 822ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber mDying(false) { 83784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 84784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 85784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::~OMXNodeInstance() { 86784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber CHECK_EQ(mHandle, NULL); 87784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 89784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) { 90784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber CHECK_EQ(mHandle, NULL); 91784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID = node_id; 92784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle = handle; 93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 94784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 95784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX *OMXNodeInstance::owner() { 96784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mOwner; 97784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 98784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 99784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubersp<IOMXObserver> OMXNodeInstance::observer() { 100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mObserver; 101784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 102784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 103784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX::node_id OMXNodeInstance::nodeID() { 104784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mNodeID; 105784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 106784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 107784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) { 108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR; 109784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 110784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 111fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) { 1123085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // Transition the node from its current state all the way down 1133085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // to "Loaded". 1143085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // This ensures that all active buffers are properly freed even 1153085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // for components that don't do this themselves on a call to 1163085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // "FreeHandle". 1173085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1182ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber // The code below may trigger some more events to be dispatched 1192ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber // by the OMX component - we want to ignore them as our client 1202ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber // does not expect them. 1212ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber mDying = true; 1222ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber 1233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_STATETYPE state; 1243085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone); 1253085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber switch (state) { 1263085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateExecuting: 1273085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber { 1283085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("forcing Executing->Idle"); 1293085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber sendCommand(OMX_CommandStateSet, OMX_StateIdle); 1303085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_ERRORTYPE err; 1313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1329f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber && state != OMX_StateIdle 1339f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber && state != OMX_StateInvalid) { 1343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber usleep(100000); 1353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(err, OMX_ErrorNone); 1373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1389f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber if (state == OMX_StateInvalid) { 1399f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber break; 1409f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber } 1419f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber 1423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // fall through 1433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateIdle: 1463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber { 1473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("forcing Idle->Loaded"); 1483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber sendCommand(OMX_CommandStateSet, OMX_StateLoaded); 1493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber freeActiveBuffers(); 1513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_ERRORTYPE err; 1533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1549f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber && state != OMX_StateLoaded 1559f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber && state != OMX_StateInvalid) { 1563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("waiting for Loaded state..."); 1573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber usleep(100000); 1583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1593085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(err, OMX_ErrorNone); 1603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // fall through 1623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateLoaded: 1659a50fdf467fdd56bb97efc3bc0931a9e52b990a7Andreas Huber case OMX_StateInvalid: 1663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 1673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber default: 1693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK(!"should not be here, unknown state."); 1703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 1713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 173fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMX_ERRORTYPE err = master->destroyComponentInstance( 174fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber static_cast<OMX_COMPONENTTYPE *>(mHandle)); 175fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 176784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle = NULL; 177784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 178784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 179784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("FreeHandle FAILED with error 0x%08x.", err); 180784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 181784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 182784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mOwner->invalidateNodeID(mNodeID); 183784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID = NULL; 184784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 185ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber LOGV("OMXNodeInstance going away."); 186ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber delete this; 187784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 188784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 189784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 191784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::sendCommand( 192784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_COMMANDTYPE cmd, OMX_S32 param) { 193784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 194784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 195784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL); 196784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 197784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 198784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 199784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getParameter( 200784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 201784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 202784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 203784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); 204784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 205784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 206784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 207784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setParameter( 208784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 209784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 210784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 211784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SetParameter( 212784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, index, const_cast<void *>(params)); 213784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 214784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 215784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 216784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 217784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getConfig( 218784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 219784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 220784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 221784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params); 222784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 223784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 224784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 225784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setConfig( 226784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 227784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 228784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 229784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SetConfig( 230784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, index, const_cast<void *>(params)); 231784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 232784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 233784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 234784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 235784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::useBuffer( 236784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 237784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id *buffer) { 238784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 239784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 240784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(params); 241784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 242784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 243784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 244784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_UseBuffer( 245784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, 246784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber params->size(), static_cast<OMX_U8 *>(params->pointer())); 247784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 248784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 249784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err); 250784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 251784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 252784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 253784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 254784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 255784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 256784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 257784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 258784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 259784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 260784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 2613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 2623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 263784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 264784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 265784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 266784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBuffer( 267c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer, 268c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber void **buffer_data) { 269784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 270784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 271784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(size); 272784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 273784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 274784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 275784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 276784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, size); 277784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 278784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 279784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 280784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 281784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 282784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 283784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 284784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 285784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 286784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 287784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 288784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 289784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 290c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber *buffer_data = header->pBuffer; 291784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 2923085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 2933085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 294784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 295784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 296784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 297784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup( 298784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 299784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id *buffer) { 300784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 301784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 302784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(params, true); 303784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 304784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 305784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 306784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 307784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, params->size()); 308784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 309784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 310784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 311784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 312784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 313784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 314784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 315784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 316784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 317784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 318784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 319784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 320784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 321784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3223085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 3233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 324784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 325784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 326784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 327784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeBuffer( 328784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, OMX::buffer_id buffer) { 329784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 330784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber removeActiveBuffer(portIndex, buffer); 3323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 333784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 334784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 335784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 336784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 337784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 338784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 339784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 340784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 341784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 342784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 343784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 344784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) { 345784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 346784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 347784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 348784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen = 0; 349784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nOffset = 0; 350784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFlags = 0; 351784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 352784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 353784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 354784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 355784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 356784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 357784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::emptyBuffer( 358784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id buffer, 359784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 360784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 361784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 362784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 363784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 364784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen = rangeLength; 365784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nOffset = rangeOffset; 366784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFlags = flags; 367784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nTimeStamp = timestamp; 368784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 369784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = 370784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 371784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta->CopyToOMX(header); 372784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 373784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 374784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 375784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 376784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 377784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 378784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getExtensionIndex( 379784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber const char *parameterName, OMX_INDEXTYPE *index) { 380784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 381784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 382784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetExtensionIndex( 383784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, const_cast<char *>(parameterName), index); 384784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 385784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 386784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 387784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 388784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) { 389784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 390784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *buffer = 391784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<OMX_BUFFERHEADERTYPE *>( 392784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber msg.u.extended_buffer_data.buffer); 393784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 394784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = 395784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 396784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 397784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta->CopyFromOMX(buffer); 398784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 399784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 400784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mObserver->onMessage(msg); 401784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 402784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 403fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) { 404784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("!!! Observer died. Quickly, do something, ... anything..."); 405784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 406784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber // Try to force shutdown of the node and hope for the best. 407fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber freeNode(master); 408784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 409784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 410784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onGetHandleFailed() { 411784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete this; 412784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 413784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 414784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 415784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 416784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 417784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 418784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_EVENTTYPE eEvent, 419784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_U32 nData1, 420784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_U32 nData2, 421784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pEventData) { 422784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4232ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4242ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4252ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 426784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnEvent( 427784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber instance->nodeID(), eEvent, nData1, nData2, pEventData); 428784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 429784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 430784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 431784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 432784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 433784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 434784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 435784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4362ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4372ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4382ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 439784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); 440784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 441784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 442784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 443784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 444784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 445784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 446784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 447784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4482ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4492ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4502ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 451784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer); 452784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 453784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 4543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) { 4553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber ActiveBuffer active; 4563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber active.mPortIndex = portIndex; 4573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber active.mID = id; 4583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber mActiveBuffers.push(active); 4593085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::removeActiveBuffer( 4623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_U32 portIndex, OMX::buffer_id id) { 4633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber bool found = false; 4643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber for (size_t i = 0; i < mActiveBuffers.size(); ++i) { 4653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber if (mActiveBuffers[i].mPortIndex == portIndex 4663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber && mActiveBuffers[i].mID == id) { 4673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber found = true; 4683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber mActiveBuffers.removeItemsAt(i); 4693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 4703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4733085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber if (!found) { 4743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGW("Attempt to remove an active buffer we know nothing about..."); 4753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4763085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4773085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4783085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::freeActiveBuffers() { 4793085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // Make sure to count down here, as freeBuffer will in turn remove 4803085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // the active buffer from the vector... 4813085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber for (size_t i = mActiveBuffers.size(); i--;) { 4823085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); 4833085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4843085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4853085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 486784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} // namespace android 487784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 488