/* * Copyright (C) 2009 The Android Open Source Project * Copyright (c) 2014, The Linux Foundation. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "QComOMXPlugin.h" #include #include namespace android { OMXPluginBase *createOMXPlugin() { return new QComOMXPlugin; } QComOMXPlugin::QComOMXPlugin() : mLibHandle(dlopen("libOmxCore.so", RTLD_NOW)), mInit(NULL), mDeinit(NULL), mComponentNameEnum(NULL), mGetHandle(NULL), mFreeHandle(NULL), mGetRolesOfComponentHandle(NULL) { if (mLibHandle != NULL) { mInit = (InitFunc)dlsym(mLibHandle, "OMX_Init"); mDeinit = (DeinitFunc)dlsym(mLibHandle, "OMX_Deinit"); mComponentNameEnum = (ComponentNameEnumFunc)dlsym(mLibHandle, "OMX_ComponentNameEnum"); mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "OMX_GetHandle"); mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "OMX_FreeHandle"); mGetRolesOfComponentHandle = (GetRolesOfComponentFunc)dlsym( mLibHandle, "OMX_GetRolesOfComponent"); if (!mInit || !mDeinit || !mComponentNameEnum || !mGetHandle || !mFreeHandle || !mGetRolesOfComponentHandle) { dlclose(mLibHandle); mLibHandle = NULL; } else (*mInit)(); } } QComOMXPlugin::~QComOMXPlugin() { if (mLibHandle != NULL) { (*mDeinit)(); dlclose(mLibHandle); mLibHandle = NULL; } } OMX_ERRORTYPE QComOMXPlugin::makeComponentInstance( const char *name, const OMX_CALLBACKTYPE *callbacks, OMX_PTR appData, OMX_COMPONENTTYPE **component) { if (mLibHandle == NULL) { return OMX_ErrorUndefined; } return (*mGetHandle)( reinterpret_cast(component), const_cast(name), appData, const_cast(callbacks)); } OMX_ERRORTYPE QComOMXPlugin::destroyComponentInstance( OMX_COMPONENTTYPE *component) { if (mLibHandle == NULL) { return OMX_ErrorUndefined; } return (*mFreeHandle)(reinterpret_cast(component)); } OMX_ERRORTYPE QComOMXPlugin::enumerateComponents( OMX_STRING name, size_t size, OMX_U32 index) { if (mLibHandle == NULL) { return OMX_ErrorUndefined; } return (*mComponentNameEnum)(name, size, index); } void QComOMXPlugin::freeArrayOfAllocatedMemory( OMX_U8 **array, OMX_S32 count) { if (count == 0) return; do { count--; delete[] array[count]; array[count] = NULL; } while (count > 0); } OMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent( const char *name, Vector *roles) { roles->clear(); if (mLibHandle == NULL) { return OMX_ErrorUndefined; } OMX_U32 numRoles; OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)( const_cast(name), &numRoles, NULL); if (err != OMX_ErrorNone) { return err; } if (numRoles > 0) { OMX_U8 **array = new OMX_U8 *[numRoles]; if (array == NULL) { return OMX_ErrorInsufficientResources; } for (OMX_U32 i = 0; i < numRoles; ++i) { array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE]; if (array[i] == NULL) { freeArrayOfAllocatedMemory(array, i); delete[] array; array = NULL; return OMX_ErrorInsufficientResources; } } OMX_U32 numRoles2; err = (*mGetRolesOfComponentHandle)( const_cast(name), &numRoles2, array); if (err != OMX_ErrorNone || numRoles2 != numRoles) { freeArrayOfAllocatedMemory(array, numRoles); delete[] array; array = NULL; return err == OMX_ErrorNone?OMX_ErrorBadParameter:err; } for (OMX_U32 i = 0; i < numRoles; ++i) { String8 s((const char *)array[i]); roles->push(s); delete[] array[i]; array[i] = NULL; } delete[] array; array = NULL; } return OMX_ErrorNone; } } // namespace android