Home | History | Annotate | Download | only in core
      1 /*
      2  *
      3  * Copyright 2012 Samsung Electronics S.LSI Co. LTD
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at
      8  *
      9  *      http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  */
     17 
     18 /*
     19  * @file       Exynos_OMX_Component_Register.c
     20  * @brief      Exynos OpenMAX IL Component Register
     21  * @author     SeungBeom Kim (sbcrux.kim (at) samsung.com)
     22  * @version    2.0.0
     23  * @history
     24  *    2012.02.20 : Create
     25  */
     26 #include <stdio.h>
     27 #include <stdlib.h>
     28 #include <string.h>
     29 #include <dlfcn.h>
     30 #include <sys/types.h>
     31 #include <dirent.h>
     32 #include <errno.h>
     33 #include <assert.h>
     34 #include <dirent.h>
     35 
     36 #include "OMX_Component.h"
     37 #include "Exynos_OSAL_Memory.h"
     38 #include "Exynos_OSAL_ETC.h"
     39 #include "Exynos_OSAL_Library.h"
     40 #include "Exynos_OMX_Component_Register.h"
     41 #include "Exynos_OMX_Macros.h"
     42 
     43 #undef  EXYNOS_LOG_TAG
     44 #define EXYNOS_LOG_TAG    "EXYNOS_COMP_REGS"
     45 #define EXYNOS_LOG_OFF
     46 #include "Exynos_OSAL_Log.h"
     47 
     48 OMX_ERRORTYPE Exynos_OMX_Component_Register(EXYNOS_OMX_COMPONENT_REGLIST **compList, OMX_U32 *compNum)
     49 {
     50     OMX_ERRORTYPE  ret = OMX_ErrorNone;
     51     int            componentNum = 0, roleNum = 0, totalCompNum = 0;
     52     int            read;
     53     char          *libName;
     54     size_t         len;
     55     const char    *errorMsg;
     56     DIR           *dir;
     57     struct dirent *d;
     58 
     59     int (*Exynos_OMX_COMPONENT_Library_Register)(ExynosRegisterComponentType **exynosComponents);
     60     ExynosRegisterComponentType **exynosComponentsTemp;
     61     EXYNOS_OMX_COMPONENT_REGLIST *componentList;
     62 
     63     FunctionIn();
     64 
     65     dir = opendir(EXYNOS_OMX_INSTALL_PATH);
     66     if (dir == NULL) {
     67         ret = OMX_ErrorUndefined;
     68         goto EXIT;
     69     }
     70 
     71     componentList = (EXYNOS_OMX_COMPONENT_REGLIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_COMPONENT_REGLIST) * MAX_OMX_COMPONENT_NUM);
     72     Exynos_OSAL_Memset(componentList, 0, sizeof(EXYNOS_OMX_COMPONENT_REGLIST) * MAX_OMX_COMPONENT_NUM);
     73     libName = Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_LIBNAME_SIZE);
     74 
     75     while ((d = readdir(dir)) != NULL) {
     76         OMX_HANDLETYPE soHandle;
     77         Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s", d->d_name);
     78 
     79         if (Exynos_OSAL_Strncmp(d->d_name, "libOMX.Exynos.", Exynos_OSAL_Strlen("libOMX.Exynos.")) == 0) {
     80             Exynos_OSAL_Memset(libName, 0, MAX_OMX_COMPONENT_LIBNAME_SIZE);
     81             Exynos_OSAL_Strcpy(libName, EXYNOS_OMX_INSTALL_PATH);
     82             Exynos_OSAL_Strcat(libName, d->d_name);
     83             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Path & libName : %s", libName);
     84             if ((soHandle = Exynos_OSAL_dlopen(libName, RTLD_NOW)) != NULL) {
     85                 Exynos_OSAL_dlerror();    /* clear error*/
     86                 if ((Exynos_OMX_COMPONENT_Library_Register = Exynos_OSAL_dlsym(soHandle, "Exynos_OMX_COMPONENT_Library_Register")) != NULL) {
     87                     int i = 0;
     88                     unsigned int j = 0;
     89 
     90                     componentNum = (*Exynos_OMX_COMPONENT_Library_Register)(NULL);
     91                     exynosComponentsTemp = (ExynosRegisterComponentType **)Exynos_OSAL_Malloc(sizeof(ExynosRegisterComponentType*) * componentNum);
     92                     for (i = 0; i < componentNum; i++) {
     93                         exynosComponentsTemp[i] = Exynos_OSAL_Malloc(sizeof(ExynosRegisterComponentType));
     94                         Exynos_OSAL_Memset(exynosComponentsTemp[i], 0, sizeof(ExynosRegisterComponentType));
     95                     }
     96                     (*Exynos_OMX_COMPONENT_Library_Register)(exynosComponentsTemp);
     97 
     98                     for (i = 0; i < componentNum; i++) {
     99                         Exynos_OSAL_Strcpy(componentList[totalCompNum].component.componentName, exynosComponentsTemp[i]->componentName);
    100                         for (j = 0; j < exynosComponentsTemp[i]->totalRoleNum; j++)
    101                             Exynos_OSAL_Strcpy(componentList[totalCompNum].component.roles[j], exynosComponentsTemp[i]->roles[j]);
    102                         componentList[totalCompNum].component.totalRoleNum = exynosComponentsTemp[i]->totalRoleNum;
    103 
    104                         Exynos_OSAL_Strcpy(componentList[totalCompNum].libName, libName);
    105 
    106                         totalCompNum++;
    107                     }
    108                     for (i = 0; i < componentNum; i++) {
    109                         Exynos_OSAL_Free(exynosComponentsTemp[i]);
    110                     }
    111 
    112                     Exynos_OSAL_Free(exynosComponentsTemp);
    113                 } else {
    114                     if ((errorMsg = Exynos_OSAL_dlerror()) != NULL)
    115                         Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "dlsym failed: %s", errorMsg);
    116                 }
    117                 Exynos_OSAL_dlclose(soHandle);
    118             } else {
    119                 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "dlopen failed: %s", Exynos_OSAL_dlerror());
    120             }
    121         } else {
    122             /* not a component name line. skip */
    123             continue;
    124         }
    125     }
    126 
    127     Exynos_OSAL_Free(libName);
    128 
    129     closedir(dir);
    130 
    131     *compList = componentList;
    132     *compNum = totalCompNum;
    133 
    134 EXIT:
    135     FunctionOut();
    136 
    137     return ret;
    138 }
    139 
    140 OMX_ERRORTYPE Exynos_OMX_Component_Unregister(EXYNOS_OMX_COMPONENT_REGLIST *componentList)
    141 {
    142     OMX_ERRORTYPE ret = OMX_ErrorNone;
    143 
    144     Exynos_OSAL_Free(componentList);
    145 
    146 EXIT:
    147     return ret;
    148 }
    149 
    150 OMX_ERRORTYPE Exynos_OMX_ComponentAPICheck(OMX_COMPONENTTYPE *component)
    151 {
    152     OMX_ERRORTYPE ret = OMX_ErrorNone;
    153 
    154     if ((NULL == component->GetComponentVersion)    ||
    155         (NULL == component->SendCommand)            ||
    156         (NULL == component->GetParameter)           ||
    157         (NULL == component->SetParameter)           ||
    158         (NULL == component->GetConfig)              ||
    159         (NULL == component->SetConfig)              ||
    160         (NULL == component->GetExtensionIndex)      ||
    161         (NULL == component->GetState)               ||
    162         (NULL == component->ComponentTunnelRequest) ||
    163         (NULL == component->UseBuffer)              ||
    164         (NULL == component->AllocateBuffer)         ||
    165         (NULL == component->FreeBuffer)             ||
    166         (NULL == component->EmptyThisBuffer)        ||
    167         (NULL == component->FillThisBuffer)         ||
    168         (NULL == component->SetCallbacks)           ||
    169         (NULL == component->ComponentDeInit)        ||
    170         (NULL == component->UseEGLImage)            ||
    171         (NULL == component->ComponentRoleEnum))
    172         ret = OMX_ErrorInvalidComponent;
    173     else
    174         ret = OMX_ErrorNone;
    175 
    176     return ret;
    177 }
    178 
    179 OMX_ERRORTYPE Exynos_OMX_ComponentLoad(EXYNOS_OMX_COMPONENT *exynos_component)
    180 {
    181     OMX_ERRORTYPE      ret = OMX_ErrorNone;
    182     OMX_HANDLETYPE     libHandle;
    183     OMX_COMPONENTTYPE *pOMXComponent;
    184 
    185     FunctionIn();
    186 
    187     OMX_ERRORTYPE (*Exynos_OMX_ComponentInit)(OMX_HANDLETYPE hComponent, OMX_STRING componentName);
    188 
    189     libHandle = Exynos_OSAL_dlopen((OMX_STRING)exynos_component->libName, RTLD_NOW);
    190     if (!libHandle) {
    191         ret = OMX_ErrorInvalidComponentName;
    192         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponentName, Line:%d", __LINE__);
    193         goto EXIT;
    194     }
    195 
    196     Exynos_OMX_ComponentInit = Exynos_OSAL_dlsym(libHandle, "Exynos_OMX_ComponentInit");
    197     if (!Exynos_OMX_ComponentInit) {
    198         Exynos_OSAL_dlclose(libHandle);
    199         ret = OMX_ErrorInvalidComponent;
    200         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__);
    201         goto EXIT;
    202     }
    203 
    204     pOMXComponent = (OMX_COMPONENTTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_COMPONENTTYPE));
    205     INIT_SET_SIZE_VERSION(pOMXComponent, OMX_COMPONENTTYPE);
    206     ret = (*Exynos_OMX_ComponentInit)((OMX_HANDLETYPE)pOMXComponent, (OMX_STRING)exynos_component->componentName);
    207     if (ret != OMX_ErrorNone) {
    208         Exynos_OSAL_Free(pOMXComponent);
    209         Exynos_OSAL_dlclose(libHandle);
    210         ret = OMX_ErrorInvalidComponent;
    211         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__);
    212         goto EXIT;
    213     } else {
    214         if (Exynos_OMX_ComponentAPICheck(pOMXComponent) != OMX_ErrorNone) {
    215             if (NULL != pOMXComponent->ComponentDeInit)
    216                 pOMXComponent->ComponentDeInit(pOMXComponent);
    217             Exynos_OSAL_Free(pOMXComponent);
    218             Exynos_OSAL_dlclose(libHandle);
    219             ret = OMX_ErrorInvalidComponent;
    220             Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__);
    221             goto EXIT;
    222         }
    223         exynos_component->libHandle = libHandle;
    224         exynos_component->pOMXComponent = pOMXComponent;
    225         ret = OMX_ErrorNone;
    226     }
    227 
    228 EXIT:
    229     FunctionOut();
    230 
    231     return ret;
    232 }
    233 
    234 OMX_ERRORTYPE Exynos_OMX_ComponentUnload(EXYNOS_OMX_COMPONENT *exynos_component)
    235 {
    236     OMX_ERRORTYPE ret = OMX_ErrorNone;
    237     OMX_COMPONENTTYPE *pOMXComponent = NULL;
    238 
    239     FunctionIn();
    240 
    241     if (!exynos_component) {
    242         ret = OMX_ErrorBadParameter;
    243         goto EXIT;
    244     }
    245 
    246     pOMXComponent = exynos_component->pOMXComponent;
    247     if (pOMXComponent != NULL) {
    248         pOMXComponent->ComponentDeInit(pOMXComponent);
    249         Exynos_OSAL_Free(pOMXComponent);
    250         exynos_component->pOMXComponent = NULL;
    251     }
    252 
    253     if (exynos_component->libHandle != NULL) {
    254         Exynos_OSAL_dlclose(exynos_component->libHandle);
    255         exynos_component->libHandle = NULL;
    256     }
    257 
    258 EXIT:
    259     FunctionOut();
    260 
    261     return ret;
    262 }
    263 
    264