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