1c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* 2c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Copyright (c) 2010, Texas Instruments Incorporated 3c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * All rights reserved. 4c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 5c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Redistribution and use in source and binary forms, with or without 6c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * modification, are permitted provided that the following conditions 7c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * are met: 8c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 9c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * * Redistributions of source code must retain the above copyright 10c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * notice, this list of conditions and the following disclaimer. 11c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 12c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * * Redistributions in binary form must reproduce the above copyright 13c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * notice, this list of conditions and the following disclaimer in the 14c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * documentation and/or other materials provided with the distribution. 15c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 16c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * * Neither the name of Texas Instruments Incorporated nor the names of 17c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * its contributors may be used to endorse or promote products derived 18c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * from this software without specific prior written permission. 19c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 20c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 27c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 28c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 29c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 30c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 32c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 33c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <dlfcn.h> /* For dynamic loading */ 34c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdio.h> 35c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <string.h> 36c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <stdlib.h> 37c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include <pthread.h> 38c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 39c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 40c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* #include "OMX_RegLib.h" */ 41c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMX_Component.h" 42c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMX_Core.h" 43c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "OMX_ComponentRegistry.h" 44c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 45c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "timm_osal_types.h" 46c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "timm_osal_error.h" 47c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "timm_osal_trace.h" 48c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#include "timm_osal_mutex.h" 49c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 502a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#ifdef CHECK_SECURE_STATE 512a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#include <sys/ioctl.h> 522a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#include <errno.h> 532a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#include <fcntl.h> 542a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#endif 552a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal 56c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** size for the array of allocated components. Sets the maximum 57c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * number of components that can be allocated at once */ 58c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MAXCOMP (50) 59c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define MAXNAMESIZE (128) 60c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define EMPTY_STRING "\0" 61c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 62c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Determine the number of elements in an array */ 63c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define COUNTOF(x) (sizeof(x)/sizeof(x[0])) 64c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 65c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Array to hold the DLL pointers for each allocated component */ 66c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void *pModules[MAXCOMP] = { 0 }; 67c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 68c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** Array to hold the component handles for each allocated component */ 69c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevstatic void *pComponents[COUNTOF(pModules)] = { 0 }; 70c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 71c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* count for call OMX_Init() */ 72c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint count = 0; 73c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevpthread_mutex_t mutex; 74c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevTIMM_OSAL_PTR pCoreInitMutex = NULL; 75c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 76c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevint tableCount = 0; 77c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevComponentTable componentTable[MAX_TABLE_SIZE]; 78c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar *sRoleArray[60][20]; 79c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar compName[60][200]; 80c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 81c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 82c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevchar *tComponentName[MAXCOMP][MAX_ROLES] = { 83c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*video and image components */ 84c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.VIDEO.DECODER", "video_decoder.mpeg4", 85c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "video_decoder.avc", 86c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "video_decoder.h263", 87c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "video_decoder.wmv", 88c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "video_decoder.vp6", 89c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "video_decoder.vp7", NULL}, 9049f42f954f02c39aa4d25520a4caa3f0b459aa40Sarthak Aggarwal {"OMX.TI.DUCATI1.VIDEO.DECODER.secure", "video_decoder.mpeg4", 9149f42f954f02c39aa4d25520a4caa3f0b459aa40Sarthak Aggarwal "video_decoder.avc", 9249f42f954f02c39aa4d25520a4caa3f0b459aa40Sarthak Aggarwal "video_decoder.h263", NULL}, 93c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.VIDEO.H264D", "video_decoder.avc", NULL}, 94c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.VIDEO.H264E", "video_encoder.avc", NULL}, 95c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.VIDEO.MPEG4D", "video_decoder.mpeg4", NULL}, 96c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.VIDEO.MPEG4E", "video_encoder.mpeg4", 97c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "video_encoder.h263",NULL}, 98c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.VIDEO.VP6D", "video_decoder.vp6", NULL}, 99c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.VIDEO.VP7D", "video_decoder.vp7", NULL}, 100c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.IMAGE.JPEGD", "jpeg_decoder.jpeg", NULL}, 101c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {"OMX.TI.DUCATI1.VIDEO.CAMERA", "camera.omx", NULL}, 102c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* terminate the table */ 103c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev {NULL, NULL}, 104c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev}; 105c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 106c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//AD 107c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevextern OMX_ERRORTYPE OMX_ComponentInit(OMX_HANDLETYPE hComponent); 108c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 109c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CORE_assert CORE_paramCheck 110c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CORE_require CORE_paramCheck 111c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CORE_ensure CORE_paramCheck 112c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 113c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#define CORE_paramCheck(C, V, S) do {\ 114c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!(C)) { eError = V;\ 115c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("failed check: " #C);\ 116c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error(" - returning error: " #V);\ 117c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if(S) TIMM_OSAL_Error(" - %s", S);\ 118c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; }\ 119c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } while(0) 120c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 121c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************Public*Routine******************************\ 122c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_Init() 123c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 124c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description:This method will initialize the OMX Core. It is the 125c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* responsibility of the application to call OMX_Init to ensure the proper 126c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* set up of core resources. 127c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 128c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns: OMX_NOERROR Successful 129c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 130c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note 131c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 132c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev\**************************************************************************/ 133c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_Init() 134c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 135c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 136c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_ERRORTYPE eOsalError = TIMM_OSAL_ERR_NONE; 137c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 138c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eOsalError = TIMM_OSAL_MutexObtain(pCoreInitMutex, TIMM_OSAL_SUSPEND); 139c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(eOsalError == TIMM_OSAL_ERR_NONE, 140c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ErrorInsufficientResources, "Mutex lock failed"); 141c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 142c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev count++; 143c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 144c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (count == 1) 145c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 146c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pthread_mutex_init(&mutex, NULL); 147c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_BuildComponentTable(); 148c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 149c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 150c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eOsalError = TIMM_OSAL_MutexRelease(pCoreInitMutex); 151c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(eOsalError == TIMM_OSAL_ERR_NONE, 152c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ErrorInsufficientResources, "Mutex release failed"); 153c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 154c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 155c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 156c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 157c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************Public*Routine******************************\ 158c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_GetHandle 159c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 160c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: This method will create the handle of the COMPONENTTYPE 161c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* If the component is currently loaded, this method will reutrn the 162c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* hadle of existingcomponent or create a new instance of the component. 163c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* It will call the OMX_ComponentInit function and then the setcallback 164c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* method to initialize the callback functions 165c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Parameters: 166c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[out] pHandle Handle of the loaded components 167c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] cComponentName Name of the component to load 168c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] pAppData Used to identify the callbacks of component 169c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] pCallBacks Application callbacks 170c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 171c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_ErrorUndefined 172c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_ErrorInvalidComponentName 173c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_ErrorInvalidComponent 174c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_ErrorInsufficientResources 175c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @retval OMX_NOERROR Successful 176c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 177c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note 178c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 179c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev\**************************************************************************/ 180c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 181c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_GetHandle(OMX_HANDLETYPE * pHandle, 182c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_STRING cComponentName, OMX_PTR pAppData, 183c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CALLBACKTYPE * pCallBacks) 184c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 185c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const char prefix[] = "lib"; 186c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static const char postfix[] = ".so"; 187c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE(*pComponentInit) (OMX_HANDLETYPE *); 188c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 189c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_COMPONENTTYPE *componentType; 190c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int i; 191c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char buf[sizeof(prefix) + MAXNAMESIZE + sizeof(postfix)]; 192c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev const char *pErr = dlerror(); 193c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev char *dlError = NULL; 1942a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#ifdef CHECK_SECURE_STATE 1952a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal int secure_misc_drv_fd,ret; 1962a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal OMX_U8 mode, enable=1; 1972a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#endif 198c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pthread_mutex_lock(&mutex) != 0) 199c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 200c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Core: Error in Mutex lock"); 201c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 202c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 203c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(NULL != cComponentName, OMX_ErrorBadParameter, NULL); 204c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(NULL != pHandle, OMX_ErrorBadParameter, NULL); 205c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(NULL != pCallBacks, OMX_ErrorBadParameter, NULL); 206c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(count > 0, OMX_ErrorUndefined, 207c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "OMX_GetHandle called without calling OMX_Init first"); 208c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 209c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* Verify that the name is not too long and could cause a crash. Notice 210c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * that the comparison is a greater than or equals. This is to make 211c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * sure that there is room for the terminating NULL at the end of the 212c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * name. */ 213c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(strlen(cComponentName) < MAXNAMESIZE, 214c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ErrorInvalidComponentName, NULL); 215c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 216c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* Locate the first empty slot for a component. If no slots 217c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * are available, error out */ 218c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (i = 0; i < COUNTOF(pModules); i++) 219c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 220c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pModules[i] == NULL) 221c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 222c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 223c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(i != COUNTOF(pModules), OMX_ErrorInsufficientResources, 224c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL); 225c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 226c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* load the component and check for an error. If filename is not an 227c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * absolute path (i.e., it does not begin with a "/"), then the 228c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * file is searched for in the following locations: 229c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 230c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * The LD_LIBRARY_PATH environment variable locations 231c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * The library cache, /etc/ld.so.cache. 232c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * /lib 233c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * /usr/lib 234c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 235c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * If there is an error, we can't go on, so set the error code and exit */ 236c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcpy(buf, prefix); /* the lengths are defined herein or have been */ 237c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcat(buf, cComponentName); /* checked already, so strcpy and strcat are */ 238c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcat(buf, postfix); /* are safe to use in this context. */ 2393cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal 2402a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#ifdef CHECK_SECURE_STATE 2412a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal //Dont return errors from misc driver to the user if any. 2422a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal //Since this affects all usecases, secure and non-secure. 2432a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal //Do log the errors though. 2442a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal secure_misc_drv_fd = open("/dev/rproc_user", O_SYNC | O_RDONLY); 2452a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal if (secure_misc_drv_fd < 0) 2462a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal { 2472a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal TIMM_OSAL_Error("Can't open misc driver device 0x%x\n", errno); 2482a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal } 2492a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal 2502a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal ret = read(secure_misc_drv_fd, &mode, sizeof(mode)); 2512a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal if (ret < 0) 2523cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal { 2532a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal TIMM_OSAL_Error("Can't read from the misc driver"); 2543cf002e003ada481d0aae4ba77bb05f95be216c7Sarthak Aggarwal } 2552a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal if(mode == enable && strstr(cComponentName,"secure") == NULL) 2562a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal { 2572a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal TIMM_OSAL_Error("non-secure component not supported in secure mode"); 2582a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal eError = OMX_ErrorComponentNotFound; 2592a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal } 2602a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal ret = close(secure_misc_drv_fd); 2612a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal if (ret < 0) 2622a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal { 2632a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal TIMM_OSAL_Error("Can't close the misc driver"); 2642a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal } 2652a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal //Dont allow non-secure usecases if we are in secure state. 2662a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal //Else some of the memory regions will be unexpected firewalled. 2672a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal //This provides a clean exit in case we are in secure mode. 2682a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal if(eError == OMX_ErrorComponentNotFound) 2692a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal { 2702a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal goto EXIT; 2712a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal } 2722a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal#endif 2732a0736ac288d2057129b5b8961cc5536066493c6Sarthak Aggarwal 274c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//#if 0 275c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pModules[i] = dlopen(buf, RTLD_LAZY | RTLD_GLOBAL); 276c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pModules[i] == NULL) 277c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 278c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev dlError = dlerror(); 279c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Failed because %s", dlError); 280c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_ErrorComponentNotFound; 281c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 282c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 283c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 284c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* Get a function pointer to the "OMX_ComponentInit" function. If 285c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * there is an error, we can't go on, so set the error code and exit */ 286c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pComponentInit = dlsym(pModules[i], "OMX_ComponentInit"); 287c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pErr = dlerror(); 288c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(((pErr == NULL) && (pComponentInit != NULL)), 289c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ErrorInvalidComponent, NULL); 290c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//#endif 291c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 292c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* We now can access the dll. So, we need to call the "OMX_ComponentInit" 293c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * method to load up the "handle" (which is just a list of functions to 294c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * call) and we should be all set.*/ 295c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *pHandle = malloc(sizeof(OMX_COMPONENTTYPE)); 296c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert((*pHandle != NULL), OMX_ErrorInsufficientResources, 297c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Malloc of pHandle* failed"); 298c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 299c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pComponents[i] = *pHandle; 300c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentType = (OMX_COMPONENTTYPE *) * pHandle; 301c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentType->nSize = sizeof(OMX_COMPONENTTYPE); 302c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 303c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentType->nVersion.s.nVersionMajor = 1; 304c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentType->nVersion.s.nVersionMinor = 1; 305c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentType->nVersion.s.nRevision = 0; 306c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentType->nVersion.s.nStep = 0; 307c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 308c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = (*pComponentInit) (*pHandle); 309c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev//eError = OMX_ComponentInit(*pHandle); 310c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (OMX_ErrorNone == eError) 311c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 312c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = 313c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (componentType->SetCallbacks) (*pHandle, pCallBacks, 314c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pAppData); 315c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(eError == OMX_ErrorNone, eError, 316c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Core: Error returned from component SetCallBack"); 317c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else 318c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 319c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* when the component fails to initialize, release the 320c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev component handle structure */ 321c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev free(*pHandle); 322c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* mark the component handle as NULL to prevent the caller from 323c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev actually trying to access the component with it, should they 324c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ignore the return code */ 325c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *pHandle = NULL; 326c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pComponents[i] = NULL; 327c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev dlclose(pModules[i]); 328c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 329c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 330c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_ErrorNone; 331c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 332c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pthread_mutex_unlock(&mutex) != 0) 333c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 334c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Core: Error in Mutex unlock"); 335c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 336c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return (eError); 337c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 338c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 339c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 340c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************Public*Routine******************************\ 341c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_FreeHandle() 342c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 343c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description:This method will unload the OMX component pointed by 344c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_HANDLETYPE. It is the responsibility of the calling method to ensure that 345c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* the Deinit method of the component has been called prior to unloading component 346c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 347c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Parameters: 348c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] hComponent the component to unload 349c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 350c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns: OMX_NOERROR Successful 351c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 352c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note 353c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 354c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev\**************************************************************************/ 355c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_FreeHandle(OMX_HANDLETYPE hComponent) 356c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 357c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 358c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorUndefined; 359c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_COMPONENTTYPE *pHandle = (OMX_COMPONENTTYPE *) hComponent; 360c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int i; 361c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 362c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pthread_mutex_lock(&mutex) != 0) 363c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 364c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Core: Error in Mutex lock"); 365c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 366c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 367c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(pHandle != NULL, OMX_ErrorBadParameter, NULL); 368c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(count > 0, OMX_ErrorUndefined, 369c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "OMX_FreeHandle called without calling OMX_Init first"); 370c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 371c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* Locate the component handle in the array of handles */ 372c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (i = 0; i < COUNTOF(pModules); i++) 373c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 374c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pComponents[i] == hComponent) 375c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 376c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 377c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 378c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(i != COUNTOF(pModules), OMX_ErrorBadParameter, NULL); 379c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 380c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = pHandle->ComponentDeInit(hComponent); 381c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError != OMX_ErrorNone) 382c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 383c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Error From ComponentDeInit.."); 384c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 385c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 386c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* release the component and the component handle */ 387c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev dlclose(pModules[i]); 388c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pModules[i] = NULL; 389c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev free(pComponents[i]); 390c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 391c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pComponents[i] = NULL; 392c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_ErrorNone; 393c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 394c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 395c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* The unload is now complete, so set the error code to pass and exit */ 396c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pthread_mutex_unlock(&mutex) != 0) 397c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 398c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Core: Error in Mutex unlock"); 399c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 400c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 401c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 402c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 403c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 404c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/******************************Public*Routine******************************\ 405c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_DeInit() 406c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 407c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description:This method will release the resources of the OMX Core. It is the 408c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* responsibility of the application to call OMX_DeInit to ensure the clean up of these 409c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* resources. 410c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 411c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns: OMX_NOERROR Successful 412c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 413c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note 414c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 415c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev\**************************************************************************/ 416c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_Deinit() 417c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 418c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 419c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_ERRORTYPE eOsalError = TIMM_OSAL_ERR_NONE; 420c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 421c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eOsalError = TIMM_OSAL_MutexObtain(pCoreInitMutex, TIMM_OSAL_SUSPEND); 422c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eOsalError != TIMM_OSAL_ERR_NONE) 423c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 424c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Mutex lock failed"); 425c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 426c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*Returning error none because of OMX spec limitation on error codes that 427c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev can be returned by OMX_Deinit */ 428c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(count > 0, OMX_ErrorNone, 429c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "OMX_Deinit being called without a corresponding OMX_Init"); 430c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev count--; 431c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 432c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pthread_mutex_lock(&mutex) != 0) 433c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Core: Error in Mutex lock"); 434c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 435c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (count == 0) 436c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 437c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pthread_mutex_unlock(&mutex) != 0) 438c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Core: Error in Mutex unlock"); 439c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pthread_mutex_destroy(&mutex) != 0) 440c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 441c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /*printf("%d :: Core: Error in Mutex destroy\n",__LINE__); */ 442c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 443c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else 444c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 445c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (pthread_mutex_unlock(&mutex) != 0) 446c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Core: Error in Mutex unlock"); 447c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 448c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 449c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 450c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eOsalError = TIMM_OSAL_MutexRelease(pCoreInitMutex); 451c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eOsalError != TIMM_OSAL_ERR_NONE) 452c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 453c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Mutex release failed"); 454c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 455c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 456c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 457c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 458c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/************************************************************************* 459c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_SetupTunnel() 460c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 461c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: Setup the specified tunnel the two components 462c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 463c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Parameters: 464c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] hOutput Handle of the component to be accessed 465c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] nPortOutput Source port used in the tunnel 466c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] hInput Component to setup the tunnel with. 467c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] nPortInput Destination port used in the tunnel 468c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 469c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns: OMX_NOERROR Successful 470c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 471c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note 472c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 473c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev**************************************************************************/ 474c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/* OMX_SetupTunnel */ 475c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel(OMX_IN OMX_HANDLETYPE 476c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev hOutput, OMX_IN OMX_U32 nPortOutput, OMX_IN OMX_HANDLETYPE hInput, 477c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IN OMX_U32 nPortInput) 478c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 479c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNotImplemented; 480c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_COMPONENTTYPE *pCompIn, *pCompOut; 481c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_TUNNELSETUPTYPE oTunnelSetup; 482c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 483c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (hOutput == NULL && hInput == NULL) 484c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return OMX_ErrorBadParameter; 485c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 486c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev oTunnelSetup.nTunnelFlags = 0; 487c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev oTunnelSetup.eSupplier = OMX_BufferSupplyUnspecified; 488c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 489c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pCompOut = (OMX_COMPONENTTYPE *) hOutput; 490c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 491c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (hOutput) 492c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 493c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = 494c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, 495c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev hInput, nPortInput, &oTunnelSetup); 496c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 497c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 498c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 499c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError == OMX_ErrorNone && hInput) 500c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 501c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pCompIn = (OMX_COMPONENTTYPE *) hInput; 502c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = 503c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pCompIn->ComponentTunnelRequest(hInput, nPortInput, 504c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev hOutput, nPortOutput, &oTunnelSetup); 505c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError != OMX_ErrorNone && hOutput) 506c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 507c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* cancel tunnel request on output port since input port failed */ 508c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pCompOut->ComponentTunnelRequest(hOutput, nPortOutput, 509c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev NULL, 0, NULL); 510c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 511c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 512c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 513c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 514c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 515c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 516c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/************************************************************************* 517c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_ComponentNameEnum() 518c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 519c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: This method will provide the name of the component at the given nIndex 520c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 521c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*Parameters: 522c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[out] cComponentName The name of the component at nIndex 523c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] nNameLength The length of the component name 524c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] nIndex The index number of the component 525c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 526c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns: OMX_NOERROR Successful 527c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 528c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note 529c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 530c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev**************************************************************************/ 531c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(OMX_OUT OMX_STRING 532c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev cComponentName, OMX_IN OMX_U32 nNameLength, OMX_IN OMX_U32 nIndex) 533c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 534c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 535c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 536c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(cComponentName != NULL, OMX_ErrorBadParameter, NULL); 537c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(count > 0, OMX_ErrorUndefined, 538c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "OMX_GetHandle called without calling OMX_Init first"); 539c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 540c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (nIndex >= tableCount) 541c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 542c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_ErrorNoMore; 543c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else 544c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 545c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcpy(cComponentName, componentTable[nIndex].name); 546c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 547c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 548c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 549c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 550c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 551c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 552c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/************************************************************************* 553c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_GetRolesOfComponent() 554c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 555c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: This method will query the component for its supported roles 556c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 557c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*Parameters: 558c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] cComponentName The name of the component to query 559c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] pNumRoles The number of roles supported by the component 560c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] roles The roles of the component 561c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 562c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns: OMX_NOERROR Successful 563c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_ErrorBadParameter Faliure due to a bad input parameter 564c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 565c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note 566c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 567c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev**************************************************************************/ 568c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent(OMX_IN OMX_STRING 569c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev cComponentName, OMX_INOUT OMX_U32 * pNumRoles, OMX_OUT OMX_U8 ** roles) 570c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 571c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 572c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 573c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 i = 0; 574c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 j = 0; 575c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_BOOL bFound = OMX_FALSE; 576c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 577c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(cComponentName != NULL, OMX_ErrorBadParameter, NULL); 578c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(pNumRoles != NULL, OMX_ErrorBadParameter, NULL); 579c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(strlen(cComponentName) < MAXNAMESIZE, 580c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ErrorInvalidComponentName, NULL); 581c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(count > 0, OMX_ErrorUndefined, 582c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "OMX_GetHandle called without calling OMX_Init first"); 583c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 584c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev while (!bFound && i < tableCount) 585c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 586c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(cComponentName, componentTable[i].name) == 0) 587c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 588c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev bFound = OMX_TRUE; 589c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else 590c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 591c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev i++; 592c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 593c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 594c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (roles == NULL) 595c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 596c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *pNumRoles = componentTable[i].nRoles; 597c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 598c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else 599c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 600c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (bFound && (*pNumRoles == componentTable[i].nRoles)) 601c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 602c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (j = 0; j < componentTable[i].nRoles; j++) 603c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 604c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcpy((OMX_STRING) roles[j], 605c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[i].pRoleArray[j]); 606c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 607c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 608c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 609c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 610c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 611c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 612c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 613c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/************************************************************************* 614c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* OMX_GetComponentsOfRole() 615c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 616c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Description: This method will query the component for its supported roles 617c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 618c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev*Parameters: 619c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] role The role name to query for 620c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] pNumComps The number of components supporting the given role 621c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* @param[in] compNames The names of the components supporting the given role 622c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 623c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Returns: OMX_NOERROR Successful 624c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 625c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* Note 626c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev* 627c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev**************************************************************************/ 628c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole(OMX_IN OMX_STRING role, 629c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_INOUT OMX_U32 * pNumComps, OMX_INOUT OMX_U8 ** compNames) 630c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 631c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 632c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 i = 0; 633c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 j = 0; 634c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U32 k = 0; 635c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 636c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(role != NULL, OMX_ErrorBadParameter, NULL); 637c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(pNumComps != NULL, OMX_ErrorBadParameter, NULL); 638c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_require(count > 0, OMX_ErrorUndefined, 639c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "OMX_GetHandle called without calling OMX_Init first"); 640c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 641c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* This implies that the componentTable is not filled */ 642c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(componentTable[i].pRoleArray[j] != NULL, 643c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ErrorBadParameter, NULL); 644c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 645c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (i = 0; i < tableCount; i++) 646c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 647c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (j = 0; j < componentTable[i].nRoles; j++) 648c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 649c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strcmp(componentTable[i].pRoleArray[j], 650c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev role) == 0) 651c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 652c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* the first call to this function should only count the number 653c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev of roles so that for the second call compNames can be allocated 654c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev with the proper size for that number of roles */ 655c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (compNames != NULL) 656c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 657c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strncpy((OMX_STRING) (compNames[k]), 658c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_STRING) componentTable[i]. 659c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev name, MAXNAMESIZE); 660c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 661c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev k++; 662c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 663c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 664c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev *pNumComps = k; 665c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 666c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 667c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 668c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 669c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 670c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 671c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 672c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*************************************** 673c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevPRINT TABLE FOR DEBUGGING PURPOSES ONLY 674c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev***************************************/ 675c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 676c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_API OMX_ERRORTYPE OMX_PrintComponentTable() 677c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 678c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 679c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int i = 0; 680c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int j = 0; 681c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 682c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Info 683c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ("--------Component Table:: %d Components found-------------", 684c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tableCount); 685c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 686c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (i = 0; i < tableCount; i++) 687c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 688c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Info("%i:: %s", i, componentTable[i].name); 689c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (j = 0; j < componentTable[i].nRoles; j++) 690c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 691c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Info(" %s", 692c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[i].pRoleArray[j]); 693c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 694c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 695c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 696c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Info 697c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ("-----------------End Component Table ------------------"); 698c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 699c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 700c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 701c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 702c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 703c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 704c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE OMX_BuildComponentTable() 705c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 706c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_ERRORTYPE eError = OMX_ErrorNone; 707c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_CALLBACKTYPE sCallbacks; 708c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef STATIC_TABLE 709c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_HANDLETYPE hComp = 0; 710c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_U8 cRole[MAXNAMESIZE]; 711c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_STRING tempName = NULL; 712c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_STRING temp = NULL; 713c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static OMX_STRING namePrefix = "OMX"; 714c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static OMX_STRING filePrefix = "libOMX."; 715c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev static OMX_STRING suffix = ".so"; 716c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 717c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int j = 0; 718c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int numFiles = 0; 719c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int i, k; 720c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev int componentfound = 0; 721c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 722c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* set up dummy call backs */ 723c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sCallbacks.EventHandler = ComponentTable_EventHandler; 724c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sCallbacks.EmptyBufferDone = ComponentTable_EmptyBufferDone; 725c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sCallbacks.FillBufferDone = ComponentTable_FillBufferDone; 726c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 727c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#ifndef STATIC_TABLE 728c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* allocate the name table */ 729c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* 730c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev compName = (OMX_STRING *) malloc(MAX_TABLE_SIZE * sizeof(OMX_STRING)); 731c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sRoleArray = (OMX_STRING**) malloc(MAX_TABLE_SIZE * sizeof(OMX_STRING)); 732c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 733c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 734c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* scan the target/lib directory and create a list of files in the directory */ 735c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev numFiles = scandir(libdir, &namelist, 0, 0); 736c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tableCount = 0; 737c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev while (numFiles--) 738c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 739c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* check if the file is an OMX component */ 740c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (strncmp(namelist[numFiles]->d_name, filePrefix, 741c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strlen(filePrefix)) == 0) 742c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 743c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 744c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* if the file is an OMX component, trim the prefix and suffix */ 745c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tempName = (OMX_STRING) malloc(sizeof(namelist[numFiles]->d_name) + 1); /* adding one ensures */ 746c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev memset(tempName, 0x00, sizeof(namelist[numFiles]->d_name) + 1); /* that a null terminator will */ 747c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* always be present */ 748c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* copy only the name without the suffix */ 749c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strncpy(tempName, namelist[numFiles]->d_name, 750c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strlen(namelist[numFiles]->d_name) - 751c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strlen(suffix)); 752c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* set a pointer to be after the lib prefix, i.e the beginning of the component name */ 753c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev temp = strstr(tempName, namePrefix); 754c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 755c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* then copy the component name to the table */ 756c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* 757c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev compName[tableCount]= (OMX_STRING) malloc(MAXNAMESIZE); 758c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 759c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strncpy(compName[tableCount], temp, strlen(temp) + 1); 760c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[tableCount].name = 761c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev compName[tableCount]; 762c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 763c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* get the handle for the component and query for the roles of each component */ 764c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = 765c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_GetHandle(&hComp, 766c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[tableCount].name, 0x0, 767c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev &sCallbacks); 768c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError == OMX_ErrorNone) 769c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 770c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev j = 0; 771c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev while (eError != OMX_ErrorNoMore) 772c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 773c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = 774c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ((OMX_COMPONENTTYPE *) hComp)-> 775c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ComponentRoleEnum(hComp, cRole, 776c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev j++); 777c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError == OMX_ErrorNotImplemented) 778c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 779c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev j = 1; 780c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 781c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 782c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 783c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev nRoles = j - 1; 784c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[tableCount].nRoles = nRoles; 785c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* sRoleArray[tableCount] = (OMX_STRING *) malloc(nRoles * sizeof(OMX_STRING)); */ 786c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (nRoles > 0) 787c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 788c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* sRoleArray[tableCount] = (OMX_STRING *) malloc(nRoles * sizeof(OMX_STRING)); */ 789c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (j = 0; j < nRoles; j++) 790c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 791c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sRoleArray[tableCount][j] = 792c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_STRING) 793c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev malloc(sizeof(OMX_U8) * 794c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev MAXNAMESIZE); 795c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ((OMX_COMPONENTTYPE *) 796c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev hComp)-> 797c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev ComponentRoleEnum(hComp, 798c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_U8 *) 799c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sRoleArray[tableCount][j], 800c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev j); 801c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[tableCount]. 802c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pRoleArray[j] = 803c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sRoleArray[tableCount][j]; 804c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 805c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } else 806c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 807c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* sRoleArray[tableCount] = (OMX_STRING *) malloc(sizeof(OMX_STRING)); */ 808c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sRoleArray[tableCount][j] = 809c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev (OMX_STRING) malloc(sizeof(OMX_U8) 810c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * MAXNAMESIZE); 811c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcpy(sRoleArray[tableCount][j], 812c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EMPTY_STRING); 813c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[tableCount]. 814c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev pRoleArray[j] = 815c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev sRoleArray[tableCount][j]; 816c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 817c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 818c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (hComp) 819c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 820c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* free the component handle */ 821c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = OMX_FreeHandle(hComp); 822c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError != OMX_ErrorNone) 823c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 824c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev goto EXIT; 825c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 826c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 827c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev /* increment the table counter index only if above was successful */ 828c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tableCount++; 829c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (tempName != NULL) 830c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 831c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev free(tempName); 832c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 833c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 834c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 835c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 836c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 837c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev#endif 838c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 839c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (i = 0, numFiles = 0; i < MAXCOMP; i++) 840c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 841c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (tComponentName[i][0] == NULL) 842c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 843c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 844c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 845c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 846c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev for (j = 0; j < numFiles; j++) 847c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 848c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (!strcmp(componentTable[j].name, 849c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tComponentName[i][0])) 850c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 851c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentfound = 1; 852c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev break; 853c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 854c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 855c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (componentfound == 1) 856c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 857c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev continue; 858c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 859c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 860c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (j == numFiles) 861c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { /* new component */ 862c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev k = 1; 863c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev while (tComponentName[i][k] != NULL) 864c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 865c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[numFiles].pRoleArray[k - 1] = 866c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tComponentName[i][k]; 867c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev k++; 868c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 869c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[numFiles].nRoles = k - 1; 870c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev strcpy(compName[numFiles], tComponentName[i][0]); 871c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev componentTable[numFiles].name = compName[numFiles]; 872c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev numFiles++; 873c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 874c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 875c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev tableCount = numFiles; 876c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 877c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev CORE_assert(eError == OMX_ErrorNone, eError, 878c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev "Could not build Component Table"); 879c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev EXIT: 880c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return eError; 881c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 882c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 883c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE ComponentTable_EventHandler(OMX_IN OMX_HANDLETYPE hComponent, 884c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IN OMX_PTR pAppData, 885c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IN OMX_EVENTTYPE eEvent, 886c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, OMX_IN OMX_PTR pEventData) 887c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 888c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return OMX_ErrorNotImplemented; 889c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 890c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 891c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE ComponentTable_EmptyBufferDone(OMX_OUT OMX_HANDLETYPE 892c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev hComponent, OMX_OUT OMX_PTR pAppData, 893c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_OUT OMX_BUFFERHEADERTYPE * pBuffer) 894c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 895c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return OMX_ErrorNotImplemented; 896c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 897c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 898c322989ae6ff6769490828de1b5eda12b749cce9Iliyan MalchevOMX_ERRORTYPE ComponentTable_FillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent, 899c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev OMX_OUT OMX_PTR pAppData, OMX_OUT OMX_BUFFERHEADERTYPE * pBuffer) 900c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 901c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev return OMX_ErrorNotImplemented; 902c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 903c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 904c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 905c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 906c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*===============================================================*/ 907c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** @fn Core_Setup : This function is called when the the OMX Core library is 908c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * loaded. It creates a mutex, which is used during OMX_Init() 909c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 910c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*===============================================================*/ 911c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid __attribute__ ((constructor)) Core_Setup(void) 912c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 913c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE; 914c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 915c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = TIMM_OSAL_MutexCreate(&pCoreInitMutex); 916c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError != TIMM_OSAL_ERR_NONE) 917c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 918c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Creation of default mutex failed"); 919c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 920c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 921c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 922c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 923c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 924c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*===============================================================*/ 925c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/** @fn Core_Destroy : This function is called when the the OMX Core library is 926c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * unloaded. It destroys the mutex which was created by 927c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * Core_Setup(). 928c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev * 929c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev */ 930c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev/*===============================================================*/ 931c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchevvoid __attribute__ ((destructor)) Core_Destroy(void) 932c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev{ 933c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_ERRORTYPE eError = TIMM_OSAL_ERR_NONE; 934c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev 935c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev eError = TIMM_OSAL_MutexDelete(pCoreInitMutex); 936c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev if (eError != TIMM_OSAL_ERR_NONE) 937c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev { 938c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev TIMM_OSAL_Error("Destruction of default mutex failed"); 939c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev } 940c322989ae6ff6769490828de1b5eda12b749cce9Iliyan Malchev} 941