120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD 420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License"); 620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * you may not use this file except in compliance with the License. 720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * You may obtain a copy of the License at 820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * http://www.apache.org/licenses/LICENSE-2.0 1020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * 1120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Unless required by applicable law or agreed to in writing, software 1220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS, 1320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * See the License for the specific language governing permissions and 1520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * limitations under the License. 1620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 1720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 1820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/* 1920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @file Exynos_OMX_Component_Register.c 2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief Exynos OpenMAX IL Component Register 2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author SeungBeom Kim (sbcrux.kim@samsung.com) 2238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version 2.0.0 2320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history 2438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * 2012.02.20 : Create 2520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */ 2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h> 2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h> 2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h> 2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <dlfcn.h> 3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <sys/types.h> 3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <dirent.h> 3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <errno.h> 3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <assert.h> 3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <dirent.h> 3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "OMX_Component.h" 3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Memory.h" 3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_ETC.h" 3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Library.h" 4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Component_Register.h" 4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h" 4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef EXYNOS_LOG_TAG 4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG "EXYNOS_COMP_REGS" 4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF 4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h" 4720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Component_Register(EXYNOS_OMX_COMPONENT_REGLIST **compList, OMX_U32 *compNum) 4920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 5120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int componentNum = 0, roleNum = 0, totalCompNum = 0; 5220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int read; 5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang char *libName; 5420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang size_t len; 5520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang const char *errorMsg; 5620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang DIR *dir; 5720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang struct dirent *d; 5820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int (*Exynos_OMX_COMPONENT_Library_Register)(ExynosRegisterComponentType **exynosComponents); 6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ExynosRegisterComponentType **exynosComponentsTemp; 6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang EXYNOS_OMX_COMPONENT_REGLIST *componentList; 6220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang dir = opendir(EXYNOS_OMX_INSTALL_PATH); 6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (dir == NULL) { 6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorUndefined; 6820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 7020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang componentList = (EXYNOS_OMX_COMPONENT_REGLIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_COMPONENT_REGLIST) * MAX_OMX_COMPONENT_NUM); 7220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(componentList, 0, sizeof(EXYNOS_OMX_COMPONENT_REGLIST) * MAX_OMX_COMPONENT_NUM); 7320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang libName = Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_LIBNAME_SIZE); 7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang while ((d = readdir(dir)) != NULL) { 7620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE soHandle; 77b5eeb2099580e976f969a8809537a24fa34cac0fSeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s", d->d_name); 7820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 7938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang if (Exynos_OSAL_Strncmp(d->d_name, "libOMX.Exynos.", Exynos_OSAL_Strlen("libOMX.Exynos.")) == 0) { 8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(libName, 0, MAX_OMX_COMPONENT_LIBNAME_SIZE); 8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(libName, EXYNOS_OMX_INSTALL_PATH); 8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcat(libName, d->d_name); 83b5eeb2099580e976f969a8809537a24fa34cac0fSeungBeom Kim Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Path & libName : %s", libName); 8420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((soHandle = Exynos_OSAL_dlopen(libName, RTLD_NOW)) != NULL) { 8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_dlerror(); /* clear error*/ 8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((Exynos_OMX_COMPONENT_Library_Register = Exynos_OSAL_dlsym(soHandle, "Exynos_OMX_COMPONENT_Library_Register")) != NULL) { 8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang int i = 0; 8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang unsigned int j = 0; 8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang componentNum = (*Exynos_OMX_COMPONENT_Library_Register)(NULL); 9120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosComponentsTemp = (ExynosRegisterComponentType **)Exynos_OSAL_Malloc(sizeof(ExynosRegisterComponentType*) * componentNum); 9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < componentNum; i++) { 9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynosComponentsTemp[i] = Exynos_OSAL_Malloc(sizeof(ExynosRegisterComponentType)); 9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Memset(exynosComponentsTemp[i], 0, sizeof(ExynosRegisterComponentType)); 9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 9620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (*Exynos_OMX_COMPONENT_Library_Register)(exynosComponentsTemp); 9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < componentNum; i++) { 9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(componentList[totalCompNum].component.componentName, exynosComponentsTemp[i]->componentName); 10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (j = 0; j < exynosComponentsTemp[i]->totalRoleNum; j++) 10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(componentList[totalCompNum].component.roles[j], exynosComponentsTemp[i]->roles[j]); 10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang componentList[totalCompNum].component.totalRoleNum = exynosComponentsTemp[i]->totalRoleNum; 10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Strcpy(componentList[totalCompNum].libName, libName); 10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang totalCompNum++; 10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang for (i = 0; i < componentNum; i++) { 10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(exynosComponentsTemp[i]); 11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(exynosComponentsTemp); 11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((errorMsg = Exynos_OSAL_dlerror()) != NULL) 11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "dlsym failed: %s", errorMsg); 11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_dlclose(soHandle); 11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "dlopen failed: %s", Exynos_OSAL_dlerror()); 12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang /* not a component name line. skip */ 12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang continue; 12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(libName); 12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang closedir(dir); 13020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *compList = componentList; 13220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *compNum = totalCompNum; 13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Component_Unregister(EXYNOS_OMX_COMPONENT_REGLIST *componentList) 14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(componentList); 14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentAPICheck(OMX_COMPONENTTYPE *component) 15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if ((NULL == component->GetComponentVersion) || 15520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->SendCommand) || 15620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->GetParameter) || 15720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->SetParameter) || 15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->GetConfig) || 15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->SetConfig) || 16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->GetExtensionIndex) || 16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->GetState) || 16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->ComponentTunnelRequest) || 16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->UseBuffer) || 16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->AllocateBuffer) || 16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->FreeBuffer) || 16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->EmptyThisBuffer) || 16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->FillThisBuffer) || 16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->SetCallbacks) || 16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->ComponentDeInit) || 17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->UseEGLImage) || 17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang (NULL == component->ComponentRoleEnum)) 17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidComponent; 17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang else 17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentLoad(EXYNOS_OMX_COMPONENT *exynos_component) 18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_HANDLETYPE libHandle; 18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent; 18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE (*Exynos_OMX_ComponentInit)(OMX_HANDLETYPE hComponent, OMX_STRING componentName); 18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang libHandle = Exynos_OSAL_dlopen((OMX_STRING)exynos_component->libName, RTLD_NOW); 19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!libHandle) { 19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidComponentName; 19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponentName, Line:%d", __LINE__); 19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OMX_ComponentInit = Exynos_OSAL_dlsym(libHandle, "Exynos_OMX_ComponentInit"); 19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!Exynos_OMX_ComponentInit) { 19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_dlclose(libHandle); 19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidComponent; 20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__); 20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = (OMX_COMPONENTTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_COMPONENTTYPE)); 20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang INIT_SET_SIZE_VERSION(pOMXComponent, OMX_COMPONENTTYPE); 20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = (*Exynos_OMX_ComponentInit)((OMX_HANDLETYPE)pOMXComponent, (OMX_STRING)exynos_component->componentName); 20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (ret != OMX_ErrorNone) { 20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pOMXComponent); 20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_dlclose(libHandle); 21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidComponent; 21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__); 21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } else { 21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (Exynos_OMX_ComponentAPICheck(pOMXComponent) != OMX_ErrorNone) { 21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (NULL != pOMXComponent->ComponentDeInit) 21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->ComponentDeInit(pOMXComponent); 21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pOMXComponent); 21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_dlclose(libHandle); 21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorInvalidComponent; 22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__); 22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynos_component->libHandle = libHandle; 22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynos_component->pOMXComponent = pOMXComponent; 22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorNone; 22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_ComponentUnload(EXYNOS_OMX_COMPONENT *exynos_component) 23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{ 23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_ERRORTYPE ret = OMX_ErrorNone; 23720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang OMX_COMPONENTTYPE *pOMXComponent = NULL; 23820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 23920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionIn(); 24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (!exynos_component) { 24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang ret = OMX_ErrorBadParameter; 24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang goto EXIT; 24420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 24520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 24620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent = exynos_component->pOMXComponent; 24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (pOMXComponent != NULL) { 24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang pOMXComponent->ComponentDeInit(pOMXComponent); 24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_Free(pOMXComponent); 25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynos_component->pOMXComponent = NULL; 25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang if (exynos_component->libHandle != NULL) { 25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang Exynos_OSAL_dlclose(exynos_component->libHandle); 25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang exynos_component->libHandle = NULL; 25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang } 25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT: 25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang FunctionOut(); 26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang return ret; 26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang} 26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang 264