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