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