Home | History | Annotate | Download | only in libstagefrighthw
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "TIOMXPlugin.h"
     18 
     19 #include <dlfcn.h>
     20 
     21 #include <media/stagefright/HardwareAPI.h>
     22 #include <media/stagefright/MediaDebug.h>
     23 
     24 namespace android {
     25 
     26 OMXPluginBase *createOMXPlugin() {
     27     return new TIOMXPlugin;
     28 }
     29 
     30 TIOMXPlugin::TIOMXPlugin()
     31     : mLibHandle(dlopen("libOMX_Core.so", RTLD_NOW)),
     32       mInit(NULL),
     33       mDeinit(NULL),
     34       mComponentNameEnum(NULL),
     35       mGetHandle(NULL),
     36       mFreeHandle(NULL),
     37       mGetRolesOfComponentHandle(NULL) {
     38     if (mLibHandle != NULL) {
     39         mInit = (InitFunc)dlsym(mLibHandle, "TIOMX_Init");
     40         mDeinit = (DeinitFunc)dlsym(mLibHandle, "TIOMX_DeInit");
     41 
     42         mComponentNameEnum =
     43             (ComponentNameEnumFunc)dlsym(mLibHandle, "TIOMX_ComponentNameEnum");
     44 
     45         mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "TIOMX_GetHandle");
     46         mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "TIOMX_FreeHandle");
     47 
     48         mGetRolesOfComponentHandle =
     49             (GetRolesOfComponentFunc)dlsym(
     50                     mLibHandle, "TIOMX_GetRolesOfComponent");
     51 
     52         (*mInit)();
     53     }
     54 }
     55 
     56 TIOMXPlugin::~TIOMXPlugin() {
     57     if (mLibHandle != NULL) {
     58         (*mDeinit)();
     59 
     60         dlclose(mLibHandle);
     61         mLibHandle = NULL;
     62     }
     63 }
     64 
     65 OMX_ERRORTYPE TIOMXPlugin::makeComponentInstance(
     66         const char *name,
     67         const OMX_CALLBACKTYPE *callbacks,
     68         OMX_PTR appData,
     69         OMX_COMPONENTTYPE **component) {
     70     if (mLibHandle == NULL) {
     71         return OMX_ErrorUndefined;
     72     }
     73 
     74     return (*mGetHandle)(
     75             reinterpret_cast<OMX_HANDLETYPE *>(component),
     76             const_cast<char *>(name),
     77             appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
     78 }
     79 
     80 OMX_ERRORTYPE TIOMXPlugin::destroyComponentInstance(
     81         OMX_COMPONENTTYPE *component) {
     82     if (mLibHandle == NULL) {
     83         return OMX_ErrorUndefined;
     84     }
     85 
     86     return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component));
     87 }
     88 
     89 OMX_ERRORTYPE TIOMXPlugin::enumerateComponents(
     90         OMX_STRING name,
     91         size_t size,
     92         OMX_U32 index) {
     93     if (mLibHandle == NULL) {
     94         return OMX_ErrorUndefined;
     95     }
     96 
     97     return (*mComponentNameEnum)(name, size, index);
     98 }
     99 
    100 OMX_ERRORTYPE TIOMXPlugin::getRolesOfComponent(
    101         const char *name,
    102         Vector<String8> *roles) {
    103     roles->clear();
    104 
    105     if (mLibHandle == NULL) {
    106         return OMX_ErrorUndefined;
    107     }
    108 
    109     OMX_U32 numRoles;
    110     OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)(
    111             const_cast<OMX_STRING>(name), &numRoles, NULL);
    112 
    113     if (err != OMX_ErrorNone) {
    114         return err;
    115     }
    116 
    117     if (numRoles > 0) {
    118         OMX_U8 **array = new OMX_U8 *[numRoles];
    119         for (OMX_U32 i = 0; i < numRoles; ++i) {
    120             array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
    121         }
    122 
    123         OMX_U32 numRoles2;
    124         err = (*mGetRolesOfComponentHandle)(
    125                 const_cast<OMX_STRING>(name), &numRoles2, array);
    126 
    127         CHECK_EQ(err, OMX_ErrorNone);
    128         CHECK_EQ(numRoles, numRoles2);
    129 
    130         for (OMX_U32 i = 0; i < numRoles; ++i) {
    131             String8 s((const char *)array[i]);
    132             roles->push(s);
    133 
    134             delete[] array[i];
    135             array[i] = NULL;
    136         }
    137 
    138         delete[] array;
    139         array = NULL;
    140     }
    141 
    142     return OMX_ErrorNone;
    143 }
    144 
    145 }  // namespace android
    146