OMX_Core.c revision a5a79c7a1090c1c02aa71c847a17dced8e119ddb
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 16a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly#undef LOG_TAG 17a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly#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 23a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly/** determine capabilities of a component before acually using it */ 24fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#include "ti_omx_config_parser.h" 25fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 26fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** size for the array of allocated components. Sets the maximum 27fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * number of components that can be allocated at once */ 28fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAXCOMP (50) 29fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define MAXNAMESIZE (130) 30fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define EMPTY_STRING "\0" 31fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 32fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Determine the number of elements in an array */ 33fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin#define COUNTOF(x) (sizeof(x)/sizeof(x[0])) 34fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 35fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Array to hold the DLL pointers for each allocated component */ 36fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void* pModules[MAXCOMP] = {0}; 37fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 38fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/** Array to hold the component handles for each allocated component */ 39fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinstatic void* pComponents[COUNTOF(pModules)] = {0}; 40fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 41a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly/** count will be used as a reference counter for OMX_Init() 42a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly so all changes to count should be mutex protected */ 43fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint count = 0; 44a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kellystatic pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 45fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 46fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinint tableCount = 0; 47fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinComponentTable componentTable[MAX_TABLE_SIZE]; 48fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar * sRoleArray[60][20]; 49fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar compName[60][200]; 50fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 51fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavinchar *tComponentName[MAXCOMP][2] = { 52fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /*video and image components */ 53990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.JPEG.decode", "image_decoder.jpeg" }, 54990117074ba37226d82be2f2ebe3739e488f848cJames Dong {"OMX.TI.JPEG.encoder", "image_encoder.jpeg"}, 55990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.Video.Decoder", "video_decoder.h263"}, 56fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.Decoder", "video_decoder.avc"}, 57990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.Video.Decoder", "video_decoder.mpeg2"}, 58fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.Decoder", "video_decoder.mpeg4"}, 59990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.Video.Decoder", "video_decoder.wmv"}, 60fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.encoder", "video_encoder.mpeg4"}, 61fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.encoder", "video_encoder.h263"}, 62fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.Video.encoder", "video_encoder.avc"}, 63990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.VPP", "iv_renderer.yuv.overlay"}, 64990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.Camera", "camera.yuv"}, 65fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 66fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Speech components */ 67a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly/* {"OMX.TI.G729.encode", NULL}, 68fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G729.decode", NULL}, 69fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G722.encode", NULL}, 70fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G722.decode", NULL}, 71fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G711.encode", NULL}, 72fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G711.decode", NULL}, 73fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G723.encode", NULL}, 74fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G723.decode", NULL}, 75fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G726.encode", NULL}, 76fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.G726.decode", NULL}, 77fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.GSMFR.encode", NULL}, 78a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly {"OMX.TI.GSMFR.decode", NULL}, 79a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly*/ 80fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.AMR.encode", "audio_encoder.amrnb"}, 81990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.AMR.decode", "audio_decoder.amrnb"}, 82fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {"OMX.TI.WBAMR.encode", "audio_encoder.amrwb"}, 83990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.WBAMR.decode", "audio_decoder.amrwb"}, 84fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 85fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Audio components */ 86990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.MP3.decode", "audio_decoder.mp3"}, 87990117074ba37226d82be2f2ebe3739e488f848cJames Dong {"OMX.TI.AAC.encode", "audio_encoder.aac"}, 88990117074ba37226d82be2f2ebe3739e488f848cJames Dong //{"OMX.TI.AAC.decode", "audio_decoder.aac"}, 89a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly/* {"OMX.TI.PCM.encode", NULL}, 90a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly {"OMX.TI.PCM.decode", NULL}, 91990117074ba37226d82be2f2ebe3739e488f848cJames Dong {"OMX.TI.WMA.decode", "audio_decoder.wma"}, 92a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly {"OMX.TI.RAG.decode", "audio_decoder.ra"}, 93a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly {"OMX.TI.IMAADPCM.decode", NULL}, 94a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly {"OMX.TI.IMAADPCM.encode", NULL}, 95a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly*/ 96fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 97fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* terminate the table */ 98fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin {NULL, NULL}, 99fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin}; 100fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 101fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 102fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\ 103fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_Init() 104fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 105fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will initialize the OMX Core. It is the 106fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* responsibility of the application to call OMX_Init to ensure the proper 107fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* set up of core resources. 108fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 109fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 110fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 111fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 112fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 113fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/ 114fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_Init() 115fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 116fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 117a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 118a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(pthread_mutex_lock(&mutex) != 0) 119a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly { 120a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: Error in Mutex lock\n",__LINE__); 121a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly return OMX_ErrorUndefined; 122a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 123fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 124fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin count++; 125a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGD("init count = %d\n", count); 126fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 127fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (count == 1) 128fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 129fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = TIOMX_BuildComponentTable(); 130fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 131a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 132a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(pthread_mutex_unlock(&mutex) != 0) 133a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly { 134a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__); 135a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly return OMX_ErrorUndefined; 136a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 137fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 138fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 139fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\ 140fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetHandle 141fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 142fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will create the handle of the COMPONENTTYPE 143fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* If the component is currently loaded, this method will reutrn the 144fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* hadle of existingcomponent or create a new instance of the component. 145fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* It will call the OMX_ComponentInit function and then the setcallback 146fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* method to initialize the callback functions 147fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters: 148fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[out] pHandle Handle of the loaded components 149fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] cComponentName Name of the component to load 150fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pAppData Used to identify the callbacks of component 151fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pCallBacks Application callbacks 152fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 153fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorUndefined 154fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInvalidComponentName 155fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInvalidComponent 156fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_ErrorInsufficientResources 157fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @retval OMX_NOERROR Successful 158fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 159fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 160fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 161fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/ 162fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 163fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_GetHandle( OMX_HANDLETYPE* pHandle, OMX_STRING cComponentName, 164a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly OMX_PTR pAppData, OMX_CALLBACKTYPE* pCallBacks) 165fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 166fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin static const char prefix[] = "lib"; 167fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin static const char postfix[] = ".so"; 168fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE (*pComponentInit)(OMX_HANDLETYPE*); 169a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly OMX_ERRORTYPE err = OMX_ErrorNone; 170fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_COMPONENTTYPE *componentType; 171fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin const char* pErr = dlerror(); 172a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 173a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(pthread_mutex_lock(&mutex) != 0) 174fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 175a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: Error in Mutex lock\n",__LINE__); 176a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly return OMX_ErrorUndefined; 177fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 178fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 179fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if ((NULL == cComponentName) || (NULL == pHandle) || (NULL == pCallBacks)) { 180fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin err = OMX_ErrorBadParameter; 181a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto UNLOCK_MUTEX; 182fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 183fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 184fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Verify that the name is not too long and could cause a crash. Notice 185fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * that the comparison is a greater than or equals. This is to make 186fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * sure that there is room for the terminating NULL at the end of the 187fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * name. */ 188a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(strlen(cComponentName) >= MAXNAMESIZE) { 189fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin err = OMX_ErrorInvalidComponentName; 190a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto UNLOCK_MUTEX; 191fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 192fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Locate the first empty slot for a component. If no slots 193fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin * are available, error out */ 194a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly int i = 0; 195fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for(i=0; i< COUNTOF(pModules); i++) { 196fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if(pModules[i] == NULL) break; 197fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 198fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if(i == COUNTOF(pModules)) { 199a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = OMX_ErrorInsufficientResources; 200a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto UNLOCK_MUTEX; 201fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 202fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 203a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly int refIndex = 0; 204a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly *pHandle = NULL; 205a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly pComponents[i] = NULL; 206a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly for (refIndex=0; refIndex < MAX_TABLE_SIZE; refIndex++) { 207a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly //get the index for the component in the table 208a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (strcmp(componentTable[refIndex].name, cComponentName) == 0) { 209a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGD("Found component %s with refCount %d\n", 210a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly cComponentName, componentTable[refIndex].refCount); 211a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 212a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* check if the component is already loaded */ 213a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (componentTable[refIndex].refCount >= MAX_CONCURRENT_INSTANCES) { 214a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = OMX_ErrorInsufficientResources; 215a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("Max instances of component %s already created.\n", cComponentName); 216a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto UNLOCK_MUTEX; 217a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } else { // we have not reached the limit yet 218a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* do what was done before need to limit concurrent instances of each component */ 219a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 220a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* load the component and check for an error. If filename is not an 221a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * absolute path (i.e., it does not begin with a "/"), then the 222a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * file is searched for in the following locations: 223a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * 224a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * The LD_LIBRARY_PATH environment variable locations 225a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * The library cache, /etc/ld.so.cache. 226a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * /lib 227a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * /usr/lib 228a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * 229a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * If there is an error, we can't go on, so set the error code and exit */ 230a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 231a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* the lengths are defined herein or have been 232a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * checked already, so strcpy and strcat are 233a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * are safe to use in this context. */ 234a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly char buf[sizeof(prefix) + MAXNAMESIZE + sizeof(postfix)]; 235a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly strcpy(buf, prefix); 236a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly strcat(buf, cComponentName); 237a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly strcat(buf, postfix); 238a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 239a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly pModules[i] = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); 240a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if( pModules[i] == NULL ) { 241a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("dlopen %s failed because %s\n", buf, dlerror()); 242a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = OMX_ErrorComponentNotFound; 243a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto UNLOCK_MUTEX; 244a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 245fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 246a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* Get a function pointer to the "OMX_ComponentInit" function. If 247a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * there is an error, we can't go on, so set the error code and exit */ 248a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly pComponentInit = dlsym(pModules[i], "OMX_ComponentInit"); 249a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if( (pErr != NULL) || (pComponentInit == NULL) ) { 250a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d:: dlsym failed for module %p\n", __LINE__, pModules[i]); 251a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = OMX_ErrorInvalidComponent; 252a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto CLEAN_UP; 253a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 254fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 255a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* We now can access the dll. So, we need to call the "OMX_ComponentInit" 256a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * method to load up the "handle" (which is just a list of functions to 257a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly * call) and we should be all set.*/ 258a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly *pHandle = malloc(sizeof(OMX_COMPONENTTYPE)); 259a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(*pHandle == NULL) { 260a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = OMX_ErrorInsufficientResources; 261a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d:: malloc of pHandle* failed\n", __LINE__); 262a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto CLEAN_UP; 263a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 264fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 265a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly pComponents[i] = *pHandle; 266a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentType = (OMX_COMPONENTTYPE*) *pHandle; 267a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentType->nSize = sizeof(OMX_COMPONENTTYPE); 268a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = (*pComponentInit)(*pHandle); 269a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (OMX_ErrorNone == err) { 270a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = (componentType->SetCallbacks)(*pHandle, pCallBacks, pAppData); 271a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (err != OMX_ErrorNone) { 272a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: SetCallBack failed %d\n",__LINE__, err); 273a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto CLEAN_UP; 274a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 275a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* finally, OMX_ComponentInit() was successful and 276a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly SetCallbacks was successful, we have a valid instance, 277a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly so no we increment refCount */ 278a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[refIndex].pHandle[componentTable[refIndex].refCount] = *pHandle; 279a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[refIndex].refCount += 1; 280a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto UNLOCK_MUTEX; // Component is found, and thus we are done 281a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 282a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 283a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 284fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 285a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 286a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly // If we are here, we have not found the component 287a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = OMX_ErrorComponentNotFound; 288a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto UNLOCK_MUTEX; 289a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 290a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher KellyCLEAN_UP: 291a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly free(*pHandle); 292a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly *pHandle = NULL; 293a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly pComponents[i] = NULL; 294a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly dlclose(pModules[i]); 295a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly pModules[i] = NULL; 296a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 297a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher KellyUNLOCK_MUTEX: 298a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(pthread_mutex_unlock(&mutex) != 0) 299fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 300a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__); 301a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly err = OMX_ErrorUndefined; 302a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 303fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return (err); 304fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 305a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 306fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 307fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\ 308fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_FreeHandle() 309fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 310fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will unload the OMX component pointed by 311fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_HANDLETYPE. It is the responsibility of the calling method to ensure that 312fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* the Deinit method of the component has been called prior to unloading component 313fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 314fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters: 315fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hComponent the component to unload 316fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 317fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 318fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 319fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 320fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 321fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/ 322fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_FreeHandle (OMX_HANDLETYPE hComponent) 323fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 324fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 325fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE retVal = OMX_ErrorUndefined; 326fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *)hComponent; 327fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 328a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(pthread_mutex_lock(&mutex) != 0) 329fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 330a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: Error in Mutex lock\n",__LINE__); 331a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly return OMX_ErrorUndefined; 332fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 333fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 334fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* Locate the component handle in the array of handles */ 335a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly int i = 0; 336fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for(i=0; i< COUNTOF(pModules); i++) { 337fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if(pComponents[i] == hComponent) break; 338fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 339a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 340fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if(i == COUNTOF(pModules)) { 341a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: component %p is not found\n", __LINE__, hComponent); 342fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin retVal = OMX_ErrorBadParameter; 343fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin goto EXIT; 344fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 345fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 346fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin retVal = pHandle->ComponentDeInit(hComponent); 347fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (retVal != OMX_ErrorNone) { 348a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: ComponentDeInit failed %d\n",__LINE__, retVal); 349a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto EXIT; 350fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 351fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 352a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly int refIndex = 0, handleIndex = 0; 353a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly for (refIndex=0; refIndex < MAX_TABLE_SIZE; refIndex++) { 354a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly for (handleIndex=0; handleIndex < componentTable[refIndex].refCount; handleIndex++){ 355a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* get the position for the component in the table */ 356a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (componentTable[refIndex].pHandle[handleIndex] == hComponent){ 357a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGD("Found matching pHandle(%p) at index %d with refCount %d", 358a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly hComponent, refIndex, componentTable[refIndex].refCount); 359a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (componentTable[refIndex].refCount) { 360a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[refIndex].refCount -= 1; 361a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 362a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[refIndex].pHandle[handleIndex] = NULL; 363a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly dlclose(pModules[i]); 364a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly pModules[i] = NULL; 365a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly free(pComponents[i]); 366a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly pComponents[i] = NULL; 367a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly retVal = OMX_ErrorNone; 368a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly goto EXIT; 369a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 370a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 371a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 372a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 373a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly // If we are here, we have not found the matching component 374a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly retVal = OMX_ErrorComponentNotFound; 375fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 376fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinEXIT: 377fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* The unload is now complete, so set the error code to pass and exit */ 378a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(pthread_mutex_unlock(&mutex) != 0) 379fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 380a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__); 381a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly return OMX_ErrorUndefined; 382a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 383fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 384fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return retVal; 385fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 386fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 387fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/******************************Public*Routine******************************\ 388fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_DeInit() 389fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 390fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description:This method will release the resources of the OMX Core. It is the 391fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* responsibility of the application to call OMX_DeInit to ensure the clean up of these 392fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* resources. 393fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 394fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 395fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 396fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 397fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 398fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin\**************************************************************************/ 399fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_Deinit() 400fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 401a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(pthread_mutex_lock(&mutex) != 0) { 402a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: Error in Mutex lock\n",__LINE__); 403a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly return OMX_ErrorUndefined; 404a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 405fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 406a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (count) { 407a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly count--; 408a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 409a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 410a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGD("deinit count = %d\n", count); 411a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 412a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if(pthread_mutex_unlock(&mutex) != 0) { 413a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly LOGE("%d :: Core: Error in Mutex unlock\n",__LINE__); 414a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly return OMX_ErrorUndefined; 415fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 416fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 417fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return OMX_ErrorNone; 418fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 419fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 420fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/************************************************************************* 421fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_SetupTunnel() 422fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 423fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: Setup the specified tunnel the two components 424fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 425fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Parameters: 426fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hOutput Handle of the component to be accessed 427fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nPortOutput Source port used in the tunnel 428fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] hInput Component to setup the tunnel with. 429fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nPortInput Destination port used in the tunnel 430fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 431fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 432fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 433fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 434fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 435fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/ 436fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/* OMX_SetupTunnel */ 437fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE OMX_APIENTRY TIOMX_SetupTunnel( 438fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_HANDLETYPE hOutput, 439fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nPortOutput, 440fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_HANDLETYPE hInput, 441fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nPortInput) 442fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 443fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNotImplemented; 444fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_COMPONENTTYPE *pCompIn, *pCompOut; 445fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_TUNNELSETUPTYPE oTunnelSetup; 446fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 447fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (hOutput == NULL && hInput == NULL) 448fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return OMX_ErrorBadParameter; 449fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 450fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin oTunnelSetup.nTunnelFlags = 0; 451fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin oTunnelSetup.eSupplier = OMX_BufferSupplyUnspecified; 452fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 453fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin pCompOut = (OMX_COMPONENTTYPE*)hOutput; 454fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 455fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (hOutput) 456fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 457fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, hInput, nPortInput, &oTunnelSetup); 458fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 459fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 460fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 461fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (eError == OMX_ErrorNone && hInput) 462fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 463fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin pCompIn = (OMX_COMPONENTTYPE*)hInput; 464fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = pCompIn->ComponentTunnelRequest(hInput, nPortInput, hOutput, nPortOutput, &oTunnelSetup); 465fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (eError != OMX_ErrorNone && hOutput) 466fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 467fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* cancel tunnel request on output port since input port failed */ 468fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, NULL, 0, NULL); 469fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 470fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 471fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 472fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 473fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 474fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 475fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/************************************************************************* 476fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_ComponentNameEnum() 477fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 478fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will provide the name of the component at the given nIndex 479fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 480fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters: 481fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[out] cComponentName The name of the component at nIndex 482fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nNameLength The length of the component name 483fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] nIndex The index number of the component 484fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 485fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 486fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 487fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 488fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 489fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/ 490fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE OMX_APIENTRY TIOMX_ComponentNameEnum( 491fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_STRING cComponentName, 492fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nNameLength, 493fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nIndex) 494fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 495fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 496fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 497fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (nIndex >= tableCount) 498fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 499fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = OMX_ErrorNoMore; 500fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 501fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 502fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 503fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin strcpy(cComponentName, componentTable[nIndex].name); 504fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 505fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 506fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 507fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 508fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 509fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 510fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/************************************************************************* 511fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetRolesOfComponent() 512fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 513fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will query the component for its supported roles 514fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 515fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters: 516fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] cComponentName The name of the component to query 517fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pNumRoles The number of roles supported by the component 518fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] roles The roles of the component 519fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 520fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 521fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_ErrorBadParameter Faliure due to a bad input parameter 522fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 523fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 524fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 525fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/ 526fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE TIOMX_GetRolesOfComponent ( 527fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_STRING cComponentName, 528fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_INOUT OMX_U32 *pNumRoles, 529fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_U8 **roles) 530fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 531fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 532fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 533fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 i = 0; 534fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 j = 0; 535fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_BOOL bFound = OMX_FALSE; 536fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 537a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (cComponentName == NULL || pNumRoles == NULL) 538fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 539fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = OMX_ErrorBadParameter; 540fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin goto EXIT; 541fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 542fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 543fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 544fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin while(!bFound && i < tableCount) 545fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 546fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (strcmp(cComponentName, componentTable[i].name) == 0) 547fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 548fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin bFound = OMX_TRUE; 549fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 550fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 551fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 552fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin i++; 553fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 554fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 555fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (roles == NULL) 556fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 557fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *pNumRoles = componentTable[i].nRoles; 558fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin goto EXIT; 559fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 560fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin else 561fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 562fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (bFound && (*pNumRoles == componentTable[i].nRoles)) 563fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 564fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for (j = 0; j<componentTable[i].nRoles; j++) 565fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 566fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin strcpy((OMX_STRING)roles[j], componentTable[i].pRoleArray[j]); 567fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 568fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 569fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 570fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin EXIT: 571fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 572fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 573fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 574fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin/************************************************************************* 575fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* OMX_GetComponentsOfRole() 576fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 577fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Description: This method will query the component for its supported roles 578fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 579fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin*Parameters: 580fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] role The role name to query for 581fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] pNumComps The number of components supporting the given role 582fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* @param[in] compNames The names of the components supporting the given role 583fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 584fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Returns: OMX_NOERROR Successful 585fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 586fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* Note 587fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin* 588fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin**************************************************************************/ 589fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_API OMX_ERRORTYPE TIOMX_GetComponentsOfRole ( 590fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_STRING role, 591fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_INOUT OMX_U32 *pNumComps, 592fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_INOUT OMX_U8 **compNames) 593fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 594fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 595fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 i = 0; 596fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 j = 0; 597fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_U32 k = 0; 598fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 599a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (role == NULL || pNumComps == NULL) 600fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 601fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = OMX_ErrorBadParameter; 602fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin goto EXIT; 603fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 604fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 605fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* This implies that the componentTable is not filled */ 606fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (componentTable[i].pRoleArray[j] == NULL) 607fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 608fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin eError = OMX_ErrorBadParameter; 609fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin goto EXIT; 610fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 611fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 612fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 613fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for (i = 0; i < tableCount; i++) 614fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 615fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin for (j = 0; j<componentTable[i].nRoles; j++) 616fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 617fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (strcmp(componentTable[i].pRoleArray[j], role) == 0) 618fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 619fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* the first call to this function should only count the number 620fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin of roles so that for the second call compNames can be allocated 621fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin with the proper size for that number of roles */ 622fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (compNames != NULL) 623fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 624fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin compNames[k] = (OMX_U8*)componentTable[i].name; 625fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 626fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin k++; 627fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 628fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 629fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin *pNumComps = k; 630fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 631fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 632fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin EXIT: 633fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 634fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 635fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 636fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 637fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE TIOMX_BuildComponentTable() 638fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 639fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_ERRORTYPE eError = OMX_ErrorNone; 640fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_CALLBACKTYPE sCallbacks; 641fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin int j = 0; 642fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin int numFiles = 0; 643a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly int i; 644a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 645fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin /* set up dummy call backs */ 646fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sCallbacks.EventHandler = ComponentTable_EventHandler; 647fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sCallbacks.EmptyBufferDone = ComponentTable_EmptyBufferDone; 648fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin sCallbacks.FillBufferDone = ComponentTable_FillBufferDone; 649fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 650a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly for (i = 0, numFiles = 0; i < MAXCOMP; i ++) { 651a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (tComponentName[i][0] == NULL) { 652a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly break; 653a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 654a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly for (j = 0; j < numFiles; j ++) { 655a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (!strcmp(componentTable[j].name, tComponentName[i][0])) { 656a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly /* insert the role */ 657a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (tComponentName[i][1] != NULL) 658fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin { 659a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[j].pRoleArray[componentTable[j].nRoles] = tComponentName[i][1]; 660a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[j].pHandle[componentTable[j].nRoles] = NULL; //initilize the pHandle element 661a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[j].nRoles ++; 662fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 663a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly break; 664fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 665a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly } 666a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (j == numFiles) { /* new component */ 667a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly if (tComponentName[i][1] != NULL){ 668a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[numFiles].pRoleArray[0] = tComponentName[i][1]; 669a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[numFiles].nRoles = 1; 670fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 671a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly strcpy(compName[numFiles], tComponentName[i][0]); 672a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[numFiles].name = compName[numFiles]; 673a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly componentTable[numFiles].refCount = 0; //initialize reference counter. 674a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly numFiles ++; 675fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 676fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 677a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly tableCount = numFiles; 678fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin if (eError != OMX_ErrorNone){ 679fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin printf("Error: Could not build Component Table\n"); 680fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin } 681a5a79c7a1090c1c02aa71c847a17dced8e119ddbChristopher Kelly 682fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return eError; 683fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 684fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 685fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE ComponentTable_EventHandler( 686fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_HANDLETYPE hComponent, 687fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_PTR pAppData, 688fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_EVENTTYPE eEvent, 689fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nData1, 690fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_U32 nData2, 691fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_IN OMX_PTR pEventData) 692fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 693fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return OMX_ErrorNotImplemented; 694fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 695fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 696fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE ComponentTable_EmptyBufferDone( 697fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_HANDLETYPE hComponent, 698fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_PTR pAppData, 699fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer) 700fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 701fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return OMX_ErrorNotImplemented; 702fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 703fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 704fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_ERRORTYPE ComponentTable_FillBufferDone( 705fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_HANDLETYPE hComponent, 706fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_PTR pAppData, 707fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer) 708fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 709fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return OMX_ErrorNotImplemented; 710fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 711fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 712fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz ZavinOMX_BOOL TIOMXConfigParserRedirect( 713fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_PTR aInputParameters, 714fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_PTR aOutputParameters) 715fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin 716fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin{ 717fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin OMX_BOOL Status = OMX_FALSE; 718b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 719fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin Status = TIOMXConfigParser(aInputParameters, aOutputParameters); 720b44cdb1b44b144d09e8ec950d1e8e4c280064056Rebecca Schultz Zavin 721fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin return Status; 722fb3766f18a2c18b6f4798a6a631fdb88fcacd1dcRebecca Schultz Zavin} 723