OMXNodeInstance.cpp revision 47bed1a7755ed58fa5d4c0d35b20468deb83bd60
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" 22318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 23318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include "pv_omxcore.h" 24318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 25318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <binder/IMemory.h> 26318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <media/stagefright/MediaDebug.h> 27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 28318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubernamespace android { 29318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 30318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstruct BufferMeta { 31318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta(const sp<IMemory> &mem, bool is_backup = false) 32318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mMem(mem), 33318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mIsBackup(is_backup) { 34318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 35318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 36318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta(size_t size) 37318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mSize(size), 38318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mIsBackup(false) { 39318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 40318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 41318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber void CopyFromOMX(const OMX_BUFFERHEADERTYPE *header) { 42318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (!mIsBackup) { 43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return; 44318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 45318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 46318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber memcpy((OMX_U8 *)mMem->pointer() + header->nOffset, 47318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->pBuffer + header->nOffset, 48318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen); 49318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 50318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 51318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber void CopyToOMX(const OMX_BUFFERHEADERTYPE *header) { 52318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (!mIsBackup) { 53318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return; 54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber memcpy(header->pBuffer + header->nOffset, 57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber (const OMX_U8 *)mMem->pointer() + header->nOffset, 58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen); 59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate: 62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber sp<IMemory> mMem; 63318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber size_t mSize; 64318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber bool mIsBackup; 65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta(const BufferMeta &); 67318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta &operator=(const BufferMeta &); 68318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}; 69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 70318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 71318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { 72318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone 73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber}; 74318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::OMXNodeInstance( 76318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX *owner, const sp<IOMXObserver> &observer) 77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber : mOwner(owner), 78318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mNodeID(NULL), 79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle(NULL), 80318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mObserver(observer) { 81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 82318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 83318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMXNodeInstance::~OMXNodeInstance() { 84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber CHECK_EQ(mHandle, NULL); 85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 86318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 87318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::setHandle(OMX::node_id node_id, OMX_HANDLETYPE handle) { 88318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber CHECK_EQ(mHandle, NULL); 89318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mNodeID = node_id; 90318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle = handle; 91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 92318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX *OMXNodeInstance::owner() { 94318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mOwner; 95318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubersp<IOMXObserver> OMXNodeInstance::observer() { 98318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mObserver; 99318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 101318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX::node_id OMXNodeInstance::nodeID() { 102318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return mNodeID; 103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 105318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatic status_t StatusFromOMXError(OMX_ERRORTYPE err) { 106318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return (err == OMX_ErrorNone) ? OK : UNKNOWN_ERROR; 107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 108318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 109318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeNode() { 110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_MasterFreeHandle(mHandle); 111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle = NULL; 112318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 113318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 114318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("FreeHandle FAILED with error 0x%08x.", err); 115318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 116318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 117318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mOwner->invalidateNodeID(mNodeID); 118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mNodeID = NULL; 119318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 12047bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber LOGV("OMXNodeInstance going away."); 12147bed1a7755ed58fa5d4c0d35b20468deb83bd60Andreas Huber delete this; 122318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 123318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 124318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 125318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 126318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::sendCommand( 127318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_COMMANDTYPE cmd, OMX_S32 param) { 128318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 129318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 130318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SendCommand(mHandle, cmd, param, NULL); 131318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 132318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 133318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 134318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getParameter( 135318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 136318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 137318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 138318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); 139318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 140318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 141318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 142318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setParameter( 143318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 144318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 145318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 146318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SetParameter( 147318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, index, const_cast<void *>(params)); 148318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 149318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 150318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 151318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 152318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getConfig( 153318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_INDEXTYPE index, void *params, size_t size) { 154318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 155318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 156318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetConfig(mHandle, index, params); 157318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 158318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 159318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 160318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::setConfig( 161318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_INDEXTYPE index, const void *params, size_t size) { 162318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 163318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 164318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_SetConfig( 165318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, index, const_cast<void *>(params)); 166318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 167318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 168318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 170318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::useBuffer( 171318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 172318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX::buffer_id *buffer) { 173318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 174318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 175318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = new BufferMeta(params); 176318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 177318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 178318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 179318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_UseBuffer( 180318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, 181318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber params->size(), static_cast<OMX_U8 *>(params->pointer())); 182318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 183318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err); 185318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 186318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 187318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 188318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 189318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 190318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 191318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return UNKNOWN_ERROR; 192318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 193318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 194318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = header; 195318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 196318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 197318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 198318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 199318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBuffer( 200318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, size_t size, OMX::buffer_id *buffer) { 201318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 202318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 203318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = new BufferMeta(size); 204318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 205318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 206318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 207318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 208318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, size); 209318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 210318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 211318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 212318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 213318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 214318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 215318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 216318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 217318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 218318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return UNKNOWN_ERROR; 219318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 220318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 221318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = header; 222318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 223318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 224318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 225318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 226318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::allocateBufferWithBackup( 227318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, const sp<IMemory> ¶ms, 228318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX::buffer_id *buffer) { 229318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 230318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 231318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = new BufferMeta(params, true); 232318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 233318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header; 234318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 235318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_AllocateBuffer( 236318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, &header, portIndex, buffer_meta, params->size()); 237318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 238318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (err != OMX_ErrorNone) { 239318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("OMX_AllocateBuffer failed with error %d (0x%08x)", err, err); 240318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 241318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 242318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 243318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 244318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = 0; 245318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 246318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return UNKNOWN_ERROR; 247318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 248318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 249318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber *buffer = header; 250318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 251318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return OK; 252318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 253318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 254318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::freeBuffer( 255318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 portIndex, OMX::buffer_id buffer) { 256318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 257318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 258318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 259318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = static_cast<BufferMeta *>(header->pAppPrivate); 260318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 261318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); 262318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 263318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete buffer_meta; 264318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta = NULL; 265318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 266318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 267318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 268318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 269318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) { 270318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 271318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 272318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 273318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen = 0; 274318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nOffset = 0; 275318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFlags = 0; 276318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 277318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_FillThisBuffer(mHandle, header); 278318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 279318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 280318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 281318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 282318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::emptyBuffer( 283318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX::buffer_id buffer, 284318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 rangeOffset, OMX_U32 rangeLength, 285318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_U32 flags, OMX_TICKS timestamp) { 286318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 287318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 288318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; 289318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFilledLen = rangeLength; 290318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nOffset = rangeOffset; 291318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nFlags = flags; 292318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber header->nTimeStamp = timestamp; 293318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 294318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 295318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(header->pAppPrivate); 296318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta->CopyToOMX(header); 297318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 298318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_EmptyThisBuffer(mHandle, header); 299318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 300318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 301318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 302318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 303318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberstatus_t OMXNodeInstance::getExtensionIndex( 304318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber const char *parameterName, OMX_INDEXTYPE *index) { 305318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber Mutex::Autolock autoLock(mLock); 306318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 307318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_ERRORTYPE err = OMX_GetExtensionIndex( 308318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mHandle, const_cast<char *>(parameterName), index); 309318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 310318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return StatusFromOMXError(err); 311318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 312318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 313318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onMessage(const omx_message &msg) { 314318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber if (msg.type == omx_message::FILL_BUFFER_DONE) { 315318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_BUFFERHEADERTYPE *buffer = 316318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<OMX_BUFFERHEADERTYPE *>( 317318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber msg.u.extended_buffer_data.buffer); 318318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 319318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber BufferMeta *buffer_meta = 320318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber static_cast<BufferMeta *>(buffer->pAppPrivate); 321318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 322318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber buffer_meta->CopyFromOMX(buffer); 323318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber } 324318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 325318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber mObserver->onMessage(msg); 326318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 327318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 328318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onObserverDied() { 329318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber LOGE("!!! Observer died. Quickly, do something, ... anything..."); 330318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 331318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber // Try to force shutdown of the node and hope for the best. 332318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber freeNode(); 333318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 334318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 335318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Hubervoid OMXNodeInstance::onGetHandleFailed() { 336318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber delete this; 337318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 338318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 339318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 340318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEvent( 341318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_HANDLETYPE hComponent, 342318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 343318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_EVENTTYPE eEvent, 344318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData1, 345318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_U32 nData2, 346318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pEventData) { 347318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 348318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return instance->owner()->OnEvent( 349318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber instance->nodeID(), eEvent, nData1, nData2, pEventData); 350318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 351318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 352318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 353318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( 354318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_HANDLETYPE hComponent, 355318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 356318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 357318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 358318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); 359318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 360318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 361318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber// static 362318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas HuberOMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( 363318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_HANDLETYPE hComponent, 364318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_PTR pAppData, 365318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { 366318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber OMXNodeInstance *instance = static_cast<OMXNodeInstance *>(pAppData); 367318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer); 368318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} 369318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 370318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber} // namespace android 371318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber 372