117e995d39771569792c528f3dea559c83f0fc238Andreas Huber/* 217e995d39771569792c528f3dea559c83f0fc238Andreas Huber * Copyright (C) 2009 The Android Open Source Project 317e995d39771569792c528f3dea559c83f0fc238Andreas Huber * 417e995d39771569792c528f3dea559c83f0fc238Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 517e995d39771569792c528f3dea559c83f0fc238Andreas Huber * you may not use this file except in compliance with the License. 617e995d39771569792c528f3dea559c83f0fc238Andreas Huber * You may obtain a copy of the License at 717e995d39771569792c528f3dea559c83f0fc238Andreas Huber * 817e995d39771569792c528f3dea559c83f0fc238Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 917e995d39771569792c528f3dea559c83f0fc238Andreas Huber * 1017e995d39771569792c528f3dea559c83f0fc238Andreas Huber * Unless required by applicable law or agreed to in writing, software 1117e995d39771569792c528f3dea559c83f0fc238Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1217e995d39771569792c528f3dea559c83f0fc238Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1317e995d39771569792c528f3dea559c83f0fc238Andreas Huber * See the License for the specific language governing permissions and 1417e995d39771569792c528f3dea559c83f0fc238Andreas Huber * limitations under the License. 1517e995d39771569792c528f3dea559c83f0fc238Andreas Huber */ 1617e995d39771569792c528f3dea559c83f0fc238Andreas Huber 1717e995d39771569792c528f3dea559c83f0fc238Andreas Huber#include "TIOMXPlugin.h" 1817e995d39771569792c528f3dea559c83f0fc238Andreas Huber 1917e995d39771569792c528f3dea559c83f0fc238Andreas Huber#include <dlfcn.h> 2017e995d39771569792c528f3dea559c83f0fc238Andreas Huber 2117e995d39771569792c528f3dea559c83f0fc238Andreas Huber#include <media/stagefright/HardwareAPI.h> 226239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber#include <media/stagefright/MediaDebug.h> 2317e995d39771569792c528f3dea559c83f0fc238Andreas Huber 2417e995d39771569792c528f3dea559c83f0fc238Andreas Hubernamespace android { 2517e995d39771569792c528f3dea559c83f0fc238Andreas Huber 2617e995d39771569792c528f3dea559c83f0fc238Andreas HuberOMXPluginBase *createOMXPlugin() { 2717e995d39771569792c528f3dea559c83f0fc238Andreas Huber return new TIOMXPlugin; 2817e995d39771569792c528f3dea559c83f0fc238Andreas Huber} 2917e995d39771569792c528f3dea559c83f0fc238Andreas Huber 3017e995d39771569792c528f3dea559c83f0fc238Andreas HuberTIOMXPlugin::TIOMXPlugin() 3117e995d39771569792c528f3dea559c83f0fc238Andreas Huber : mLibHandle(dlopen("libOMX_Core.so", RTLD_NOW)), 3217e995d39771569792c528f3dea559c83f0fc238Andreas Huber mInit(NULL), 3317e995d39771569792c528f3dea559c83f0fc238Andreas Huber mDeinit(NULL), 3417e995d39771569792c528f3dea559c83f0fc238Andreas Huber mComponentNameEnum(NULL), 35f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber mGetHandle(NULL), 366239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber mFreeHandle(NULL), 376239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber mGetRolesOfComponentHandle(NULL) { 3817e995d39771569792c528f3dea559c83f0fc238Andreas Huber if (mLibHandle != NULL) { 3917e995d39771569792c528f3dea559c83f0fc238Andreas Huber mInit = (InitFunc)dlsym(mLibHandle, "TIOMX_Init"); 4017e995d39771569792c528f3dea559c83f0fc238Andreas Huber mDeinit = (DeinitFunc)dlsym(mLibHandle, "TIOMX_DeInit"); 4117e995d39771569792c528f3dea559c83f0fc238Andreas Huber 4217e995d39771569792c528f3dea559c83f0fc238Andreas Huber mComponentNameEnum = 4317e995d39771569792c528f3dea559c83f0fc238Andreas Huber (ComponentNameEnumFunc)dlsym(mLibHandle, "TIOMX_ComponentNameEnum"); 4417e995d39771569792c528f3dea559c83f0fc238Andreas Huber 4517e995d39771569792c528f3dea559c83f0fc238Andreas Huber mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "TIOMX_GetHandle"); 46f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "TIOMX_FreeHandle"); 4717e995d39771569792c528f3dea559c83f0fc238Andreas Huber 486239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber mGetRolesOfComponentHandle = 496239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber (GetRolesOfComponentFunc)dlsym( 506239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber mLibHandle, "TIOMX_GetRolesOfComponent"); 516239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 5217e995d39771569792c528f3dea559c83f0fc238Andreas Huber (*mInit)(); 5317e995d39771569792c528f3dea559c83f0fc238Andreas Huber } 5417e995d39771569792c528f3dea559c83f0fc238Andreas Huber} 5517e995d39771569792c528f3dea559c83f0fc238Andreas Huber 5617e995d39771569792c528f3dea559c83f0fc238Andreas HuberTIOMXPlugin::~TIOMXPlugin() { 5717e995d39771569792c528f3dea559c83f0fc238Andreas Huber if (mLibHandle != NULL) { 5817e995d39771569792c528f3dea559c83f0fc238Andreas Huber (*mDeinit)(); 5917e995d39771569792c528f3dea559c83f0fc238Andreas Huber 6017e995d39771569792c528f3dea559c83f0fc238Andreas Huber dlclose(mLibHandle); 6117e995d39771569792c528f3dea559c83f0fc238Andreas Huber mLibHandle = NULL; 6217e995d39771569792c528f3dea559c83f0fc238Andreas Huber } 6317e995d39771569792c528f3dea559c83f0fc238Andreas Huber} 6417e995d39771569792c528f3dea559c83f0fc238Andreas Huber 6517e995d39771569792c528f3dea559c83f0fc238Andreas HuberOMX_ERRORTYPE TIOMXPlugin::makeComponentInstance( 6617e995d39771569792c528f3dea559c83f0fc238Andreas Huber const char *name, 6717e995d39771569792c528f3dea559c83f0fc238Andreas Huber const OMX_CALLBACKTYPE *callbacks, 6817e995d39771569792c528f3dea559c83f0fc238Andreas Huber OMX_PTR appData, 6917e995d39771569792c528f3dea559c83f0fc238Andreas Huber OMX_COMPONENTTYPE **component) { 7017e995d39771569792c528f3dea559c83f0fc238Andreas Huber if (mLibHandle == NULL) { 7117e995d39771569792c528f3dea559c83f0fc238Andreas Huber return OMX_ErrorUndefined; 7217e995d39771569792c528f3dea559c83f0fc238Andreas Huber } 7317e995d39771569792c528f3dea559c83f0fc238Andreas Huber 7417e995d39771569792c528f3dea559c83f0fc238Andreas Huber return (*mGetHandle)( 7517e995d39771569792c528f3dea559c83f0fc238Andreas Huber reinterpret_cast<OMX_HANDLETYPE *>(component), 7617e995d39771569792c528f3dea559c83f0fc238Andreas Huber const_cast<char *>(name), 7717e995d39771569792c528f3dea559c83f0fc238Andreas Huber appData, const_cast<OMX_CALLBACKTYPE *>(callbacks)); 7817e995d39771569792c528f3dea559c83f0fc238Andreas Huber} 7917e995d39771569792c528f3dea559c83f0fc238Andreas Huber 80f40810585b61295f84d7d6b4e63ef935222bf18eAndreas HuberOMX_ERRORTYPE TIOMXPlugin::destroyComponentInstance( 81f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber OMX_COMPONENTTYPE *component) { 82f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber if (mLibHandle == NULL) { 83f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber return OMX_ErrorUndefined; 84f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber } 85f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber 86f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component)); 87f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber} 88f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber 8917e995d39771569792c528f3dea559c83f0fc238Andreas HuberOMX_ERRORTYPE TIOMXPlugin::enumerateComponents( 9017e995d39771569792c528f3dea559c83f0fc238Andreas Huber OMX_STRING name, 9117e995d39771569792c528f3dea559c83f0fc238Andreas Huber size_t size, 9217e995d39771569792c528f3dea559c83f0fc238Andreas Huber OMX_U32 index) { 9317e995d39771569792c528f3dea559c83f0fc238Andreas Huber if (mLibHandle == NULL) { 9417e995d39771569792c528f3dea559c83f0fc238Andreas Huber return OMX_ErrorUndefined; 9517e995d39771569792c528f3dea559c83f0fc238Andreas Huber } 9617e995d39771569792c528f3dea559c83f0fc238Andreas Huber 9717e995d39771569792c528f3dea559c83f0fc238Andreas Huber return (*mComponentNameEnum)(name, size, index); 9817e995d39771569792c528f3dea559c83f0fc238Andreas Huber} 9917e995d39771569792c528f3dea559c83f0fc238Andreas Huber 1006239f8a9287b511c2a7e417979ca5299a15436bcAndreas HuberOMX_ERRORTYPE TIOMXPlugin::getRolesOfComponent( 1016239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber const char *name, 1026239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber Vector<String8> *roles) { 1036239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber roles->clear(); 1046239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1056239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber if (mLibHandle == NULL) { 1066239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber return OMX_ErrorUndefined; 1076239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber } 1086239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1096239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber OMX_U32 numRoles; 1106239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)( 1116239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber const_cast<OMX_STRING>(name), &numRoles, NULL); 1126239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1136239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber if (err != OMX_ErrorNone) { 1146239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber return err; 1156239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber } 1166239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1176239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber if (numRoles > 0) { 1186239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber OMX_U8 **array = new OMX_U8 *[numRoles]; 1196239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber for (OMX_U32 i = 0; i < numRoles; ++i) { 1206239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE]; 1216239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber } 1226239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1236239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber OMX_U32 numRoles2; 1246239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber err = (*mGetRolesOfComponentHandle)( 1256239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber const_cast<OMX_STRING>(name), &numRoles2, array); 1266239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1276239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber CHECK_EQ(err, OMX_ErrorNone); 1286239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber CHECK_EQ(numRoles, numRoles2); 1296239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1306239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber for (OMX_U32 i = 0; i < numRoles; ++i) { 1316239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber String8 s((const char *)array[i]); 1326239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber roles->push(s); 1336239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1346239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber delete[] array[i]; 1356239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber array[i] = NULL; 1366239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber } 1376239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1386239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber delete[] array; 1396239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber array = NULL; 1406239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber } 1416239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 1426239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber return OMX_ErrorNone; 1436239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber} 1446239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber 14517e995d39771569792c528f3dea559c83f0fc238Andreas Huber} // namespace android 146