OMXNodeInstance.cpp revision 03b268eac37ca2589bfff0bf58daf79d29cc14f4
1318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber/* 2318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * 4318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * you may not use this file except in compliance with the License. 6318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * You may obtain a copy of the License at 7318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * 8318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * 10318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * Unless required by applicable law or agreed to in writing, software 11318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * See the License for the specific language governing permissions and 14318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber * limitations under the License. 15318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber */ 16318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 17318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber//#define LOG_NDEBUG 0 18318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#define LOG_TAG "OMXNodeInstance" 19318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <utils/Log.h> 20318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 21318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "../include/OMXNodeInstance.h" 22f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber#include "OMXMaster.h" 23318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 24e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber#include <OMX_Component.h> 25318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 26318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h> 27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <media/stagefright/MediaDebug.h> 282a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber#include <media/stagefright/MediaErrors.h> 29318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 30318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android { 31318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta { 33318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta(const sp<IMemory> &mem, bool is_backup = false) 34318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mMem(mem), 35318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mIsBackup(is_backup) { 36318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 37318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 38318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta(size_t size) 39318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mSize(size), 40318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mIsBackup(false) { 41318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 42318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) { 44318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (!mIsBackup) { 45318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return; 46318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 47318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 48318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber memcpy((OMX_U8 *)mMem->pointer() + header->nOffset, 49318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->pBuffer + header->nOffset, 50318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen); 51318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 52318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 53318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) { 54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (!mIsBackup) { 55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return; 56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber memcpy(header->pBuffer + header->nOffset, 59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber (const OMX_U8 *)mMem->pointer() + header->nOffset, 60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen); 61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 63318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate: 64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IMemory> mMem; 65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber size_t mSize; 66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber bool mIsBackup; 67318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 68318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta(const BufferMeta &); 69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta &operator=(const BufferMeta &); 70318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}; 71318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 72318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { 74318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone 75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}; 76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance( 78318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX *owner, const sp<IOMXObserver> &observer) 79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mOwner(owner), 80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mNodeID(NULL), 81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle(NULL), 82134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber mObserver(observer), 83134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber mDying(false) { 84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 86318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() { 87318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber CHECK_EQ(mHandle, NULL); 88318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 89318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 90318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) { 91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber CHECK_EQ(mHandle, NULL); 92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mNodeID = node_id; 93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle = handle; 94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() { 97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mOwner; 98318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() { 101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mObserver; 102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() { 105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mNodeID; 106318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) { 1092a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber switch (err) { 1102a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber case OMX_ErrorNone: 1112a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber return OK; 1122a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber case OMX_ErrorUnsupportedSetting: 1132a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber return ERROR_UNSUPPORTED; 1142a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber default: 1152a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber return UNKNOWN_ERROR; 1162a3847ee1cbdaa8a65eee397a0173bb02211c459Andreas Huber } 117318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 119f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huberstatus_t OMXNodeInstance::freeNode(OMXMaster *master) { 120d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // Transition the node from its current state all the way down 121d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // to "Loaded". 122d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // This ensures that all active buffers are properly freed even 123d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // for components that don't do this themselves on a call to 124d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // "FreeHandle". 125d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 126134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // The code below may trigger some more events to be dispatched 127134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // by the OMX component - we want to ignore them as our client 128134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber // does not expect them. 129134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber mDying = true; 130134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber 131d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_STATETYPE state; 132d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(OMX_GetState(mHandle, &state), OMX_ErrorNone); 133d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber switch (state) { 134d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateExecuting: 135d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber { 136d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber LOGV("forcing Executing->Idle"); 137d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber sendCommand(OMX_CommandStateSet, OMX_StateIdle); 138d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_ERRORTYPE err; 139d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1400d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber && state != OMX_StateIdle 1410d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber && state != OMX_StateInvalid) { 142d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber usleep(100000); 143d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 144d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(err, OMX_ErrorNone); 145d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 1460d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber if (state == OMX_StateInvalid) { 1470d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber break; 1480d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber } 1490d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber 150d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // fall through 151d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 152d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 153d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateIdle: 154d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber { 155d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber LOGV("forcing Idle->Loaded"); 156d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber sendCommand(OMX_CommandStateSet, OMX_StateLoaded); 157d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 158d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber freeActiveBuffers(); 159d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 160d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_ERRORTYPE err; 161d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber while ((err = OMX_GetState(mHandle, &state)) == OMX_ErrorNone 1620d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber && state != OMX_StateLoaded 1630d681df3b0ded2c1e335b6b5785439da4ce2c238Andreas Huber && state != OMX_StateInvalid) { 164d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber LOGV("waiting for Loaded state..."); 165d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber usleep(100000); 166d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 167d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK_EQ(err, OMX_ErrorNone); 168d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 169d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // fall through 170d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 171d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 172d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber case OMX_StateLoaded: 173fa70cad40b01627ac1c22e04cdd548ece9c2654fAndreas Huber case OMX_StateInvalid: 174d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber break; 175d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 176d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber default: 177d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber CHECK(!"should not be here, unknown state."); 178d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber break; 179d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 180d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 181f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber OMX_ERRORTYPE err = master->destroyComponentInstance( 182f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber static_cast<OMX_COMPONENTTYPE *>(mHandle)); 183f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber 184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle = NULL; 185318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 186318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 187318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("FreeHandle FAILED with error 0x%08x.", err); 188318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 189318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 190318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOwner->invalidateNodeID(mNodeID); 191318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mNodeID = NULL; 192318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 19347bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber LOGV("OMXNodeInstance going away."); 19447bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber delete this; 195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 196318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 197318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 198318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 199318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand( 200318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_COMMANDTYPE cmd, OMX_S32 param) { 201318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 202318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 203318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL); 204318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 205318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 206318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 207318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter( 208318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 209318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 210318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 211318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); 212318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 213318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 214318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 215318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter( 216318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 217318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 218318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 219318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SetParameter( 220318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, index, const_cast<void *>(params)); 221318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 222318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 224318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig( 226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 227318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params); 230318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig( 234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SetConfig( 238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, index, const_cast<void *>(params)); 239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer( 244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX::buffer_id *buffer) { 246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = new BufferMeta(params); 249318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 250318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 251318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 252318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_UseBuffer( 253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, 254318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber params->size(), static_cast<OMX_U8 *>(params->pointer())); 255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 256318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 257318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err); 258318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 259318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 260318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 262318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return UNKNOWN_ERROR; 265318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 26703b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 26803b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = header; 270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 271d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 272d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 273318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBuffer( 277570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer, 278570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber void **buffer_data) { 279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 281318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = new BufferMeta(size); 282318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 284318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, size); 287318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 288318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 289318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 290318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 291318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 292318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 293318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 294318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 295318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 296318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return UNKNOWN_ERROR; 297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 298318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 29903b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 30003b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 301318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = header; 302570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber *buffer_data = header->pBuffer; 303318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 304d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 305d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 306318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 308318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 309318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup( 310318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 311318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX::buffer_id *buffer) { 312318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 313318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 314318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = new BufferMeta(params, true); 315318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 316318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 317318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 318318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 319318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, params->size()); 320318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 321318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 322318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 323318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 324318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 325318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 326318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 327318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 328318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 329318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return UNKNOWN_ERROR; 330318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 331318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 33203b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber CHECK_EQ(header->pAppPrivate, buffer_meta); 33303b268eac37ca2589bfff0bf58daf79d29cc14f4Andreas Huber 334318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = header; 335318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 336d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber addActiveBuffer(portIndex, *buffer); 337d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 338318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 339318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 340318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 341318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer( 342318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, OMX::buffer_id buffer) { 343318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 344318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 345d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber removeActiveBuffer(portIndex, buffer); 346d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 347318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 348318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 349318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 350318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 351318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 352318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 353318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 354318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 356318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 357318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 358318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) { 359318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 360318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 361318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 362318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen = 0; 363318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nOffset = 0; 364318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFlags = 0; 365318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 366318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 367318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 368318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 369318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 370318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 371318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer( 372318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX::buffer_id buffer, 373318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 374318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 375318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 376318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 377318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 378318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen = rangeLength; 379318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nOffset = rangeOffset; 380318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFlags = flags; 381318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nTimeStamp = timestamp; 382318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 383318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 384318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 385318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta->CopyToOMX(header); 386318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 387318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 388318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 389318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 390318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 391318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 392318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getExtensionIndex( 393318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *parameterName, OMX_INDEXTYPE *index) { 394318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 395318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 396318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetExtensionIndex( 397318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, const_cast<char *>(parameterName), index); 398318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 399318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 400318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 401318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 402318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) { 403318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 404318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *buffer = 405318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<OMX_BUFFERHEADERTYPE *>( 406318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber msg.u.extended_buffer_data.buffer); 407318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 408318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 409318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 410318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 411318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta->CopyFromOMX(buffer); 412318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 413318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 414318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mObserver->onMessage(msg); 415318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 416318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 417f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Hubervoid OMXNodeInstance::onObserverDied(OMXMaster *master) { 418318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("!!! Observer died. Quickly, do something, ... anything..."); 419318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 420318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber // Try to force shutdown of the node and hope for the best. 421f0fb96c352f30b812a4903a1d783a715e1e817bdAndreas Huber freeNode(master); 422318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 423318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 424318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() { 425318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete this; 426318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 427318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 428318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 429318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 430318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_HANDLETYPE hComponent, 431318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 432318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_EVENTTYPE eEvent, 433318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData1, 434318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData2, 435318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pEventData) { 436318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 437134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 438134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 439134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 440318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return instance->owner()->OnEvent( 441318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber instance->nodeID(), eEvent, nData1, nData2, pEventData); 442318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 443318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 444318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 445318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 446318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_HANDLETYPE hComponent, 447318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 448318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 449318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 450134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 451134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 452134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 453318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); 454318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 455318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 456318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 457318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 458318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_HANDLETYPE hComponent, 459318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 460318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 461318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 462134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber if (instance->mDying) { 463134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber return OMX_ErrorNone; 464134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber } 465318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer); 466318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 467318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 468d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) { 469d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber ActiveBuffer active; 470d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber active.mPortIndex = portIndex; 471d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber active.mID = id; 472d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber mActiveBuffers.push(active); 473d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 474d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 475d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::removeActiveBuffer( 476d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber OMX_U32 portIndex, OMX::buffer_id id) { 477d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber bool found = false; 478d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber for (size_t i = 0; i < mActiveBuffers.size(); ++i) { 479d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber if (mActiveBuffers[i].mPortIndex == portIndex 480d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber && mActiveBuffers[i].mID == id) { 481d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber found = true; 482d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber mActiveBuffers.removeItemsAt(i); 483d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber break; 484d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 485d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 486d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 487d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber if (!found) { 488d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber LOGW("Attempt to remove an active buffer we know nothing about..."); 489d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 490d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 491d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 492d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Hubervoid OMXNodeInstance::freeActiveBuffers() { 493d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // Make sure to count down here, as freeBuffer will in turn remove 494d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber // the active buffer from the vector... 495d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber for (size_t i = mActiveBuffers.size(); i--;) { 496d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber freeBuffer(mActiveBuffers[i].mPortIndex, mActiveBuffers[i].mID); 497d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber } 498d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber} 499d6703ab22c85b43fdb2deb78a37e51465c902a5fAndreas Huber 500318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} // namespace android 501318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 502