1fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* ==================================================================== 2fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Texas Instruments OMAP(TM) Platform Software 3fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* (c) Copyright Texas Instruments, Incorporated. All Rights Reserved. 4fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 5fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Use of this software is controlled by the terms and conditions found 6fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* in the license agreement under which this software has been supplied. 7fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* ==================================================================== */ 8fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 9fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <dlfcn.h> /* For dynamic loading */ 10fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <stdio.h> 11fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <string.h> 12fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <stdlib.h> 13fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <pthread.h> 14fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include <utils/Log.h> 15fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 162c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles#undef LOG_TAG 172c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles#define LOG_TAG "TIOMX_CORE" 18fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 19fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "OMX_Component.h" 20fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "OMX_Core.h" 21fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "OMX_ComponentRegistry.h" 22fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 2317e995d39771569792c528f3dea559c83f0fc238Andreas Huber#ifndef NO_OPENCORE 242c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles/** determine capabilities of a component before acually using it */ 25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "ti_omx_config_parser.h" 2617e995d39771569792c528f3dea559c83f0fc238Andreas Huber#endif 27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** size for the array of allocated components. Sets the maximum 29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * number of components that can be allocated at once */ 30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAXCOMP (50) 31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAXNAMESIZE (130) 32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define EMPTY_STRING "\0" 33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Determine the number of elements in an array */ 35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define COUNTOF(x) (sizeof(x)/sizeof(x[0])) 36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Array to hold the DLL pointers for each allocated component */ 38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void* pModules[MAXCOMP] = {0}; 39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Array to hold the component handles for each allocated component */ 41fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void* pComponents[COUNTOF(pModules)] = {0}; 42fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 432c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles/** count will be used as a reference counter for OMX_Init() 442c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles so all changes to count should be mutex protected */ 45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint count = 0; 462c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charlesstatic pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint tableCount = 0; 49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinComponentTable componentTable[MAX_TABLE_SIZE]; 50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar * sRoleArray[60][20]; 51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar compName[60][200]; 52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 53fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar *tComponentName[MAXCOMP][2] = { 54fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /*video and image components */ 55b65f253fdc60f6208a54911bee793d225f23cdf8James Dong //{"OMX.TI.JPEG.decoder", "image_decoder.jpeg" }, 562c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles {"OMX.TI.JPEG.Encoder", "image_encoder.jpeg"}, 57990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.Video.Decoder", "video_decoder.h263"}, 58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.Decoder", "video_decoder.avc"}, 59990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.Video.Decoder", "video_decoder.mpeg2"}, 60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.Decoder", "video_decoder.mpeg4"}, 61c5b21bfb410626a503e479a5afa2095902783427Benny Wong {"OMX.TI.Video.Decoder", "video_decoder.wmv"}, 62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.encoder", "video_encoder.mpeg4"}, 63fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.encoder", "video_encoder.h263"}, 64fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.encoder", "video_encoder.avc"}, 65990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.VPP", "iv_renderer.yuv.overlay"}, 66990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.Camera", "camera.yuv"}, 67fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Speech components */ 692c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles/* {"OMX.TI.G729.encode", NULL}, 70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G729.decode", NULL}, 71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G722.encode", NULL}, 72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G722.decode", NULL}, 73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G711.encode", NULL}, 74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G711.decode", NULL}, 75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G723.encode", NULL}, 76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G723.decode", NULL}, 77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G726.encode", NULL}, 78fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G726.decode", NULL}, 79fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.GSMFR.encode", NULL}, 802c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles {"OMX.TI.GSMFR.decode", NULL}, 812c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles*/ 82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 83fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Audio components */ 842eb872487f5d31bc01507d26515208c0f4fedb2d<Benny.Wong@motorola.com>#ifdef BUILD_WITH_TI_AUDIO 852eb872487f5d31bc01507d26515208c0f4fedb2d<Benny.Wong@motorola.com> {"OMX.TI.MP3.decode", "audio_decoder.mp3"}, 86990117074ba37226d82be2f2ebe3739e488f848cJames Dong {"OMX.TI.AAC.encode", "audio_encoder.aac"}, 872eb872487f5d31bc01507d26515208c0f4fedb2d<Benny.Wong@motorola.com> {"OMX.TI.AAC.decode", "audio_decoder.aac"}, 88eaaadaf5ebb5e352e2ed4a12714f5d2363da0dcdJames Dong {"OMX.TI.WMA.decode", "audio_decoder.wma"}, 89b65f253fdc60f6208a54911bee793d225f23cdf8James Dong {"OMX.TI.WBAMR.decode", "audio_decoder.amrwb"}, 90b65f253fdc60f6208a54911bee793d225f23cdf8James Dong {"OMX.TI.AMR.decode", "audio_decoder.amrnb"}, 91b65f253fdc60f6208a54911bee793d225f23cdf8James Dong {"OMX.TI.AMR.encode", "audio_encoder.amrnb"}, 92b65f253fdc60f6208a54911bee793d225f23cdf8James Dong {"OMX.TI.WBAMR.encode", "audio_encoder.amrwb"}, 93eaaadaf5ebb5e352e2ed4a12714f5d2363da0dcdJames Dong#endif 94b65f253fdc60f6208a54911bee793d225f23cdf8James Dong/* {"OMX.TI.PCM.encode", NULL}, 95b65f253fdc60f6208a54911bee793d225f23cdf8James Dong {"OMX.TI.PCM.decode", NULL}, 962c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles {"OMX.TI.RAG.decode", "audio_decoder.ra"}, 972c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles {"OMX.TI.IMAADPCM.decode", NULL}, 982c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles {"OMX.TI.IMAADPCM.encode", NULL}, 992c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles*/ 100b65f253fdc60f6208a54911bee793d225f23cdf8James Dong 101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* terminate the table */ 102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {NULL, NULL}, 103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}; 104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\ 107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_Init() 108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will initialize the OMX Core. It is the 110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* responsibility of the application to call OMX_Init to ensure the proper 111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* set up of core resources. 112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 117fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/ 118fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_Init() 119fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 120fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 1212c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 1222c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(pthread_mutex_lock(&mutex) != 0) 1232c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles { 1242c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: Error in Mutex lock\n",__LINE__); 1252c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles return OMX_ErrorUndefined; 1262c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin count++; 1292c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGD("init count = %d\n", count); 130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 131fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (count == 1) 132fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 133fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = TIOMX_BuildComponentTable(); 134fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 1352c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 1362c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(pthread_mutex_unlock(&mutex) != 0) 1372c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles { 1382c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__); 1392c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles return OMX_ErrorUndefined; 1402c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\ 144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetHandle 145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will create the handle of the COMPONENTTYPE 147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* If the component is currently loaded, this method will reutrn the 148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* hadle of existingcomponent or create a new instance of the component. 149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* It will call the OMX_ComponentInit function and then the setcallback 150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* method to initialize the callback functions 151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters: 152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[out] pHandle Handle of the loaded components 153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] cComponentName Name of the component to load 154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pAppData Used to identify the callbacks of component 155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pCallBacks Application callbacks 156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorUndefined 158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInvalidComponentName 159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInvalidComponent 160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInsufficientResources 161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_NOERROR Successful 162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 164fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/ 166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_GetHandle( OMX_HANDLETYPE* pHandle, OMX_STRING cComponentName, 1682c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles OMX_PTR pAppData, OMX_CALLBACKTYPE* pCallBacks) 169fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin static const char prefix[] = "lib"; 171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin static const char postfix[] = ".so"; 172fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE (*pComponentInit)(OMX_HANDLETYPE*); 1732c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles OMX_ERRORTYPE err = OMX_ErrorNone; 174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_COMPONENTTYPE *componentType; 175b65f253fdc60f6208a54911bee793d225f23cdf8James Dong const char* pErr = dlerror(); 1762c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 1772c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(pthread_mutex_lock(&mutex) != 0) 178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 1792c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: Error in Mutex lock\n",__LINE__); 1802c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles return OMX_ErrorUndefined; 181fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 182fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 183fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if ((NULL == cComponentName) || (NULL == pHandle) || (NULL == pCallBacks)) { 184fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin err = OMX_ErrorBadParameter; 1852c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto UNLOCK_MUTEX; 186fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 187fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 188fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Verify that the name is not too long and could cause a crash. Notice 189fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * that the comparison is a greater than or equals. This is to make 190fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * sure that there is room for the terminating NULL at the end of the 191fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * name. */ 1922c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(strlen(cComponentName) >= MAXNAMESIZE) { 193fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin err = OMX_ErrorInvalidComponentName; 1942c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto UNLOCK_MUTEX; 195fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 196fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Locate the first empty slot for a component. If no slots 197fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * are available, error out */ 1982c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles int i = 0; 199fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for(i=0; i< COUNTOF(pModules); i++) { 200fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if(pModules[i] == NULL) break; 201fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 202fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if(i == COUNTOF(pModules)) { 2032c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = OMX_ErrorInsufficientResources; 2042c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto UNLOCK_MUTEX; 205fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 206fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 2072c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles int refIndex = 0; 208b65f253fdc60f6208a54911bee793d225f23cdf8James Dong for (refIndex=0; refIndex < MAX_TABLE_SIZE; refIndex++) { 2092c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles //get the index for the component in the table 2102c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (strcmp(componentTable[refIndex].name, cComponentName) == 0) { 2112c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGD("Found component %s with refCount %d\n", 2122c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles cComponentName, componentTable[refIndex].refCount); 2132c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 2142c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles /* check if the component is already loaded */ 2152c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (componentTable[refIndex].refCount >= MAX_CONCURRENT_INSTANCES) { 2162c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = OMX_ErrorInsufficientResources; 2172c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("Max instances of component %s already created.\n", cComponentName); 2182c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto UNLOCK_MUTEX; 2192c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } else { // we have not reached the limit yet 2202c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles /* do what was done before need to limit concurrent instances of each component */ 2212c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 2222c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles /* load the component and check for an error. If filename is not an 2232c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * absolute path (i.e., it does not begin with a "/"), then the 2242c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * file is searched for in the following locations: 2252c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * 2262c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * The LD_LIBRARY_PATH environment variable locations 2272c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * The library cache, /etc/ld.so.cache. 2282c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * /lib 2292c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * /usr/lib 2302c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * 2312c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * If there is an error, we can't go on, so set the error code and exit */ 2322c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 2332c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles /* the lengths are defined herein or have been 2342c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * checked already, so strcpy and strcat are 2352c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * are safe to use in this context. */ 2362c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles char buf[sizeof(prefix) + MAXNAMESIZE + sizeof(postfix)]; 2372c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles strcpy(buf, prefix); 2382c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles strcat(buf, cComponentName); 2392c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles strcat(buf, postfix); 2402c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 2412c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles pModules[i] = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); 2422c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if( pModules[i] == NULL ) { 2432c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("dlopen %s failed because %s\n", buf, dlerror()); 2442c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = OMX_ErrorComponentNotFound; 2452c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto UNLOCK_MUTEX; 2462c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 247a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 2482c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles /* Get a function pointer to the "OMX_ComponentInit" function. If 2492c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * there is an error, we can't go on, so set the error code and exit */ 2502c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles pComponentInit = dlsym(pModules[i], "OMX_ComponentInit"); 251b65f253fdc60f6208a54911bee793d225f23cdf8James Dong pErr = dlerror(); 252b65f253fdc60f6208a54911bee793d225f23cdf8James Dong if( (pErr != NULL) || (pComponentInit == NULL) ) { 2532c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d:: dlsym failed for module %p\n", __LINE__, pModules[i]); 2542c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = OMX_ErrorInvalidComponent; 2552c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto CLEAN_UP; 2562c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 257a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 2582c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles /* We now can access the dll. So, we need to call the "OMX_ComponentInit" 2592c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * method to load up the "handle" (which is just a list of functions to 2602c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles * call) and we should be all set.*/ 2612c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles *pHandle = malloc(sizeof(OMX_COMPONENTTYPE)); 2622c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(*pHandle == NULL) { 2632c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = OMX_ErrorInsufficientResources; 2642c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d:: malloc of pHandle* failed\n", __LINE__); 2652c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto CLEAN_UP; 2662c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 2672c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 2682c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles pComponents[i] = *pHandle; 2692c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles componentType = (OMX_COMPONENTTYPE*) *pHandle; 2702c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles componentType->nSize = sizeof(OMX_COMPONENTTYPE); 2712c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = (*pComponentInit)(*pHandle); 2722c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (OMX_ErrorNone == err) { 2732c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = (componentType->SetCallbacks)(*pHandle, pCallBacks, pAppData); 2742c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (err != OMX_ErrorNone) { 2752c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: SetCallBack failed %d\n",__LINE__, err); 2762c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto CLEAN_UP; 2772c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 2782c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles /* finally, OMX_ComponentInit() was successful and 2792c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles SetCallbacks was successful, we have a valid instance, 2802c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles so no we increment refCount */ 2812c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles componentTable[refIndex].pHandle[componentTable[refIndex].refCount] = *pHandle; 2822c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles componentTable[refIndex].refCount += 1; 2832c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto UNLOCK_MUTEX; // Component is found, and thus we are done 2842c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 285b65f253fdc60f6208a54911bee793d225f23cdf8James Dong else if (err == OMX_ErrorInsufficientResources) { 286b65f253fdc60f6208a54911bee793d225f23cdf8James Dong LOGE("%d :: Core: Insufficient Resources for Component %d\n",__LINE__, err); 287b65f253fdc60f6208a54911bee793d225f23cdf8James Dong goto CLEAN_UP; 288b65f253fdc60f6208a54911bee793d225f23cdf8James Dong } 2892c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 2902c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 291a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 2922c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 2932c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles // If we are here, we have not found the component 2942c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = OMX_ErrorComponentNotFound; 2952c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto UNLOCK_MUTEX; 2962c0b038ffdf873a942cee5ea78939535f81deaa2Daniel CharlesCLEAN_UP: 297b65f253fdc60f6208a54911bee793d225f23cdf8James Dong if(*pHandle != NULL) 298b65f253fdc60f6208a54911bee793d225f23cdf8James Dong /* cover the case where we error out before malloc'd */ 299b65f253fdc60f6208a54911bee793d225f23cdf8James Dong { 300b65f253fdc60f6208a54911bee793d225f23cdf8James Dong free(*pHandle); 301b65f253fdc60f6208a54911bee793d225f23cdf8James Dong *pHandle = NULL; 302b65f253fdc60f6208a54911bee793d225f23cdf8James Dong } 3032c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles pComponents[i] = NULL; 3042c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles dlclose(pModules[i]); 3052c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles pModules[i] = NULL; 3062c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 3072c0b038ffdf873a942cee5ea78939535f81deaa2Daniel CharlesUNLOCK_MUTEX: 3082c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(pthread_mutex_unlock(&mutex) != 0) 3098f41d183c7150ced3aef44b5f9a3ae3b7b57ec1cJames Dong { 3102c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__); 3112c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles err = OMX_ErrorUndefined; 3122c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 313fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return (err); 314fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 3152c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 316fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 317fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\ 318fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_FreeHandle() 319fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 320fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will unload the OMX component pointed by 321fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_HANDLETYPE. It is the responsibility of the calling method to ensure that 322fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* the Deinit method of the component has been called prior to unloading component 323fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 324fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters: 325fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hComponent the component to unload 326fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 327fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 328fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 329fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 330fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 331fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/ 332fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_FreeHandle (OMX_HANDLETYPE hComponent) 333fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 334fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 335fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE retVal = OMX_ErrorUndefined; 336fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)hComponent; 337fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 3382c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(pthread_mutex_lock(&mutex) != 0) 339fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 3402c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: Error in Mutex lock\n",__LINE__); 3412c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles return OMX_ErrorUndefined; 342fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 343fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 344fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Locate the component handle in the array of handles */ 3452c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles int i = 0; 346fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for(i=0; i< COUNTOF(pModules); i++) { 347fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if(pComponents[i] == hComponent) break; 348fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 3492c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 350fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if(i == COUNTOF(pModules)) { 3512c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: component %p is not found\n", __LINE__, hComponent); 352fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin retVal = OMX_ErrorBadParameter; 353fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin goto EXIT; 354fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 355fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 356fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin retVal = pHandle->ComponentDeInit(hComponent); 357fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (retVal != OMX_ErrorNone) { 3582c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: ComponentDeInit failed %d\n",__LINE__, retVal); 3592c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto EXIT; 360a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 361a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 3622c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles int refIndex = 0, handleIndex = 0; 363b65f253fdc60f6208a54911bee793d225f23cdf8James Dong for (refIndex=0; refIndex < MAX_TABLE_SIZE; refIndex++) { 3642c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles for (handleIndex=0; handleIndex < componentTable[refIndex].refCount; handleIndex++){ 3652c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles /* get the position for the component in the table */ 3662c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (componentTable[refIndex].pHandle[handleIndex] == hComponent){ 3672c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGD("Found matching pHandle(%p) at index %d with refCount %d", 3682c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles hComponent, refIndex, componentTable[refIndex].refCount); 3692c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (componentTable[refIndex].refCount) { 3702c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles componentTable[refIndex].refCount -= 1; 3712c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 3722c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles componentTable[refIndex].pHandle[handleIndex] = NULL; 3732c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles dlclose(pModules[i]); 3742c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles pModules[i] = NULL; 3752c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles free(pComponents[i]); 3762c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles pComponents[i] = NULL; 3772c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles retVal = OMX_ErrorNone; 3782c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles goto EXIT; 3792c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 3802c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 3812c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 3822c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 3832c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles // If we are here, we have not found the matching component 3842c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles retVal = OMX_ErrorComponentNotFound; 385fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 386fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinEXIT: 387fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* The unload is now complete, so set the error code to pass and exit */ 3882c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(pthread_mutex_unlock(&mutex) != 0) 389fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 3902c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__); 3912c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles return OMX_ErrorUndefined; 3922c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 393fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 394fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return retVal; 395fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 396fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 397fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\ 398fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_DeInit() 399fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 400fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will release the resources of the OMX Core. It is the 401fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* responsibility of the application to call OMX_DeInit to ensure the clean up of these 402fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* resources. 403fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 404fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 405fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 406fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 407fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 408fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/ 409fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_Deinit() 410fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 4112c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(pthread_mutex_lock(&mutex) != 0) { 4122c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: Error in Mutex lock\n",__LINE__); 4132c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles return OMX_ErrorUndefined; 4142c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 415a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 4162c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (count) { 4172c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles count--; 4182c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 4192c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 4202c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGD("deinit count = %d\n", count); 4212c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 4222c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if(pthread_mutex_unlock(&mutex) != 0) { 4232c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__); 4242c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles return OMX_ErrorUndefined; 425fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 426fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 427fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return OMX_ErrorNone; 428fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 429fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 430fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/************************************************************************* 431fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_SetupTunnel() 432fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 433fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: Setup the specified tunnel the two components 434fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 435fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters: 436fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hOutput Handle of the component to be accessed 437fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nPortOutput Source port used in the tunnel 438fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hInput Component to setup the tunnel with. 439fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nPortInput Destination port used in the tunnel 440fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 441fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 442fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 443fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 444fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 445fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/ 446fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* OMX_SetupTunnel */ 447fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE OMX_APIENTRY TIOMX_SetupTunnel( 448fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_HANDLETYPE hOutput, 449fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nPortOutput, 450fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_HANDLETYPE hInput, 451fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nPortInput) 452fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 453fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNotImplemented; 454fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_COMPONENTTYPE *pCompIn, *pCompOut; 455fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_TUNNELSETUPTYPE oTunnelSetup; 456fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 457fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (hOutput == NULL && hInput == NULL) 458fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return OMX_ErrorBadParameter; 459fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 460fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin oTunnelSetup.nTunnelFlags = 0; 461fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin oTunnelSetup.eSupplier = OMX_BufferSupplyUnspecified; 462fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 463fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin pCompOut = (OMX_COMPONENTTYPE*)hOutput; 464fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 465fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (hOutput) 466fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 467fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, hInput, nPortInput, &oTunnelSetup); 468fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 469fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 470fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 471fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (eError == OMX_ErrorNone && hInput) 472fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 473fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin pCompIn = (OMX_COMPONENTTYPE*)hInput; 474fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = pCompIn->ComponentTunnelRequest(hInput, nPortInput, hOutput, nPortOutput, &oTunnelSetup); 475fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (eError != OMX_ErrorNone && hOutput) 476fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 477fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* cancel tunnel request on output port since input port failed */ 478fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, NULL, 0, NULL); 479fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 480fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 481fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 482fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 483fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 484fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 485fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/************************************************************************* 486fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_ComponentNameEnum() 487fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 488fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will provide the name of the component at the given nIndex 489fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 490fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters: 491fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[out] cComponentName The name of the component at nIndex 492fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nNameLength The length of the component name 493fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nIndex The index number of the component 494fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 495fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 496fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 497fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 498fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 499fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/ 500fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE OMX_APIENTRY TIOMX_ComponentNameEnum( 501fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_STRING cComponentName, 502fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nNameLength, 503fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nIndex) 504fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 505fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 506fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 507fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (nIndex >= tableCount) 508fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 509fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = OMX_ErrorNoMore; 510fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 511fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 512fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 513fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin strcpy(cComponentName, componentTable[nIndex].name); 514fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 515fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 516fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 517fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 518fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 519fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 520fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/************************************************************************* 521fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetRolesOfComponent() 522fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 523fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will query the component for its supported roles 524fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 525fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters: 526fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] cComponentName The name of the component to query 527fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pNumRoles The number of roles supported by the component 528fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] roles The roles of the component 529fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 530fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 531fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_ErrorBadParameter Faliure due to a bad input parameter 532fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 533fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 534fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 535fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/ 536fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE TIOMX_GetRolesOfComponent ( 537fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_STRING cComponentName, 538fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_INOUT OMX_U32 *pNumRoles, 539fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_U8 **roles) 540fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 541fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 542fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 543fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 i = 0; 544fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 j = 0; 545fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_BOOL bFound = OMX_FALSE; 546fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 5472c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (cComponentName == NULL || pNumRoles == NULL) 548fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 549a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (cComponentName == NULL) 550a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 551a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("cComponentName is NULL\n"); 552a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 553a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (pNumRoles == NULL) 554a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 555a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("pNumRoles is NULL\n"); 556a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 557fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = OMX_ErrorBadParameter; 558b65f253fdc60f6208a54911bee793d225f23cdf8James Dong goto EXIT; 559fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 560a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly while (i < tableCount) 561b65f253fdc60f6208a54911bee793d225f23cdf8James Dong { 562b65f253fdc60f6208a54911bee793d225f23cdf8James Dong if (strcmp(cComponentName, componentTable[i].name) == 0) 563b65f253fdc60f6208a54911bee793d225f23cdf8James Dong { 564b65f253fdc60f6208a54911bee793d225f23cdf8James Dong bFound = OMX_TRUE; 565b65f253fdc60f6208a54911bee793d225f23cdf8James Dong break; 566fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 567b65f253fdc60f6208a54911bee793d225f23cdf8James Dong i++; 568a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 569a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (!bFound) 570a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 571a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly eError = OMX_ErrorComponentNotFound; 572a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("component %s not found\n", cComponentName); 573a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly goto EXIT; 574b65f253fdc60f6208a54911bee793d225f23cdf8James Dong } 575fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (roles == NULL) 576b65f253fdc60f6208a54911bee793d225f23cdf8James Dong { 577fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *pNumRoles = componentTable[i].nRoles; 578fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 579fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 580fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 581a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly /* must be second of two calls, 582a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly pNumRoles is input in this context. 583a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly If pNumRoles is < actual number of roles 584a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly than we return an error */ 585a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (*pNumRoles >= componentTable[i].nRoles) 586a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 587b65f253fdc60f6208a54911bee793d225f23cdf8James Dong for (j = 0; j<componentTable[i].nRoles; j++) 588a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 589a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly strcpy((OMX_STRING)roles[j], componentTable[i].pRoleArray[j]); 590a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 591a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly *pNumRoles = componentTable[i].nRoles; 592a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 593a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly else 594a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 595a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly eError = OMX_ErrorBadParameter; 596a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("pNumRoles (%d) is less than actual number (%d) of roles \ 597a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly for this component %s\n", *pNumRoles, componentTable[i].nRoles, cComponentName); 598a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 599a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 600a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly EXIT: 601a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly return eError; 602fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 603fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 604fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/************************************************************************* 605fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetComponentsOfRole() 606fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 607fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will query the component for its supported roles 608fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 609fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters: 610fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] role The role name to query for 611fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pNumComps The number of components supporting the given role 612fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] compNames The names of the components supporting the given role 613fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 614fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 615fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 616fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 617fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 618fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/ 619b65f253fdc60f6208a54911bee793d225f23cdf8James DongOMX_API OMX_ERRORTYPE TIOMX_GetComponentsOfRole ( 620fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_STRING role, 621fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_INOUT OMX_U32 *pNumComps, 622fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_INOUT OMX_U8 **compNames) 623fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 624fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 625fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 i = 0; 626fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 j = 0; 627fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 k = 0; 628a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly OMX_U32 compOfRoleCount = 0; 629fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 6302c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (role == NULL || pNumComps == NULL) 631fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 632a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (role == NULL) 633a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 634a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("role is NULL"); 635a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 636a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (pNumComps == NULL) 637a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 638a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("pNumComps is NULL\n"); 639a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 640fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = OMX_ErrorBadParameter; 641fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin goto EXIT; 642fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 643fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 644fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* This implies that the componentTable is not filled */ 645a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (!tableCount) 646fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 647a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly eError = OMX_ErrorUndefined; 648a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("Component table is empty. Please reload OMX Core\n"); 649fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin goto EXIT; 650fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 651fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 652a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly /* no matter, we always want to know number of matching components 653b65f253fdc60f6208a54911bee793d225f23cdf8James Dong so this will always run */ 654fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for (i = 0; i < tableCount; i++) 655fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 656b65f253fdc60f6208a54911bee793d225f23cdf8James Dong for (j = 0; j < componentTable[i].nRoles; j++) 657b65f253fdc60f6208a54911bee793d225f23cdf8James Dong { 658fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (strcmp(componentTable[i].pRoleArray[j], role) == 0) 659fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 660fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* the first call to this function should only count the number 661b65f253fdc60f6208a54911bee793d225f23cdf8James Dong of roles 662a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly */ 663a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly compOfRoleCount++; 664a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 665a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 666a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 667a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (compOfRoleCount == 0) 668a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 669a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly eError = OMX_ErrorComponentNotFound; 670a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("Component supporting role %s was not found\n", role); 671a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 672a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (compNames == NULL) 673a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 674a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly /* must be the first of two calls */ 675a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly *pNumComps = compOfRoleCount; 676a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 677a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly else 678a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 679a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly /* must be the second of two calls */ 680a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (*pNumComps < compOfRoleCount) 681a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 682a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly /* pNumComps is input in this context, 683a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly it can not be less, this would indicate 684a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly the array is not large enough 685a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly */ 686a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly eError = OMX_ErrorBadParameter; 687a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("pNumComps (%d) is less than the actual number (%d) of components \ 688a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly supporting role %s\n", *pNumComps, compOfRoleCount, role); 689a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 690a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly else 691a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 692a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly k = 0; 693a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly for (i = 0; i < tableCount; i++) 694a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 695b65f253fdc60f6208a54911bee793d225f23cdf8James Dong for (j = 0; j < componentTable[i].nRoles; j++) 696b65f253fdc60f6208a54911bee793d225f23cdf8James Dong { 697a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (strcmp(componentTable[i].pRoleArray[j], role) == 0) 698a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 699a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly /* the second call compNames can be allocated 700a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly with the proper size for that number of roles. 701a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly */ 702a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly compNames[k] = (OMX_U8*)componentTable[i].name; 703a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly k++; 704a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly if (k == compOfRoleCount) 705a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly { 706a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly /* there are no more components of this role 707a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly so we can exit here */ 708a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly *pNumComps = k; 709a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly goto EXIT; 710b65f253fdc60f6208a54911bee793d225f23cdf8James Dong } 711a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly } 712fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 713fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 714b65f253fdc60f6208a54911bee793d225f23cdf8James Dong } 715fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 716fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 717fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin EXIT: 718fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 719fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 720fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 721fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 722fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_BuildComponentTable() 723fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 724fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 725fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_CALLBACKTYPE sCallbacks; 726fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin int j = 0; 727fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin int numFiles = 0; 7282c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles int i; 7292c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 7302c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles for (i = 0, numFiles = 0; i < MAXCOMP; i ++) { 7312c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles if (tComponentName[i][0] == NULL) { 7322c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles break; 7332c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles } 734b65f253fdc60f6208a54911bee793d225f23cdf8James Dong if (numFiles <= MAX_TABLE_SIZE){ 735b65f253fdc60f6208a54911bee793d225f23cdf8James Dong for (j = 0; j < numFiles; j ++) { 736b65f253fdc60f6208a54911bee793d225f23cdf8James Dong if (!strcmp(componentTable[j].name, tComponentName[i][0])) { 737b65f253fdc60f6208a54911bee793d225f23cdf8James Dong /* insert the role */ 738b65f253fdc60f6208a54911bee793d225f23cdf8James Dong if (tComponentName[i][1] != NULL) 739b65f253fdc60f6208a54911bee793d225f23cdf8James Dong { 740b65f253fdc60f6208a54911bee793d225f23cdf8James Dong componentTable[j].pRoleArray[componentTable[j].nRoles] = tComponentName[i][1]; 741b65f253fdc60f6208a54911bee793d225f23cdf8James Dong componentTable[j].pHandle[componentTable[j].nRoles] = NULL; //initilize the pHandle element 742b65f253fdc60f6208a54911bee793d225f23cdf8James Dong componentTable[j].nRoles ++; 743b65f253fdc60f6208a54911bee793d225f23cdf8James Dong } 744b65f253fdc60f6208a54911bee793d225f23cdf8James Dong break; 745fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 746fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 747b65f253fdc60f6208a54911bee793d225f23cdf8James Dong if (j == numFiles) { /* new component */ 748b65f253fdc60f6208a54911bee793d225f23cdf8James Dong if (tComponentName[i][1] != NULL){ 749b65f253fdc60f6208a54911bee793d225f23cdf8James Dong componentTable[numFiles].pRoleArray[0] = tComponentName[i][1]; 750b65f253fdc60f6208a54911bee793d225f23cdf8James Dong componentTable[numFiles].nRoles = 1; 751b65f253fdc60f6208a54911bee793d225f23cdf8James Dong } 752b65f253fdc60f6208a54911bee793d225f23cdf8James Dong strcpy(compName[numFiles], tComponentName[i][0]); 753b65f253fdc60f6208a54911bee793d225f23cdf8James Dong componentTable[numFiles].name = compName[numFiles]; 754b65f253fdc60f6208a54911bee793d225f23cdf8James Dong componentTable[numFiles].refCount = 0; //initialize reference counter. 755b65f253fdc60f6208a54911bee793d225f23cdf8James Dong numFiles ++; 756fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 757fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 758fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 7592c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles tableCount = numFiles; 760fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (eError != OMX_ErrorNone){ 761a569385e5eb6a8ea55f1025acafdbd3015e3a55aChristopher Kelly LOGE("Could not build Component Table\n"); 762fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 7632c0b038ffdf873a942cee5ea78939535f81deaa2Daniel Charles 764fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 765fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 766fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 767fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_BOOL TIOMXConfigParserRedirect( 768fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_PTR aInputParameters, 769fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_PTR aOutputParameters) 770fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 771fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 772fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_BOOL Status = OMX_FALSE; 77317e995d39771569792c528f3dea559c83f0fc238Andreas Huber#ifndef NO_OPENCORE 774fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin Status = TIOMXConfigParser(aInputParameters, aOutputParameters); 77517e995d39771569792c528f3dea559c83f0fc238Andreas Huber#endif 776fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return Status; 777fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 778