wrs_omxcore.cpp revision a0953d19a863c0125b304774f9dcd7897c289e5f
15f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu/*
25f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu * Copyright (C) Wind River Systems
35f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu */
45f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
55f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <stdio.h>
65f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <stdlib.h>
75f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <string.h>
85f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
95f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <pthread.h>
105f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
115f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <OMX_Core.h>
125f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <OMX_Component.h>
135f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
145f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <list.h>
155f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <cmodule.h>
169b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu#include <componentbase.h>
175f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
185f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#define LOG_TAG "wrs_omxcore"
195f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu#include <log.h>
205f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
215f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryustatic unsigned int g_initialized = 0;
225f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
235f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryustatic struct list *g_module_list = NULL;
245f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryustatic pthread_mutex_t g_module_lock = PTHREAD_MUTEX_INITIALIZER;
255f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
265f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryustatic struct list *construct_components(const char *config_file_name)
275f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
285f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    FILE *config_file;
295f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    char library_name[OMX_MAX_STRINGNAME_SIZE];
305f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    char config_file_path[256];
315f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    struct list *head = NULL;
325f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
335f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    strncpy(config_file_path, "/etc/", 256);
345f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    strncat(config_file_path, config_file_name, 256);
355f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    config_file = fopen(config_file_path, "r");
365f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    if (!config_file) {
375f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        strncpy(config_file_path, "./", 256);
385f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        strncat(config_file_path, config_file_name, 256);
395f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        config_file = fopen(config_file_path, "r");
405f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        if (!config_file) {
415f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu            LOGE("not found file %s\n", config_file_name);
425f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu            return NULL;
435f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        }
445f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    }
455f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
465f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    while (fscanf(config_file, "%s", library_name) > 0) {
475f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        CModule *cmodule;
48a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        struct list *entry;
49a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        OMX_ERRORTYPE ret;
505f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
515f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        library_name[OMX_MAX_STRINGNAME_SIZE-1] = '\0';
525f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        cmodule = new CModule(&library_name[0]);
53a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (!cmodule)
54a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            continue;
55a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
565f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        LOGV("found component library %s\n", library_name);
575f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
58a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        ret = cmodule->Load();
59a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (ret != OMX_ErrorNone)
60a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            goto delete_cmodule;
61a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
62a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        ret = cmodule->QueryComponentName();
63a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (ret != OMX_ErrorNone)
64a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            goto unload_cmodule;
65a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
66a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        ret = cmodule->QueryComponentRoles();
67a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (ret != OMX_ErrorNone)
68a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            goto unload_cmodule;
69a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
70a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        entry = list_alloc(cmodule);
71a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        if (!entry)
72a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu            goto unload_cmodule;
73a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        head = __list_add_tail(head, entry);
74a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
75a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        cmodule->Unload();
76a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        LOGV("module %s:%s added to component list\n",
77a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu             cmodule->GetLibraryName(), cmodule->GetComponentName());
78a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
79a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        continue;
80a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu
81a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu    unload_cmodule:
82a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        cmodule->Unload();
83a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu    delete_cmodule:
84a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu        delete cmodule;
855f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    }
865f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
875f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    fclose(config_file);
885f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    return head;
895f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
905f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
91a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryustatic struct list *destruct_components(struct list *head)
925f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
935f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    struct list *entry, *next;
945f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
955f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    list_foreach_safe(head, entry, next) {
965f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        CModule *cmodule = static_cast<CModule *>(entry->data);
975f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
985f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        head = __list_delete(head, entry);
995f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        delete cmodule;
1005f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    }
1015f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
102a0953d19a863c0125b304774f9dcd7897c289e5fHo-Eun Ryu    return head;
1035f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1045f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1055f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void)
1065f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1075f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    int ret;
1085f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1095f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    pthread_mutex_lock(&g_module_lock);
1105f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    if (!g_initialized) {
1115f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        g_module_list = construct_components("wrs_omxil_components.cfg");
1125f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        if (!g_module_list) {
1135f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu            pthread_mutex_unlock(&g_module_lock);
1145f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu            return OMX_ErrorInsufficientResources;
1155f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        }
1165f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1175f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu        g_initialized = 1;
1185f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    }
1195f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
1205f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1215f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    return OMX_ErrorNone;
1225f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1235f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1245f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void)
1255f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1265f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    pthread_mutex_lock(&g_module_lock);
1275f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    destruct_components(g_module_list);
1285f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
1295f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1305f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    return OMX_ErrorNone;
1315f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1325f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1335f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(
1345f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_OUT OMX_STRING cComponentName,
1355f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_U32 nNameLength,
1365f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_U32 nIndex)
1375f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1389b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    CModule *cmodule;
1399b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    ComponentBase *cbase;
1409b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    struct list *entry;
1419b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    OMX_STRING cname;
1429b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1439b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_lock(&g_module_lock);
1449b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    entry = __list_entry(g_module_list, nIndex);
1459b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    if (!entry) {
1469b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        pthread_mutex_unlock(&g_module_lock);
1479b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        return OMX_ErrorNoMore;
1489b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    }
1499b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
1509b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1519b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    cmodule = static_cast<CModule *>(entry->data);
1529b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    cbase = static_cast<ComponentBase *>(cmodule->GetPrivData());
1539b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1549b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    cname = cbase->GetName();
1559b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    strncpy(cComponentName, cname, nNameLength);
1569b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
1579b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    return OMX_ErrorNone;
1585f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1595f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1605f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle(
1615f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_OUT OMX_HANDLETYPE* pHandle,
1625f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_STRING cComponentName,
1635f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_PTR pAppData,
1645f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_CALLBACKTYPE *pCallBacks)
1655f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1666f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    struct list *entry;
1676f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
1686f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    pthread_mutex_lock(&g_module_lock);
1696f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    list_foreach(g_module_list, entry) {
1706f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        CModule *cmodule;
1716f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        ComponentBase *cbase;
1726f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        OMX_STRING name;
1736f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
1746f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        cmodule = static_cast<CModule *>(entry->data);
1756f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        cbase = static_cast<ComponentBase *>(cmodule->GetPrivData());
1766f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
1776f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        name = cbase->GetName();
1786f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        if (!strcmp(cComponentName, name)) {
1796f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu            pthread_mutex_unlock(&g_module_lock);
1806f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu            return cbase->GetHandle(pHandle, pAppData, pCallBacks);
1816f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        }
1826f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    }
1836f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
1846f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
1856f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    return OMX_ErrorInvalidComponent;
1865f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
1875f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
1885f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle(
1895f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_HANDLETYPE hComponent)
1905f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
1916f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    ComponentBase *cbase;
1926f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
1936f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    if (!hComponent)
1946f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        return OMX_ErrorBadParameter;
1956f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
1966f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    cbase = static_cast<ComponentBase *>
1976f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        (((OMX_COMPONENTTYPE *)hComponent)->pComponentPrivate);
1986f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    if (!cbase)
1996f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu        return OMX_ErrorBadParameter;
2006f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu
2016f72f05f17977a2fe36c78e96e720ef4d48a574fHo-Eun Ryu    return cbase->FreeHandle(hComponent);
2025f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
2035f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
2045f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel(
2055f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_HANDLETYPE hOutput,
2065f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_U32 nPortOutput,
2075f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_HANDLETYPE hInput,
2085f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_U32 nPortInput)
2095f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
2105f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    return OMX_ErrorNotImplemented;
2115f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
2125f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
2135f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE   OMX_GetContentPipe(
2145f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_OUT OMX_HANDLETYPE *hPipe,
2155f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_STRING szURI)
2165f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
2175f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    return OMX_ErrorNotImplemented;
2185f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
2195f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
2205f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole (
2215f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_STRING role,
2225f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_INOUT OMX_U32 *pNumComps,
2235f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_INOUT OMX_U8  **compNames)
2245f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
2259b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    struct list *entry;
2269b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    OMX_U32 nr_comps = 0, copied_nr_comps = 0;
2279b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2289b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_lock(&g_module_lock);
2299b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    list_foreach(g_module_list, entry) {
2309b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        CModule *cmodule;
2319b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        ComponentBase *cbase;
2329b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        OMX_STRING cname;
2339b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        bool having_role;
2349b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2359b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        cmodule = static_cast<CModule *>(entry->data);
2369b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        cbase = static_cast<ComponentBase *>(cmodule->GetPrivData());
2379b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2389b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        having_role = cbase->QueryHavingThisRole(role);
2399b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        if (having_role) {
2409b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            if (compNames && compNames[nr_comps]) {
2419b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu                cname = cbase->GetName();
2429b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu                strncpy((OMX_STRING)&compNames[nr_comps][0], cname,
2439b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu                        OMX_MAX_STRINGNAME_SIZE);
2449b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu                copied_nr_comps++;
2459b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            }
2469b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            nr_comps++;
2479b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        }
2489b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    }
2499b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
2509b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2519b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    if (!copied_nr_comps)
2529b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        *pNumComps = nr_comps;
2539b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    else {
2549b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        if (copied_nr_comps != *pNumComps)
2559b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            return OMX_ErrorBadParameter;
2569b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    }
2579b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2589b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    return OMX_ErrorNone;
2595f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
2605f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu
2615f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun RyuOMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent (
2625f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_IN OMX_STRING compName,
2635f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_INOUT OMX_U32 *pNumRoles,
2645f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu    OMX_OUT OMX_U8 **roles)
2655f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu{
2669b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    struct list *entry;
2679b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2689b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_lock(&g_module_lock);
2699b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    list_foreach(g_module_list, entry) {
2709b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        CModule *cmodule;
2719b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        ComponentBase *cbase;
2729b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        OMX_STRING cname;
2739b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2749b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        cmodule = static_cast<CModule *>(entry->data);
2759b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        cbase = static_cast<ComponentBase *>(cmodule->GetPrivData());
2769b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2779b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        cname = cbase->GetName();
2789b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        if (!strcmp(compName, cname)) {
2799b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            pthread_mutex_unlock(&g_module_lock);
2809b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu            return cbase->GetRolesOfComponent(pNumRoles, roles);
2819b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu        }
2829b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    }
2839b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    pthread_mutex_unlock(&g_module_lock);
2849b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu
2859b88640fe94198cf3f03151136840b04014a0a7dHo-Eun Ryu    return OMX_ErrorInvalidComponent;
2865f9ba478fd89d66705e5ca7d2d66aa174c6bcd32Ho-Eun Ryu}
287