OMXNodeInstance.cpp revision 3085c83e0015f019c960bc76f9689dfbfc9f5bb8
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" 22784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 23784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include "pv_omxcore.h" 24784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 25784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <binder/IMemory.h> 26784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber#include <media/stagefright/MediaDebug.h> 27784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 28784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubernamespace android { 29784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 30784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstruct BufferMeta { 31784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(const sp<IMemory> &mem, bool is_backup = false) 32784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mMem(mem), 33784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mIsBackup(is_backup) { 34784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 35784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 36784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(size_t size) 37784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mSize(size), 38784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mIsBackup(false) { 39784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 40784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 41784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) { 42784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (!mIsBackup) { 43784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return; 44784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 45784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 46784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber memcpy((OMX_U8 *)mMem->pointer() + header->nOffset, 47784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->pBuffer + header->nOffset, 48784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen); 49784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 50784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 51784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) { 52784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (!mIsBackup) { 53784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return; 54784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 55784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber memcpy(header->pBuffer + header->nOffset, 57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber (const OMX_U8 *)mMem->pointer() + header->nOffset, 58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen); 59784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberprivate: 62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber sp<IMemory> mMem; 63784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber size_t mSize; 64784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber bool mIsBackup; 65784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 66784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(const BufferMeta &); 67784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta &operator=(const BufferMeta &); 68784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}; 69784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 70784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 71784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { 72784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone 73784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}; 74784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 75784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::OMXNodeInstance( 76784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX *owner, const sp<IOMXObserver> &observer) 77784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mOwner(owner), 78784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID(NULL), 79784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle(NULL), 80784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mObserver(observer) { 81784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 82784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 83784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::~OMXNodeInstance() { 84784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber CHECK_EQ(mHandle, NULL); 85784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 86784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 87784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) { 88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber CHECK_EQ(mHandle, NULL); 89784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID = node_id; 90784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle = handle; 91784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 92784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX *OMXNodeInstance::owner() { 94784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mOwner; 95784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 96784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 97784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubersp<IOMXObserver> OMXNodeInstance::observer() { 98784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mObserver; 99784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 101784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX::node_id OMXNodeInstance::nodeID() { 102784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mNodeID; 103784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 104784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 105784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) { 106784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR; 107784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 109784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeNode() { 1103085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // Transition the node from its current state all the way down 1113085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // to "Loaded". 1123085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // This ensures that all active buffers are properly freed even 1133085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // for components that don't do this themselves on a call to 1143085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // "FreeHandle". 1153085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1163085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_STATETYPE state; 1173085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone); 1183085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber switch (state) { 1193085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateExecuting: 1203085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber { 1213085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("forcing Executing->Idle"); 1223085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber sendCommand(OMX_CommandStateSet, OMX_StateIdle); 1233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_ERRORTYPE err; 1243085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1253085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber && state != OMX_StateIdle) { 1263085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber usleep(100000); 1273085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1283085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(err, OMX_ErrorNone); 1293085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1303085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // fall through 1313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1333085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateIdle: 1343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber { 1353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("forcing Idle->Loaded"); 1363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber sendCommand(OMX_CommandStateSet, OMX_StateLoaded); 1373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1383085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber freeActiveBuffers(); 1393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1403085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_ERRORTYPE err; 1413085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber && state != OMX_StateLoaded) { 1433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("waiting for Loaded state..."); 1443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber usleep(100000); 1453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(err, OMX_ErrorNone); 1473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // fall through 1493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateLoaded: 1523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 1533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber default: 1553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK(!"should not be here, unknown state."); 1563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 1573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 159784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_MasterFreeHandle(mHandle); 160784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle = NULL; 161784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 162784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 163784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("FreeHandle FAILED with error 0x%08x.", err); 164784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 165784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 166784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mOwner->invalidateNodeID(mNodeID); 167784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID = NULL; 168784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 169ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber LOGV("OMXNodeInstance going away."); 170ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber delete this; 171784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 172784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 173784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 174784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 175784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::sendCommand( 176784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_COMMANDTYPE cmd, OMX_S32 param) { 177784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 178784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 179784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL); 180784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 181784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 182784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 183784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getParameter( 184784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 185784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 186784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 187784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); 188784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 189784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 191784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setParameter( 192784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 193784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 194784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 195784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SetParameter( 196784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, index, const_cast<void *>(params)); 197784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 198784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 199784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 200784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 201784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getConfig( 202784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 203784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 204784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 205784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params); 206784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 207784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 208784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 209784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setConfig( 210784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 211784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 212784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 213784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SetConfig( 214784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, index, const_cast<void *>(params)); 215784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 216784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 217784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 218784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 219784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::useBuffer( 220784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 221784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id *buffer) { 222784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 223784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 224784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(params); 225784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 226784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 227784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 228784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_UseBuffer( 229784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, 230784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber params->size(), static_cast<OMX_U8 *>(params->pointer())); 231784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 232784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 233784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err); 234784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 235784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 236784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 237784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 238784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 239784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 240784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 241784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 242784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 243784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 244784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 2453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 2463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 247784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 248784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 249784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 250784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBuffer( 251784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer) { 252784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 253784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 254784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(size); 255784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 256784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 257784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 258784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 259784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, size); 260784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 261784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 262784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 263784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 264784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 265784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 266784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 267784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 268784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 269784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 270784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 271784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 272784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 273784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 2743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 2753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 276784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 277784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 278784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 279784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup( 280784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 281784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id *buffer) { 282784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 283784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 284784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(params, true); 285784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 286784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 287784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 288784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 289784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, params->size()); 290784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 291784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 292784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 293784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 294784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 295784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 296784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 297784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 298784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 299784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 300784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 301784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 302784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 303784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3043085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 3053085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 306784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 307784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 308784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 309784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeBuffer( 310784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, OMX::buffer_id buffer) { 311784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 312784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3133085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber removeActiveBuffer(portIndex, buffer); 3143085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 315784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 316784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 317784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 318784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 319784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 320784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 321784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 322784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 323784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 324784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 325784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 326784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) { 327784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 328784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 329784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 330784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen = 0; 331784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nOffset = 0; 332784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFlags = 0; 333784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 334784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 335784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 336784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 337784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 338784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 339784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::emptyBuffer( 340784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id buffer, 341784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 342784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 343784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 344784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 345784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 346784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen = rangeLength; 347784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nOffset = rangeOffset; 348784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFlags = flags; 349784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nTimeStamp = timestamp; 350784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 351784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = 352784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 353784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta->CopyToOMX(header); 354784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 355784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 356784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 357784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 358784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 359784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 360784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getExtensionIndex( 361784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber const char *parameterName, OMX_INDEXTYPE *index) { 362784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 363784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 364784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetExtensionIndex( 365784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, const_cast<char *>(parameterName), index); 366784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 367784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 368784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 369784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 370784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) { 371784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 372784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *buffer = 373784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<OMX_BUFFERHEADERTYPE *>( 374784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber msg.u.extended_buffer_data.buffer); 375784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 376784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = 377784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 378784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 379784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta->CopyFromOMX(buffer); 380784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 381784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 382784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mObserver->onMessage(msg); 383784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 384784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 385784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onObserverDied() { 386784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("!!! Observer died. Quickly, do something, ... anything..."); 387784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 388784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber // Try to force shutdown of the node and hope for the best. 389784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber freeNode(); 390784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 391784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 392784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onGetHandleFailed() { 393784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete this; 394784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 395784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 396784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 397784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 398784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 399784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 400784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_EVENTTYPE eEvent, 401784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_U32 nData1, 402784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_U32 nData2, 403784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pEventData) { 404784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 405784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnEvent( 406784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber instance->nodeID(), eEvent, nData1, nData2, pEventData); 407784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 408784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 409784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 410784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 411784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 412784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 413784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 414784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 415784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); 416784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 417784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 418784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 419784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 420784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 421784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 422784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 423784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 424784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer); 425784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 426784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 4273085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) { 4283085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber ActiveBuffer active; 4293085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber active.mPortIndex = portIndex; 4303085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber active.mID = id; 4313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber mActiveBuffers.push(active); 4323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4333085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::removeActiveBuffer( 4353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_U32 portIndex, OMX::buffer_id id) { 4363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber bool found = false; 4373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber for (size_t i = 0; i < mActiveBuffers.size(); ++i) { 4383085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber if (mActiveBuffers[i].mPortIndex == portIndex 4393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber && mActiveBuffers[i].mID == id) { 4403085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber found = true; 4413085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber mActiveBuffers.removeItemsAt(i); 4423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 4433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4463085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber if (!found) { 4473085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGW("Attempt to remove an active buffer we know nothing about..."); 4483085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4493085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::freeActiveBuffers() { 4523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // Make sure to count down here, as freeBuffer will in turn remove 4533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // the active buffer from the vector... 4543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber for (size_t i = mActiveBuffers.size(); i--;) { 4553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); 4563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 459784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} // namespace android 460784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 461