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