111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/* 211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Copyright (C) 2009 The Android Open Source Project 311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Copyright (c) 2014, The Linux Foundation. All rights reserved. 411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Licensed under the Apache License, Version 2.0 (the "License"); 611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * you may not use this file except in compliance with the License. 711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * You may obtain a copy of the License at 811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * http://www.apache.org/licenses/LICENSE-2.0 1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * 1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Unless required by applicable law or agreed to in writing, software 1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * distributed under the License is distributed on an "AS IS" BASIS, 1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * See the License for the specific language governing permissions and 1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * limitations under the License. 1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */ 1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "QComOMXPlugin.h" 1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <dlfcn.h> 2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h> 2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelnamespace android { 2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMXPluginBase *createOMXPlugin() { 2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return new QComOMXPlugin; 2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelQComOMXPlugin::QComOMXPlugin() 3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel : mLibHandle(dlopen("libOmxCore.so", RTLD_NOW)), 3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mInit(NULL), 3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mDeinit(NULL), 3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mComponentNameEnum(NULL), 3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mGetHandle(NULL), 3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mFreeHandle(NULL), 3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mGetRolesOfComponentHandle(NULL) { 3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle != NULL) { 3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mInit = (InitFunc)dlsym(mLibHandle, "OMX_Init"); 4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mDeinit = (DeinitFunc)dlsym(mLibHandle, "OMX_Deinit"); 4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mComponentNameEnum = 4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (ComponentNameEnumFunc)dlsym(mLibHandle, "OMX_ComponentNameEnum"); 4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "OMX_GetHandle"); 4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "OMX_FreeHandle"); 4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mGetRolesOfComponentHandle = 4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (GetRolesOfComponentFunc)dlsym( 5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle, "OMX_GetRolesOfComponent"); 5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (!mInit || !mDeinit || !mComponentNameEnum || !mGetHandle || 5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel !mFreeHandle || !mGetRolesOfComponentHandle) { 5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(mLibHandle); 5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } else 5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*mInit)(); 5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelQComOMXPlugin::~QComOMXPlugin() { 6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle != NULL) { 6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel (*mDeinit)(); 6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel dlclose(mLibHandle); 6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel mLibHandle = NULL; 6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE QComOMXPlugin::makeComponentInstance( 7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel const char *name, 7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel const OMX_CALLBACKTYPE *callbacks, 7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_PTR appData, 7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENTTYPE **component) { 7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle == NULL) { 7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return (*mGetHandle)( 8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel reinterpret_cast<OMX_HANDLETYPE *>(component), 8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel const_cast<char *>(name), 8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel appData, const_cast<OMX_CALLBACKTYPE *>(callbacks)); 8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE QComOMXPlugin::destroyComponentInstance( 8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_COMPONENTTYPE *component) { 8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle == NULL) { 8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component)); 9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE QComOMXPlugin::enumerateComponents( 9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_STRING name, 9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel size_t size, 9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 index) { 9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle == NULL) { 9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return (*mComponentNameEnum)(name, size, index); 10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent( 10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel const char *name, 10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel Vector<String8> *roles) { 10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel roles->clear(); 10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (mLibHandle == NULL) { 11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorUndefined; 11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 numRoles; 11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)( 11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel const_cast<OMX_STRING>(name), &numRoles, NULL); 11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (err != OMX_ErrorNone) { 11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return err; 12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (numRoles > 0) { 12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U8 **array = new OMX_U8 *[numRoles]; 12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (OMX_U32 i = 0; i < numRoles; ++i) { 12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE]; 12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel OMX_U32 numRoles2; 12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel err = (*mGetRolesOfComponentHandle)( 13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel const_cast<OMX_STRING>(name), &numRoles2, array); 13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (err != OMX_ErrorNone) { 13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return err; 13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel if (numRoles2 != numRoles) { 13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return err; 13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel for (OMX_U32 i = 0; i < numRoles; ++i) { 14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel String8 s((const char *)array[i]); 14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel roles->push(s); 14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel delete[] array[i]; 14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel array[i] = NULL; 14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel delete[] array; 14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel array = NULL; 15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel } 15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel return OMX_ErrorNone; 15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} 15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel 15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel} // namespace android 156