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> 282a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber#include <media/stagefright/MediaErrors.h> 29784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 30784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubernamespace android { 31784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 32784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstruct BufferMeta { 33784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(const sp<IMemory> &mem, bool is_backup = false) 34784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mMem(mem), 35784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mIsBackup(is_backup) { 36784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 37784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 38784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(size_t size) 39784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mSize(size), 40784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mIsBackup(false) { 41784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 42784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 43784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) { 44784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (!mIsBackup) { 45784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return; 46784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 47784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 48784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber memcpy((OMX_U8 *)mMem->pointer() + header->nOffset, 49784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->pBuffer + header->nOffset, 50784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen); 51784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 52784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 53784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) { 54784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (!mIsBackup) { 55784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return; 56784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 57784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 58784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber memcpy(header->pBuffer + header->nOffset, 59784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber (const OMX_U8 *)mMem->pointer() + header->nOffset, 60784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen); 61784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 62784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 63784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberprivate: 64784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber sp<IMemory> mMem; 65784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber size_t mSize; 66784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber bool mIsBackup; 67784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 68784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta(const BufferMeta &); 69784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta &operator=(const BufferMeta &); 70784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}; 71784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 72784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 73784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { 74784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone 75784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber}; 76784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 77784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::OMXNodeInstance( 78784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX *owner, const sp<IOMXObserver> &observer) 79784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber : mOwner(owner), 80784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID(NULL), 81784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle(NULL), 822ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber mObserver(observer), 832ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber mDying(false) { 84784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 85784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 86784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMXNodeInstance::~OMXNodeInstance() { 87784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber CHECK_EQ(mHandle, NULL); 88784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 89784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 90784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) { 91784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber CHECK_EQ(mHandle, NULL); 92784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID = node_id; 93784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle = handle; 94784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 95784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 96784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX *OMXNodeInstance::owner() { 97784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mOwner; 98784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 99784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 100784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubersp<IOMXObserver> OMXNodeInstance::observer() { 101784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mObserver; 102784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 103784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 104784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX::node_id OMXNodeInstance::nodeID() { 105784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return mNodeID; 106784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 107784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 108784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) { 1092a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber switch (err) { 1102a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber case OMX_ErrorNone: 1112a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber return OK; 1122a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber case OMX_ErrorUnsupportedSetting: 1132a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber return ERROR_UNSUPPORTED; 1142a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber default: 1152a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber return UNKNOWN_ERROR; 1162a09c7e042d6a3ae600b25f606d584368a6e3f3aAndreas Huber } 117784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 118784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 119fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) { 1203085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // Transition the node from its current state all the way down 1213085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // to "Loaded". 1223085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // This ensures that all active buffers are properly freed even 1233085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // for components that don't do this themselves on a call to 1243085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // "FreeHandle". 1253085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1262ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber // The code below may trigger some more events to be dispatched 1272ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber // by the OMX component - we want to ignore them as our client 1282ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber // does not expect them. 1292ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber mDying = true; 1302ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber 1313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_STATETYPE state; 1323085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone); 1333085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber switch (state) { 1343085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateExecuting: 1353085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber { 1363085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("forcing Executing->Idle"); 1373085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber sendCommand(OMX_CommandStateSet, OMX_StateIdle); 1383085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_ERRORTYPE err; 1393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1409f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber && state != OMX_StateIdle 1419f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber && state != OMX_StateInvalid) { 1423085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber usleep(100000); 1433085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1443085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(err, OMX_ErrorNone); 1453085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1469f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber if (state == OMX_StateInvalid) { 1479f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber break; 1489f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber } 1499f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber 1503085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // fall through 1513085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1523085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1533085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateIdle: 1543085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber { 1553085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("forcing Idle->Loaded"); 1563085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber sendCommand(OMX_CommandStateSet, OMX_StateLoaded); 1573085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1583085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber freeActiveBuffers(); 1593085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1603085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_ERRORTYPE err; 1613085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1629f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber && state != OMX_StateLoaded 1639f4557ed0b29c85df1f2219408bad91ae4e29cbbAndreas Huber && state != OMX_StateInvalid) { 1643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGV("waiting for Loaded state..."); 1653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber usleep(100000); 1663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK_EQ(err, OMX_ErrorNone); 1683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // fall through 1703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber case OMX_StateLoaded: 1739a50fdf467fdd56bb97efc3bc0931a9e52b990a7Andreas Huber case OMX_StateInvalid: 1743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 1753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 1763085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber default: 1773085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber CHECK(!"should not be here, unknown state."); 1783085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 1793085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 1803085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 181fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber OMX_ERRORTYPE err = master->destroyComponentInstance( 182fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber static_cast<OMX_COMPONENTTYPE *>(mHandle)); 183fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber 184784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle = NULL; 185784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 186784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 187784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("FreeHandle FAILED with error 0x%08x.", err); 188784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 189784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 190784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mOwner->invalidateNodeID(mNodeID); 191784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mNodeID = NULL; 192784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 193ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber LOGV("OMXNodeInstance going away."); 194ad28543022101d0b01845e3f53dcd57e524816efAndreas Huber delete this; 195784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 196784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 197784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 198784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 199784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::sendCommand( 200784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_COMMANDTYPE cmd, OMX_S32 param) { 201784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 202784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 203784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL); 204784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 205784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 206784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 207784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getParameter( 208784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 209784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 210784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 211784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); 212784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 213784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 214784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 215784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setParameter( 216784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 217784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 218784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 219784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SetParameter( 220784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, index, const_cast<void *>(params)); 221784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 222784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 223784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 224784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 225784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getConfig( 226784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 227784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 228784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 229784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params); 230784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 231784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 232784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 233784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::setConfig( 234784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 235784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 236784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 237784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_SetConfig( 238784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, index, const_cast<void *>(params)); 239784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 240784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 241784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 242784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 243784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::useBuffer( 244784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 245784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id *buffer) { 246784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 247784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 248784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(params); 249784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 250784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 251784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 252784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_UseBuffer( 253784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, 254784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber params->size(), static_cast<OMX_U8 *>(params->pointer())); 255784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 256784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 257784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err); 258784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 259784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 260784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 261784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 262784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 263784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 264784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 265784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 266784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 267784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 268784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 2693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 2703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 271784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 272784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 273784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 274784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBuffer( 275c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer, 276c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber void **buffer_data) { 277784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 278784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 279784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(size); 280784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 281784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 282784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 283784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 284784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, size); 285784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 286784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 287784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 288784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 289784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 290784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 291784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 292784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 293784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 294784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 295784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 296784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 297784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 298c712b9fe2859435ce142b90ddcb46c5bed33eea8Andreas Huber *buffer_data = header->pBuffer; 299784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3003085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 3013085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 302784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 303784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 304784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 305784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup( 306784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 307784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id *buffer) { 308784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 309784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 310784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = new BufferMeta(params, true); 311784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 312784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header; 313784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 314784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 315784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, &header, portIndex, buffer_meta, params->size()); 316784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 317784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (err != OMX_ErrorNone) { 318784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 319784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 320784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 321784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 322784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 323784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = 0; 324784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 325784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return UNKNOWN_ERROR; 326784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 327784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 328784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber *buffer = header; 329784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3303085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber addActiveBuffer(portIndex, *buffer); 3313085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 332784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return OK; 333784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 334784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 335784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::freeBuffer( 336784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 portIndex, OMX::buffer_id buffer) { 337784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 338784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 3393085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber removeActiveBuffer(portIndex, buffer); 3403085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 341784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 342784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 343784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 344784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 345784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 346784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete buffer_meta; 347784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta = NULL; 348784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 349784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 350784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 351784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 352784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) { 353784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 354784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 355784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 356784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen = 0; 357784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nOffset = 0; 358784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFlags = 0; 359784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 360784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 361784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 362784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 363784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 364784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 365784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::emptyBuffer( 366784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX::buffer_id buffer, 367784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 368784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 369784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 370784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 371784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 372784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFilledLen = rangeLength; 373784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nOffset = rangeOffset; 374784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nFlags = flags; 375784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber header->nTimeStamp = timestamp; 376784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 377784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = 378784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 379784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta->CopyToOMX(header); 380784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 381784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 382784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 383784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 384784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 385784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 386784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huberstatus_t OMXNodeInstance::getExtensionIndex( 387784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber const char *parameterName, OMX_INDEXTYPE *index) { 388784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber Mutex::Autolock autoLock(mLock); 389784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 390784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_ERRORTYPE err = OMX_GetExtensionIndex( 391784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mHandle, const_cast<char *>(parameterName), index); 392784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 393784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return StatusFromOMXError(err); 394784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 395784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 396784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) { 397784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 398784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_BUFFERHEADERTYPE *buffer = 399784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<OMX_BUFFERHEADERTYPE *>( 400784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber msg.u.extended_buffer_data.buffer); 401784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 402784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber BufferMeta *buffer_meta = 403784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 404784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 405784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber buffer_meta->CopyFromOMX(buffer); 406784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber } 407784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 408784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber mObserver->onMessage(msg); 409784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 410784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 411fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) { 412784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber LOGE("!!! Observer died. Quickly, do something, ... anything..."); 413784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 414784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber // Try to force shutdown of the node and hope for the best. 415fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber freeNode(master); 416784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 417784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 418784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Hubervoid OMXNodeInstance::onGetHandleFailed() { 419784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber delete this; 420784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 421784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 422784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 423784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 424784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 425784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 426784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_EVENTTYPE eEvent, 427784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_U32 nData1, 428784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_U32 nData2, 429784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pEventData) { 430784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4312ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4322ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4332ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 434784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnEvent( 435784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber instance->nodeID(), eEvent, nData1, nData2, pEventData); 436784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 437784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 438784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 439784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 440784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 441784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 442784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 443784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4442ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4452ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4462ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 447784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); 448784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 449784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 450784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber// static 451784202ea115603004b067aacf6a57bf5d2a7d53bAndreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 452784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_HANDLETYPE hComponent, 453784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_PTR pAppData, 454784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 455784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 4562ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber if (instance->mDying) { 4572ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber return OMX_ErrorNone; 4582ea14e231945afb6581fa8f54015b33bc74a19e5Andreas Huber } 459784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer); 460784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} 461784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 4623085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) { 4633085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber ActiveBuffer active; 4643085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber active.mPortIndex = portIndex; 4653085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber active.mID = id; 4663085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber mActiveBuffers.push(active); 4673085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4683085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4693085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::removeActiveBuffer( 4703085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber OMX_U32 portIndex, OMX::buffer_id id) { 4713085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber bool found = false; 4723085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber for (size_t i = 0; i < mActiveBuffers.size(); ++i) { 4733085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber if (mActiveBuffers[i].mPortIndex == portIndex 4743085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber && mActiveBuffers[i].mID == id) { 4753085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber found = true; 4763085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber mActiveBuffers.removeItemsAt(i); 4773085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber break; 4783085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4793085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4803085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4813085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber if (!found) { 4823085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber LOGW("Attempt to remove an active buffer we know nothing about..."); 4833085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4843085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4853085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 4863085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Hubervoid OMXNodeInstance::freeActiveBuffers() { 4873085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // Make sure to count down here, as freeBuffer will in turn remove 4883085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber // the active buffer from the vector... 4893085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber for (size_t i = mActiveBuffers.size(); i--;) { 4903085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); 4913085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber } 4923085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber} 4933085c83e0015f019c960bc76f9689dfbfc9f5bb8Andreas Huber 494784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber} // namespace android 495784202ea115603004b067aacf6a57bf5d2a7d53bAndreas Huber 496