15d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber/* 25d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * Copyright (C) 2009 The Android Open Source Project 3f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan * Copyright (c) 2014, The Linux Foundation. All rights reserved. 45d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * 55d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 65d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * you may not use this file except in compliance with the License. 75d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * You may obtain a copy of the License at 85d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * 95d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 105d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * 115d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * Unless required by applicable law or agreed to in writing, software 125d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 135d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * See the License for the specific language governing permissions and 155d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * limitations under the License. 165d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber */ 175d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 185d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber#include "QComOMXPlugin.h" 195d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 205d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber#include <dlfcn.h> 215d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <media/hardware/HardwareAPI.h> 235d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 245d9d41d3f964e47886a87435b841def04418f5a8Andreas Hubernamespace android { 255d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 265d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMXPluginBase *createOMXPlugin() { 275d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber return new QComOMXPlugin; 285d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber} 295d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 305d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberQComOMXPlugin::QComOMXPlugin() 315d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber : mLibHandle(dlopen("libOmxCore.so", RTLD_NOW)), 325d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mInit(NULL), 335d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mDeinit(NULL), 345d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mComponentNameEnum(NULL), 355d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mGetHandle(NULL), 365d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mFreeHandle(NULL), 375d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mGetRolesOfComponentHandle(NULL) { 385d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber if (mLibHandle != NULL) { 395d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mInit = (InitFunc)dlsym(mLibHandle, "OMX_Init"); 4057d7e714e312fb07af793075526ba2ed83db0d9bHaynes Mathew George mDeinit = (DeinitFunc)dlsym(mLibHandle, "OMX_Deinit"); 415d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 425d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mComponentNameEnum = 435d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber (ComponentNameEnumFunc)dlsym(mLibHandle, "OMX_ComponentNameEnum"); 445d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 455d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "OMX_GetHandle"); 465d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "OMX_FreeHandle"); 475d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 485d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mGetRolesOfComponentHandle = 495d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber (GetRolesOfComponentFunc)dlsym( 505d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mLibHandle, "OMX_GetRolesOfComponent"); 515d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 52f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan if (!mInit || !mDeinit || !mComponentNameEnum || !mGetHandle || 53f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan !mFreeHandle || !mGetRolesOfComponentHandle) { 54f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan dlclose(mLibHandle); 55f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan mLibHandle = NULL; 56f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan } else 575d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber (*mInit)(); 585d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 595d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber} 605d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 615d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberQComOMXPlugin::~QComOMXPlugin() { 625d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber if (mLibHandle != NULL) { 635d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber (*mDeinit)(); 645d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 655d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber dlclose(mLibHandle); 665d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber mLibHandle = NULL; 675d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 685d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber} 695d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 705d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMX_ERRORTYPE QComOMXPlugin::makeComponentInstance( 715d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber const char *name, 725d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber const OMX_CALLBACKTYPE *callbacks, 735d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_PTR appData, 745d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_COMPONENTTYPE **component) { 755d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber if (mLibHandle == NULL) { 765d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber return OMX_ErrorUndefined; 775d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 785d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 795d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber return (*mGetHandle)( 805d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber reinterpret_cast<OMX_HANDLETYPE *>(component), 815d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber const_cast<char *>(name), 825d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber appData, const_cast<OMX_CALLBACKTYPE *>(callbacks)); 835d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber} 845d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 855d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMX_ERRORTYPE QComOMXPlugin::destroyComponentInstance( 865d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_COMPONENTTYPE *component) { 875d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber if (mLibHandle == NULL) { 885d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber return OMX_ErrorUndefined; 895d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 905d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 915d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component)); 925d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber} 935d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 945d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMX_ERRORTYPE QComOMXPlugin::enumerateComponents( 955d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_STRING name, 965d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber size_t size, 975d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_U32 index) { 985d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber if (mLibHandle == NULL) { 995d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber return OMX_ErrorUndefined; 1005d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 1015d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return (*mComponentNameEnum)(name, size, index); 1035d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber} 1045d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1055d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent( 1065d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber const char *name, 1075d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber Vector<String8> *roles) { 1085d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber roles->clear(); 1095d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1105d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber if (mLibHandle == NULL) { 1115d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber return OMX_ErrorUndefined; 1125d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 1135d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1145d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_U32 numRoles; 1155d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)( 1165d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber const_cast<OMX_STRING>(name), &numRoles, NULL); 1175d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1185d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber if (err != OMX_ErrorNone) { 1195d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber return err; 1205d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 1215d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1225d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber if (numRoles > 0) { 1235d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_U8 **array = new OMX_U8 *[numRoles]; 1245d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber for (OMX_U32 i = 0; i < numRoles; ++i) { 1255d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE]; 1265d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 1275d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1285d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber OMX_U32 numRoles2; 1295d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber err = (*mGetRolesOfComponentHandle)( 1305d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber const_cast<OMX_STRING>(name), &numRoles2, array); 1315d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (err != OMX_ErrorNone) { 133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return err; 134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev 136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev if (numRoles2 != numRoles) { 137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return err; 138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev } 1395d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1405d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber for (OMX_U32 i = 0; i < numRoles; ++i) { 141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev String8 s((const char *)array[i]); 142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev roles->push(s); 1435d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1445d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber delete[] array[i]; 1455d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber array[i] = NULL; 1465d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 1475d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1485d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber delete[] array; 1495d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber array = NULL; 1505d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber } 1515d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev return OMX_ErrorNone; 1535d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber} 1545d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber 1555d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber} // namespace android 156