125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang/* 225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Copyright (C) 2012 Intel Corporation. All rights reserved. 325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Licensed under the Apache License, Version 2.0 (the "License"); 525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * you may not use this file except in compliance with the License. 625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * You may obtain a copy of the License at 725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * http://www.apache.org/licenses/LICENSE-2.0 925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 1025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * Unless required by applicable law or agreed to in writing, software 1125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * distributed under the License is distributed on an "AS IS" BASIS, 1225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * See the License for the specific language governing permissions and 1425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * limitations under the License. 1525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * 1625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */ 1725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 18ce70dcd9a00883626adc4def15776639428625d9Dan Albert#include <inttypes.h> 19ce70dcd9a00883626adc4def15776639428625d9Dan Albert 2025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <OMX_Core.h> 2125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <OMX_Component.h> 2225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include <dlfcn.h> 2325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 2425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_omxcore.h" 2525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_omxcomponent.h" 2625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#include "isv_profile.h" 2725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 289042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang#include "OMX_adaptor.h" 299042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 3025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang//#define LOG_NDEBUG 0 3125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#undef LOG_TAG 3225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define LOG_TAG "isv-omxil" 3325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 3425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define WRS_CORE_NAME "libwrs_omxil_core_pvwrapped.so" 3525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define CORE_NUMBER 1 3625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef USE_MEDIASDK 3725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define MSDK_CORE_NAME "libmfx_omx_core.so" 3825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#undef CORE_NUMBER 3925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#define CORE_NUMBER 2 4025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 4125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 4225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 4325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangusing namespace android; 4425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 4525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatic unsigned int g_initialized = 0; 4625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatic unsigned int g_nr_instances = 0; 4725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatic unsigned int g_nr_comp = 0; 4825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 4925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatic pthread_mutex_t g_module_lock = PTHREAD_MUTEX_INITIALIZER; 5025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatic ISVOMXCore g_cores[CORE_NUMBER]; 5125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wangstatic Vector<ISVComponent*> g_isv_components; 5225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 539042795f805dffc0be5b900df3e42fe32ae61349Yuanjun HuangMRM_OMX_Adaptor* g_mrm_omx_adaptor = NULL; 549042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 5525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang/********************************************************************************** 5625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang * core entry 5725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang */ 5825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 5925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void) 6025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 6125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang int ret; 6225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: enter", __func__); 6325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 6425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_lock(&g_module_lock); 6525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (!g_initialized) { 6625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (OMX_U32 i = 0; i < CORE_NUMBER; i++) { 6725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 6825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang void* libHandle = NULL; 6925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (i == 0) 7025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang libHandle = dlopen(WRS_CORE_NAME, RTLD_LAZY); 7125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#ifdef USE_MEDIASDK 7225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang else 7325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang libHandle = dlopen(MSDK_CORE_NAME, RTLD_LAZY); 7425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang#endif 7525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (libHandle != NULL) { 7625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_cores[i].mLibHandle = libHandle; 7725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_cores[i].mInit = (ISVOMXCore::InitFunc)dlsym(libHandle, "OMX_Init"); 7825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_cores[i].mDeinit = (ISVOMXCore::DeinitFunc)dlsym(libHandle, "OMX_Deinit"); 7925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 8025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_cores[i].mComponentNameEnum = 8125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang (ISVOMXCore::ComponentNameEnumFunc)dlsym(libHandle, "OMX_ComponentNameEnum"); 8225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 8325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_cores[i].mGetHandle = (ISVOMXCore::GetHandleFunc)dlsym(libHandle, "OMX_GetHandle"); 8425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_cores[i].mFreeHandle = (ISVOMXCore::FreeHandleFunc)dlsym(libHandle, "OMX_FreeHandle"); 8525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 8625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_cores[i].mGetRolesOfComponentHandle = 8725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang (ISVOMXCore::GetRolesOfComponentFunc)dlsym( 8825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang libHandle, "OMX_GetRolesOfComponent"); 8925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (g_cores[i].mInit != NULL) { 9025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang (*(g_cores[i].mInit))(); 9125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 9225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (g_cores[i].mComponentNameEnum != NULL) { 9325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // calculating number of components registered inside given OMX core 9425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang char tmpComponentName[OMX_MAX_STRINGNAME_SIZE] = { 0 }; 9525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_U32 tmpIndex = 0; 9625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang while (OMX_ErrorNone == ((*(g_cores[i].mComponentNameEnum))(tmpComponentName, OMX_MAX_STRINGNAME_SIZE, tmpIndex))) { 9725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang tmpIndex++; 9825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "OMX IL core: declares component %s", tmpComponentName); 9925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 10025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_cores[i].mNumComponents = tmpIndex; 10125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_nr_comp += g_cores[i].mNumComponents; 102ce70dcd9a00883626adc4def15776639428625d9Dan Albert ALOGD_IF(ISV_CORE_DEBUG, 103ce70dcd9a00883626adc4def15776639428625d9Dan Albert "OMX IL core: contains %" PRIu32 " components", 104ce70dcd9a00883626adc4def15776639428625d9Dan Albert g_cores[i].mNumComponents); 10525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 10625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } else { 10725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 10825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGW("OMX IL core not found"); 10925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 11025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 1119042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang g_mrm_omx_adaptor = MRM_OMX_Adaptor::getInstance(); 1129042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang g_mrm_omx_adaptor->MRM_OMX_Init(); 11325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_initialized = 1; 11425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 11525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 11625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 11725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: exit done", __func__); 11825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNone; 11925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 12025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 12125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void) 12225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 12325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: enter", __func__); 12425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_ERRORTYPE ret = OMX_ErrorNone; 12525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 12625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGV("%s: enter", __func__); 12725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (g_initialized == 0) 12825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNone; 12925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 13025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_lock(&g_module_lock); 13125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (OMX_U32 i = 0; i < CORE_NUMBER; i++) { 13225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (g_cores[i].mDeinit != NULL) { 13325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang (*(g_cores[i].mDeinit))(); 13425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 13525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 13625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 13725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 1389042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (g_mrm_omx_adaptor != NULL) { 1399042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang g_mrm_omx_adaptor = NULL; 1409042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 1419042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 14225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_initialized = 0; 14325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 14425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: exit %d", __func__, ret); 14525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return ret; 14625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 14725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 14825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum( 14925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_OUT OMX_STRING cComponentName, 15025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_U32 nNameLength, 15125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_U32 nIndex) 15225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 15325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: enter", __func__); 15425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_lock(&g_module_lock); 15525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_U32 relativeIndex = nIndex; 15625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (nIndex >= g_nr_comp) { 15725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 15825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: exit done", __func__); 15925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNoMore; 16025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 16125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 16225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (OMX_U32 i = 0; i < CORE_NUMBER; i++) { 16325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (g_cores[i].mLibHandle == NULL) { 16425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang continue; 16525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 16625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (relativeIndex < g_cores[i].mNumComponents) { 16725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 168ce70dcd9a00883626adc4def15776639428625d9Dan Albert ALOGD_IF(ISV_CORE_DEBUG, "%s: found %" PRIu32 "th component %s", 169ce70dcd9a00883626adc4def15776639428625d9Dan Albert __func__, nIndex, cComponentName); 17025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return ((*(g_cores[i].mComponentNameEnum))(cComponentName, nNameLength, relativeIndex)); 17125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } else relativeIndex -= g_cores[i].mNumComponents; 17225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 17325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 17425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: exit error!!!", __func__); 17525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorUndefined; 17625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 17725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 17825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle( 17925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_OUT OMX_HANDLETYPE* pHandle, 18025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_STRING cComponentName, 18125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_PTR pAppData, 18225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_CALLBACKTYPE *pCallBacks) 18325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 18425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang struct list *entry; 18525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_ERRORTYPE ret; 18625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_HANDLETYPE tempHandle; 18725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: enter, try to get %s", __func__, cComponentName); 18825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_lock(&g_module_lock); 18925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 19025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang // create a isv component instant 19125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ISVComponent *pISVComponent = new ISVComponent(pAppData); 19225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (!pISVComponent) { 19325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: failed to alloc isv omx component", __func__); 19425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 19525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorInsufficientResources; 19625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 19725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 19825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_CALLBACKTYPE *pISVCallBacks = pISVComponent->getCallBacks(pCallBacks); 19925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (!pISVCallBacks) { 20025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: failed to get isv callback functions", __func__); 20125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 20225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorInsufficientResources; 20325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 20425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 2059042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ret = g_mrm_omx_adaptor->MRM_OMX_CheckIfFullLoad(cComponentName); 2069042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang if (ret == OMX_ErrorInsufficientResources) { 2079042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang ALOGE("OMX_GetHandle failed. codec under full load status from media resource manager.\ 2089042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorInsufficientResources"); 2099042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang pthread_mutex_unlock(&g_module_lock); 2109042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang return OMX_ErrorInsufficientResources; 2119042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang } 2129042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 21325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang /* find the real component*/ 21425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (OMX_U32 i = 0; i < CORE_NUMBER; i++) { 21525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (g_cores[i].mLibHandle == NULL) { 21625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang continue; 21725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 21825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 21925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_ERRORTYPE omx_res = (*(g_cores[i].mGetHandle))( 22025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang &tempHandle, 22125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang const_cast<char *>(cComponentName), 22225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pAppData, pISVCallBacks); 22325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if(omx_res == OMX_ErrorNone) { 22425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pISVComponent->setComponent(static_cast<OMX_COMPONENTTYPE*>(tempHandle), &g_cores[i]); 22525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_isv_components.push_back(pISVComponent); 22625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *pHandle = pISVComponent->getBaseComponent(); 22725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 22825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: found component %s, pHandle %p", __func__, cComponentName, *pHandle); 2299042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 2309042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang // set component into media resource manager adaptor 2319042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang g_mrm_omx_adaptor->MRM_OMX_SetComponent(tempHandle, cComponentName); 2329042795f805dffc0be5b900df3e42fe32ae61349Yuanjun Huang 23325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 23425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNone; 235561efeaca796c47f53698038e2b527371095e0d4Yuanjun Huang } else if(omx_res == OMX_ErrorInsufficientResources) { 236561efeaca796c47f53698038e2b527371095e0d4Yuanjun Huang pthread_mutex_unlock(&g_module_lock); 237561efeaca796c47f53698038e2b527371095e0d4Yuanjun Huang delete pISVComponent; 238561efeaca796c47f53698038e2b527371095e0d4Yuanjun Huang pISVComponent = NULL; 239561efeaca796c47f53698038e2b527371095e0d4Yuanjun Huang return OMX_ErrorInsufficientResources; 24025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 24125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 24225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 24325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 24425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang delete pISVComponent; 24525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pISVComponent = NULL; 246d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s(): exit failure, %s not found", __func__, cComponentName); 24725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorInvalidComponent; 24825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 24925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 25025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle( 25125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_HANDLETYPE hComponent) 25225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 25325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_ERRORTYPE ret; 25425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 25525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: enter, try to free component hanle %p", __func__, hComponent); 25625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_lock(&g_module_lock); 25725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 25825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (OMX_U32 i = 0; i < g_isv_components.size(); i++) { 25925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ISVComponent *pComp = g_isv_components.itemAt(i); 26025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (static_cast<OMX_HANDLETYPE>(pComp->getBaseComponent()) == hComponent) { 2616f58f9a80b880616bafbc3782a95d44cf0bff950Joe Qi // remove it in media resource manager before call pComp->freeComponent 2626f58f9a80b880616bafbc3782a95d44cf0bff950Joe Qi g_mrm_omx_adaptor->MRM_OMX_RemoveComponent(pComp->getComponent()); 26325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_ERRORTYPE omx_res = pComp->freeComponent(); 26425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (omx_res != OMX_ErrorNone) { 26525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: free OMX handle %p failed", __func__, hComponent); 26625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 26725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return omx_res; 26825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 26925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang delete pComp; 27025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang g_isv_components.removeAt(i); 27125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: free component %p success", __func__, hComponent); 27225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 27325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNone; 27425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 27525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 27625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 27725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s(): exit failure, component %p not found", __func__, hComponent); 27825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorInvalidComponent; 27925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 28025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 28125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel( 28225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_HANDLETYPE __maybe_unused hOutput, 28325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_U32 __maybe_unused nPortOutput, 28425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_HANDLETYPE __maybe_unused hInput, 28525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_U32 __maybe_unused nPortInput) 28625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 28725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNotImplemented; 28825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 28925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 29025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_GetContentPipe( 29125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_OUT OMX_HANDLETYPE __maybe_unused *hPipe, 29225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_STRING __maybe_unused szURI) 29325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 29425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNotImplemented; 29525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 29625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 29725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole ( 29825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_STRING __maybe_unused role, 29925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_INOUT OMX_U32 __maybe_unused *pNumComps, 30025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_INOUT OMX_U8 __maybe_unused **compNames) 30125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 30225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: enter", __func__); 30325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNotImplemented; 30425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 30525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 30625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui WangOMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent ( 30725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_IN OMX_STRING compName, 30825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_INOUT OMX_U32 *pNumRoles, 30925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_OUT OMX_U8 **roles) 31025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang{ 31125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: enter", __func__); 31225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_lock(&g_module_lock); 31325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (OMX_U32 j = 0; j < CORE_NUMBER; j++) { 31425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (g_cores[j].mLibHandle == NULL) { 31525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang continue; 31625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 31725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 31825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_U32 numRoles; 31925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_ERRORTYPE err = (*(g_cores[j].mGetRolesOfComponentHandle))( 32025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang const_cast<OMX_STRING>(compName), &numRoles, NULL); 32125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 32225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (err != OMX_ErrorNone) { 32325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang continue; 32425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 32525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 32625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (numRoles > 0) { 32725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_U8 **array = new OMX_U8 *[numRoles]; 32825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (OMX_U32 i = 0; i < numRoles; ++i) { 32925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE]; 33025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 33125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 33225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang OMX_U32 numRoles2 = numRoles; 33325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang err = (*(g_cores[j].mGetRolesOfComponentHandle))( 33425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang const_cast<OMX_STRING>(compName), &numRoles2, array); 33525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 33625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang *pNumRoles = numRoles; 33725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang for (OMX_U32 i = 0; i < numRoles; i++) { 33825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang if (i < numRoles-1) 33925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang roles[i+1] = roles[i] + OMX_MAX_STRINGNAME_SIZE; 34025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 34125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang strncpy((OMX_STRING)&roles[i][0], 34225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang (const OMX_STRING)&array[i][0], OMX_MAX_STRINGNAME_SIZE); 34325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang delete[] array[i]; 34425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang array[i] = NULL; 34525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 34625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 34725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang delete[] array; 34825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang array = NULL; 34925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 35025b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 35125b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 35225b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGD_IF(ISV_CORE_DEBUG, "%s: exit done", __func__); 35325b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorNone; 35425b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang } 35525b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang pthread_mutex_unlock(&g_module_lock); 35625b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang 35725b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang ALOGE("%s: invalid component", __func__); 35825b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang return OMX_ErrorInvalidComponent; 35925b2a4f2f53ada7434b5c77d26a7e4f29aa85eddXigui Wang} 360d6acef05e41af96ff00f2c579e3f9c96cb1a0530Xigui Wang 361