OMXNodeInstance.cpp revision 2ea14e231945afb6581fa8f54015b33bc74a19e5
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 1323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber && state != OMX_StateIdle) { 1333085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber usleep(100000); 1343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(err, OMX_ErrorNone); 1363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // fall through 1383085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1403085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateIdle: 1413085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber { 1423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("forcing Idle->Loaded"); 1433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber sendCommand(OMX_CommandStateSet, OMX_StateLoaded); 1443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber freeActiveBuffers(); 1463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_ERRORTYPE err; 1483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber && state != OMX_StateLoaded) { 1503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("waiting for Loaded state..."); 1513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber usleep(100000); 1523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(err, OMX_ErrorNone); 1543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // fall through 1563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateLoaded: 1599a50fdf467fdd56bb97efc3bc0931a9e52b990a7Andreas Huber case OMX_StateInvalid: 1603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 1613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber default: 1633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK(!"should not be here, unknown state."); 1643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 1653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 167fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMX_ERRORTYPE err = master->destroyComponentInstance( 168fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber static_cast<OMX_COMPONENTTYPE *>(mHandle)); 169fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 170784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle = NULL; 171784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 172784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 173784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("FreeHandle FAILED with error 0x%08x.", err); 174784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 175784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 176784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mOwner->invalidateNodeID(mNodeID); 177784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID = NULL; 178784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 179ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber LOGV("OMXNodeInstance going away."); 180ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber delete this; 181784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 182784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 183784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 184784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 185784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::sendCommand( 186784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_COMMANDTYPE cmd, OMX_S32 param) { 187784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 188784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 189784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL); 190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 191784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 192784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 193784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getParameter( 194784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 195784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 196784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 197784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); 198784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 199784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 200784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 201784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setParameter( 202784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 203784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 204784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 205784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SetParameter( 206784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, index, const_cast<void *>(params)); 207784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 208784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 209784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 210784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 211784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getConfig( 212784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 213784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 214784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 215784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params); 216784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 217784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 218784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 219784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setConfig( 220784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 221784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 222784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 223784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SetConfig( 224784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, index, const_cast<void *>(params)); 225784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 226784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 227784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 228784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 229784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::useBuffer( 230784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 231784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id *buffer) { 232784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 233784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 234784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(params); 235784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 236784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 237784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 238784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_UseBuffer( 239784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, 240784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber params->size(), static_cast<OMX_U8 *>(params->pointer())); 241784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 242784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 243784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err); 244784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 245784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 246784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 247784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 248784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 249784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 250784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 251784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 252784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 253784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 254784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 2553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 2563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 257784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 258784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 259784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 260784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBuffer( 261784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer) { 262784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 263784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 264784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(size); 265784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 266784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 267784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 268784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 269784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, size); 270784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 271784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 272784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 273784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 274784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 275784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 276784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 277784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 278784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 279784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 280784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 281784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 282784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 283784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 2843085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 2853085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 286784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 287784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 288784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 289784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup( 290784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 291784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id *buffer) { 292784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 293784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 294784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(params, true); 295784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 296784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 297784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 298784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 299784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, params->size()); 300784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 301784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 302784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 303784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 304784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 305784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 306784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 307784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 308784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 309784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 310784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 311784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 312784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 313784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3143085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 3153085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 316784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 317784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 318784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 319784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeBuffer( 320784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, OMX::buffer_id buffer) { 321784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 322784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber removeActiveBuffer(portIndex, buffer); 3243085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 325784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 326784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 327784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 328784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 329784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 330784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 331784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 332784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 333784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 334784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 335784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 336784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) { 337784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 338784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 339784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 340784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen = 0; 341784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nOffset = 0; 342784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFlags = 0; 343784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 344784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 345784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 346784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 347784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 348784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 349784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::emptyBuffer( 350784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id buffer, 351784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 352784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 353784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 354784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 355784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 356784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen = rangeLength; 357784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nOffset = rangeOffset; 358784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFlags = flags; 359784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nTimeStamp = timestamp; 360784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 361784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = 362784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 363784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta->CopyToOMX(header); 364784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 365784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 366784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 367784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 368784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 369784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 370784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getExtensionIndex( 371784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber const char *parameterName, OMX_INDEXTYPE *index) { 372784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 373784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 374784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetExtensionIndex( 375784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, const_cast<char *>(parameterName), index); 376784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 377784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 378784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 379784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 380784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) { 381784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 382784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *buffer = 383784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<OMX_BUFFERHEADERTYPE *>( 384784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber msg.u.extended_buffer_data.buffer); 385784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 386784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = 387784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 388784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 389784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta->CopyFromOMX(buffer); 390784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 391784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 392784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mObserver->onMessage(msg); 393784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 394784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 395fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) { 396784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("!!! Observer died. Quickly, do something, ... anything..."); 397784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 398784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber // Try to force shutdown of the node and hope for the best. 399fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber freeNode(master); 400784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 401784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 402784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onGetHandleFailed() { 403784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete this; 404784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 405784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 406784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 407784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 408784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 409784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 410784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_EVENTTYPE eEvent, 411784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_U32 nData1, 412784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_U32 nData2, 413784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pEventData) { 414784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4152ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4162ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4172ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 418784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnEvent( 419784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber instance->nodeID(), eEvent, nData1, nData2, pEventData); 420784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 421784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 422784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 423784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 424784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 425784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 426784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 427784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4282ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4292ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4302ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 431784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); 432784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 433784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 434784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 435784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 436784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 437784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 438784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 439784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4402ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4412ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4422ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 443784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer); 444784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 445784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 4463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) { 4473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber ActiveBuffer active; 4483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber active.mPortIndex = portIndex; 4493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber active.mID = id; 4503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber mActiveBuffers.push(active); 4513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::removeActiveBuffer( 4543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_U32 portIndex, OMX::buffer_id id) { 4553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber bool found = false; 4563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber for (size_t i = 0; i < mActiveBuffers.size(); ++i) { 4573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber if (mActiveBuffers[i].mPortIndex == portIndex 4583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber && mActiveBuffers[i].mID == id) { 4593085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber found = true; 4603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber mActiveBuffers.removeItemsAt(i); 4613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 4623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber if (!found) { 4663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGW("Attempt to remove an active buffer we know nothing about..."); 4673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::freeActiveBuffers() { 4713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // Make sure to count down here, as freeBuffer will in turn remove 4723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // the active buffer from the vector... 4733085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber for (size_t i = mActiveBuffers.size(); i--;) { 4743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); 4753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4763085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4773085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 478784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} // namespace android 479784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 480