/* * Copyright (C) 2010 The Android Open Source Project * * 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 "SEC_OMX_Plugin.h" #include #include namespace android { OMXPluginBase *createOMXPlugin() { return new SECOMXPlugin; } SECOMXPlugin::SECOMXPlugin() : mLibHandle(dlopen("libSEC_OMX_Core.so", RTLD_NOW)), mInit(NULL), mDeinit(NULL), mComponentNameEnum(NULL), mGetHandle(NULL), mFreeHandle(NULL), mGetRolesOfComponentHandle(NULL) { if (mLibHandle != NULL) { mInit = (InitFunc)dlsym(mLibHandle, "SEC_OMX_Init"); mDeinit = (DeinitFunc)dlsym(mLibHandle, "SEC_OMX_Deinit"); mComponentNameEnum = (ComponentNameEnumFunc)dlsym(mLibHandle, "SEC_OMX_ComponentNameEnum"); mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "SEC_OMX_GetHandle"); mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "SEC_OMX_FreeHandle"); mGetRolesOfComponentHandle = (GetRolesOfComponentFunc)dlsym( mLibHandle, "SEC_OMX_GetRolesOfComponent"); (*mInit)(); } } SECOMXPlugin::~SECOMXPlugin() { if (mLibHandle != NULL) { (*mDeinit)(); dlclose(mLibHandle); mLibHandle = NULL; } } OMX_ERRORTYPE SECOMXPlugin::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 SECOMXPlugin::destroyComponentInstance( OMX_COMPONENTTYPE *component) { if (mLibHandle == NULL) { return OMX_ErrorUndefined; } return (*mFreeHandle)(reinterpret_cast(component)); } OMX_ERRORTYPE SECOMXPlugin::enumerateComponents( OMX_STRING name, size_t size, OMX_U32 index) { if (mLibHandle == NULL) { return OMX_ErrorUndefined; } return (*mComponentNameEnum)(name, size, index); } OMX_ERRORTYPE SECOMXPlugin::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]; for (OMX_U32 i = 0; i < numRoles; ++i) { array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE]; } OMX_U32 numRoles2; err = (*mGetRolesOfComponentHandle)( const_cast(name), &numRoles2, array); if (err == OMX_ErrorNone && numRoles != numRoles2) { err = OMX_ErrorUndefined; } for (OMX_U32 i = 0; i < numRoles; ++i) { if (err == OMX_ErrorNone) { String8 s((const char *)array[i]); roles->push(s); } delete[] array[i]; array[i] = NULL; } delete[] array; array = NULL; } return err; } } // namespace android