15f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu/*
22f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * wrs_core.cpp, Wind River OpenMax-IL Core
330bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu *
42f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Copyright (c) 2009-2010 Wind River Systems, Inc.
52f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
62f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Licensed under the Apache License, Version 2.0 (the "License");
72f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * you may not use this file except in compliance with the License.
82f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * You may obtain a copy of the License at
92f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
102f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * http://www.apache.org/licenses/LICENSE-2.0
112f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu *
122f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Unless required by applicable law or agreed to in writing, software
132f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * distributed under the License is distributed on an "AS IS" BASIS,
142f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
152f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * See the License for the specific language governing permissions and
162f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * limitations under the License.
175f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu */
185f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
195f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <stdio.h>
205f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <stdlib.h>
215f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <string.h>
225f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
235f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <pthread.h>
245f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
255f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <OMX_Core.h>
265f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <OMX_Component.h>
275f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
285f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <list.h>
295f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <cmodule.h>
309b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu#include <componentbase.h>
315f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
32bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu//#define LOG_NDEBUG 0
33bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
34bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu#define LOG_TAG "wrs-omxil-core"
355f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <log.h>
365f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
375f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryustatic unsigned int g_initialized = 0;
389a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryustatic unsigned int g_nr_instances = 0;
395f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
405f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryustatic struct list *g_module_list = NULL;
415f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryustatic pthread_mutex_t g_module_lock = PTHREAD_MUTEX_INITIALIZER;
425f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
435f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryustatic struct list *construct_components(const char *config_file_name)
445f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
455f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    FILE *config_file;
465f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    char library_name[OMX_MAX_STRINGNAME_SIZE];
475f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    char config_file_path[256];
485f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    struct list *head = NULL;
495f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
505f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    strncpy(config_file_path, "/etc/", 256);
515f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    strncat(config_file_path, config_file_name, 256);
525f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    config_file = fopen(config_file_path, "r");
535f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    if (!config_file) {
545f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        strncpy(config_file_path, "./", 256);
555f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        strncat(config_file_path, config_file_name, 256);
565f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        config_file = fopen(config_file_path, "r");
575f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        if (!config_file) {
585f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu            LOGE("not found file %s\n", config_file_name);
595f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu            return NULL;
605f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        }
615f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    }
625f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
635f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    while (fscanf(config_file, "%s", library_name) > 0) {
645f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        CModule *cmodule;
65a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        struct list *entry;
66a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        OMX_ERRORTYPE ret;
675f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
685f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        library_name[OMX_MAX_STRINGNAME_SIZE-1] = '\0';
692793d8451908b3e613725f1d3dfd561d402cba95Ho-Eun Ryu
702793d8451908b3e613725f1d3dfd561d402cba95Ho-Eun Ryu        /* skip libraries starting with # */
712793d8451908b3e613725f1d3dfd561d402cba95Ho-Eun Ryu        if (library_name[0] == '#')
722793d8451908b3e613725f1d3dfd561d402cba95Ho-Eun Ryu            continue;
732793d8451908b3e613725f1d3dfd561d402cba95Ho-Eun Ryu
745f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        cmodule = new CModule(&library_name[0]);
75a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (!cmodule)
76a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            continue;
77a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
78bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu        LOGI("found component library %s\n", library_name);
795f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
80aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu        ret = cmodule->Load(MODULE_LAZY);
81a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (ret != OMX_ErrorNone)
82a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            goto delete_cmodule;
83a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
84aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu        ret = cmodule->QueryComponentNameAndRoles();
85a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (ret != OMX_ErrorNone)
86a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            goto unload_cmodule;
87a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
88a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        entry = list_alloc(cmodule);
89a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (!entry)
90a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            goto unload_cmodule;
91a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        head = __list_add_tail(head, entry);
92a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
93a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        cmodule->Unload();
94bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu        LOGI("module %s:%s added to component list\n",
95a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu             cmodule->GetLibraryName(), cmodule->GetComponentName());
96a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
97a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        continue;
98a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
99a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu    unload_cmodule:
100a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        cmodule->Unload();
101a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu    delete_cmodule:
102a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        delete cmodule;
1035f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    }
1045f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1055f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    fclose(config_file);
1065f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    return head;
1075f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1085f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
109a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryustatic struct list *destruct_components(struct list *head)
1105f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1115f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    struct list *entry, *next;
1125f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1135f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    list_foreach_safe(head, entry, next) {
1145f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        CModule *cmodule = static_cast<CModule *>(entry->data);
1155f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1165f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        head = __list_delete(head, entry);
1175f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        delete cmodule;
1185f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    }
1195f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
120a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu    return head;
1215f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1225f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1235f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void)
1245f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1255f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    int ret;
1265f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
127bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGV("%s(): enter", __FUNCTION__);
128bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
1295f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    pthread_mutex_lock(&g_module_lock);
1305f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    if (!g_initialized) {
1310649b314d453ee61c2a045787524566fc9b76b4dHo-Eun Ryu        g_module_list = construct_components("wrs_omxil_components.list");
1325f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        if (!g_module_list) {
1335f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu            pthread_mutex_unlock(&g_module_lock);
134bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            LOGE("%s(): exit failure, construct_components failed",
135bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                 __FUNCTION__);
1365f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu            return OMX_ErrorInsufficientResources;
1375f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        }
1385f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1395f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        g_initialized = 1;
1405f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    }
1415f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
1425f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
143bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGV("%s(): exit done", __FUNCTION__);
1445f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    return OMX_ErrorNone;
1455f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1465f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1475f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void)
1485f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1499a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu    OMX_ERRORTYPE ret = OMX_ErrorNone;
1509a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu
151bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGV("%s(): enter", __FUNCTION__);
152bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
1535f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    pthread_mutex_lock(&g_module_lock);
1549a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu    if (!g_nr_instances)
1559a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu        g_module_list = destruct_components(g_module_list);
1569a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu    else
1579a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu        ret = OMX_ErrorUndefined;
1585f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
1595f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
160855c54271cbfd2ad54a13ba36c457d2fdcd1efcfShuduo Sang    g_initialized = 0;
161855c54271cbfd2ad54a13ba36c457d2fdcd1efcfShuduo Sang
162bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGV("%s(): exit done (ret : 0x%08x)", __FUNCTION__, ret);
1639a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu    return ret;
1645f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1655f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1665f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(
1675f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_OUT OMX_STRING cComponentName,
1685f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_U32 nNameLength,
1695f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_U32 nIndex)
1705f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1719b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    CModule *cmodule;
1729b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    ComponentBase *cbase;
1739b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    struct list *entry;
1749b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    OMX_STRING cname;
1759b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1769b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_lock(&g_module_lock);
1779b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    entry = __list_entry(g_module_list, nIndex);
1789b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    if (!entry) {
1799b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        pthread_mutex_unlock(&g_module_lock);
1809b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        return OMX_ErrorNoMore;
1819b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    }
1829b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
1839b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1849b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    cmodule = static_cast<CModule *>(entry->data);
18515f26c4a309c9a2ad12dec562a67116c0a240936Ho-Eun Ryu    cname = cmodule->GetComponentName();
1869b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1879b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    strncpy(cComponentName, cname, nNameLength);
188bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
1893f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywan    LOGV("%s(): found %u th component %s", __FUNCTION__, nIndex, cname);
1909b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    return OMX_ErrorNone;
1915f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1925f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1935f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle(
1945f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_OUT OMX_HANDLETYPE* pHandle,
1955f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_STRING cComponentName,
1965f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_PTR pAppData,
1975f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_CALLBACKTYPE *pCallBacks)
1985f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1996f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    struct list *entry;
200270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    OMX_ERRORTYPE ret;
2016f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
202bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGV("%s(): enter, try to get %s", __FUNCTION__, cComponentName);
203bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
2046f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    pthread_mutex_lock(&g_module_lock);
2056f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    list_foreach(g_module_list, entry) {
2066f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        CModule *cmodule;
207270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu        OMX_STRING cname;
2086f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
2096f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        cmodule = static_cast<CModule *>(entry->data);
2106f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
211270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu        cname = cmodule->GetComponentName();
212270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu        if (!strcmp(cComponentName, cname)) {
213270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu            ComponentBase *cbase = NULL;
2143739d03aa380db0d809c6acf7968c629e769b0c2Ho-Eun Ryu
215aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu            ret = cmodule->Load(MODULE_NOW);
216bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            if (ret != OMX_ErrorNone) {
217bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                LOGE("%s(): exit failure, cmodule->Load failed\n",
218bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                     __FUNCTION__);
2199a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu                goto unlock_list;
220bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            }
221270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu
222270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu            ret = cmodule->InstantiateComponent(&cbase);
223bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            if (ret != OMX_ErrorNone){
224bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                LOGE("%s(): exit failure, cmodule->Instantiate failed\n",
225bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                     __FUNCTION__);
2269a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu                goto unload_cmodule;
227bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            }
2289a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu
2299a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu            ret = cbase->GetHandle(pHandle, pAppData, pCallBacks);
230bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            if (ret != OMX_ErrorNone) {
231bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                LOGE("%s(): exit failure, cbase->GetHandle failed\n",
232bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                     __FUNCTION__);
2339a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu                goto delete_cbase;
234bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            }
2359a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu
236270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu            cbase->SetCModule(cmodule);
237270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu
2389a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu            g_nr_instances++;
2396f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu            pthread_mutex_unlock(&g_module_lock);
240bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
241bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            LOGI("get handle of component %s successfully", cComponentName);
242bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            LOGV("%s(): exit done\n", __FUNCTION__);
2439a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu            return OMX_ErrorNone;
2449a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu
2459a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu        delete_cbase:
2469a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu            delete cbase;
2479a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu        unload_cmodule:
2489a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu            cmodule->Unload();
2499a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu        unlock_list:
2509a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu            pthread_mutex_unlock(&g_module_lock);
251bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
252bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            LOGE("%s(): exit failure, (ret : 0x%08x)\n", __FUNCTION__, ret);
2539a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu            return ret;
2546f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        }
2556f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    }
2566f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
2576f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
258bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGE("%s(): exit failure, %s not found", __FUNCTION__, cComponentName);
2596f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    return OMX_ErrorInvalidComponent;
2605f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
2615f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
2625f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle(
2635f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_HANDLETYPE hComponent)
2645f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
2656f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    ComponentBase *cbase;
266270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    CModule *cmodule;
267270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    OMX_ERRORTYPE ret;
268bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    char cname[OMX_MAX_STRINGNAME_SIZE];
2696f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
2706f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    if (!hComponent)
2716f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        return OMX_ErrorBadParameter;
2726f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
2736f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    cbase = static_cast<ComponentBase *>
2746f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate);
275bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    if (!cbase) {
276bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu        LOGE("%s(): exit failure, cannot find cbase pointer\n",
277bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu             __FUNCTION__);
2786f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        return OMX_ErrorBadParameter;
279bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    }
280bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    strcpy(&cname[0], cbase->GetName());
281bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
282bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGV("%s(): enter, try to free %s", __FUNCTION__, cbase->GetName());
283bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
2846f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
285270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    ret = cbase->FreeHandle(hComponent);
286270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    if (ret != OMX_ErrorNone) {
287bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu        LOGE("%s(): exit failure, cbase->FreeHandle() failed (ret = 0x%08x)\n",
288bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu             __FUNCTION__, ret);
289270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu        return ret;
290270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    }
291270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu
2929a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu    pthread_mutex_lock(&g_module_lock);
2939a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu    g_nr_instances--;
2949a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
2959a02e273568833f7f87151227c44dbaf77c3de87Ho-Eun Ryu
296270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    cmodule = cbase->GetCModule();
297f5d697d33a0ea9889e63672fbbd062fd5ca3789cHo-Eun Ryu    if (!cmodule)
298270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu        LOGE("fatal error, %s does not have cmodule\n", cbase->GetName());
299270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu
300270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    delete cbase;
301f5d697d33a0ea9889e63672fbbd062fd5ca3789cHo-Eun Ryu
302f5d697d33a0ea9889e63672fbbd062fd5ca3789cHo-Eun Ryu    if (cmodule)
303f5d697d33a0ea9889e63672fbbd062fd5ca3789cHo-Eun Ryu        cmodule->Unload();
304f5d697d33a0ea9889e63672fbbd062fd5ca3789cHo-Eun Ryu
305bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGI("free handle of component %s successfully", cname);
306bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu    LOGV("%s(): exit done", __FUNCTION__);
307270c00d100c3fd6f1313e478f2d568c378399e22Ho-Eun Ryu    return OMX_ErrorNone;
3085f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
3095f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
3105f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole (
3115f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_STRING role,
3125f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_INOUT OMX_U32 *pNumComps,
3135f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_INOUT OMX_U8  **compNames)
3145f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
3159b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    struct list *entry;
3169b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    OMX_U32 nr_comps = 0, copied_nr_comps = 0;
3179b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
3189b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_lock(&g_module_lock);
3199b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    list_foreach(g_module_list, entry) {
3209b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        CModule *cmodule;
3219b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        OMX_STRING cname;
3229b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        bool having_role;
3239b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
3249b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        cmodule = static_cast<CModule *>(entry->data);
3259b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
326103aec6ed1456b43659800de1854c3d9f384deceHo-Eun Ryu        having_role = cmodule->QueryHavingThisRole(role);
3279b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        if (having_role) {
3289b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            if (compNames && compNames[nr_comps]) {
329103aec6ed1456b43659800de1854c3d9f384deceHo-Eun Ryu                cname = cmodule->GetComponentName();
3309b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu                strncpy((OMX_STRING)&compNames[nr_comps][0], cname,
3319b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu                        OMX_MAX_STRINGNAME_SIZE);
3329b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu                copied_nr_comps++;
333bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                LOGV("%s(): component %s has %s role", __FUNCTION__,
334bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                     cname, role);
3359b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            }
3369b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            nr_comps++;
3379b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        }
3389b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    }
3399b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
3409b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
3419b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    if (!copied_nr_comps)
3429b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        *pNumComps = nr_comps;
3439b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    else {
3449b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        if (copied_nr_comps != *pNumComps)
3459b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            return OMX_ErrorBadParameter;
3469b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    }
3479b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
3489b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    return OMX_ErrorNone;
3495f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
3505f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
3515f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent (
3525f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_STRING compName,
3535f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_INOUT OMX_U32 *pNumRoles,
3545f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_OUT OMX_U8 **roles)
3555f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
3569b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    struct list *entry;
3579b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
3589b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_lock(&g_module_lock);
3599b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    list_foreach(g_module_list, entry) {
3609b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        CModule *cmodule;
3619b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        ComponentBase *cbase;
3629b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        OMX_STRING cname;
363bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu        OMX_ERRORTYPE ret;
3649b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
3659b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        cmodule = static_cast<CModule *>(entry->data);
3669b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
367103aec6ed1456b43659800de1854c3d9f384deceHo-Eun Ryu        cname = cmodule->GetComponentName();
3689b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        if (!strcmp(compName, cname)) {
3699b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            pthread_mutex_unlock(&g_module_lock);
370bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu#if LOG_NDEBUG
371103aec6ed1456b43659800de1854c3d9f384deceHo-Eun Ryu            return cmodule->GetComponentRoles(pNumRoles, roles);
372bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu#else
373bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            ret = cmodule->GetComponentRoles(pNumRoles, roles);
374bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            if (ret != OMX_ErrorNone) {
375bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                OMX_U32 i;
376bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu
377bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                for (i = 0; i < *pNumRoles; i++) {
378bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                    LOGV("%s(): component %s has %s role", __FUNCTION__,
379bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                         compName, &roles[i][0]);
380bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu                }
381bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            }
382bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu            return ret;
383bda0aed55a4fa0b0a610ee40f378ce800fa3e067Ho-Eun Ryu#endif
3849b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        }
3859b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    }
3869b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
3879b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
3889b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    return OMX_ErrorInvalidComponent;
3895f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
390