• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 <HardwareAPI.h>
22 
23 namespace android {
24 
createOMXPlugin()25 extern "C" OMXPluginBase *createOMXPlugin() {
26     return new TIOMXPlugin;
27 }
28 
destroyOMXPlugin(OMXPluginBase * plugin)29 extern "C" void destroyOMXPlugin(OMXPluginBase *plugin) {
30     delete plugin;
31 }
32 
33 #define LIBOMX "libOMX_Core.so"
34 
TIOMXPlugin()35 TIOMXPlugin::TIOMXPlugin()
36     : mLibHandle(dlopen(LIBOMX, RTLD_NOW)),
37       mInit(NULL),
38       mDeinit(NULL),
39       mComponentNameEnum(NULL),
40       mGetHandle(NULL),
41       mFreeHandle(NULL),
42       mGetRolesOfComponentHandle(NULL) {
43     if (mLibHandle != NULL) {
44         mInit = (InitFunc)dlsym(mLibHandle, "TIOMX_Init");
45         mDeinit = (DeinitFunc)dlsym(mLibHandle, "TIOMX_Deinit");
46 
47         mComponentNameEnum =
48             (ComponentNameEnumFunc)dlsym(mLibHandle, "TIOMX_ComponentNameEnum");
49 
50         mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "TIOMX_GetHandle");
51         mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "TIOMX_FreeHandle");
52 
53         mGetRolesOfComponentHandle =
54             (GetRolesOfComponentFunc)dlsym(
55                     mLibHandle, "TIOMX_GetRolesOfComponent");
56 
57         (*mInit)();
58     }
59     else
60         ALOGE("%s: failed to load %s", __func__, LIBOMX);
61 }
62 
~TIOMXPlugin()63 TIOMXPlugin::~TIOMXPlugin() {
64     if (mLibHandle != NULL) {
65         (*mDeinit)();
66 
67         dlclose(mLibHandle);
68         mLibHandle = NULL;
69     }
70 }
71 
makeComponentInstance(const char * name,const OMX_CALLBACKTYPE * callbacks,OMX_PTR appData,OMX_COMPONENTTYPE ** component)72 OMX_ERRORTYPE TIOMXPlugin::makeComponentInstance(
73         const char *name,
74         const OMX_CALLBACKTYPE *callbacks,
75         OMX_PTR appData,
76         OMX_COMPONENTTYPE **component) {
77     if (mLibHandle == NULL) {
78         return OMX_ErrorUndefined;
79     }
80 
81     return (*mGetHandle)(
82             reinterpret_cast<OMX_HANDLETYPE *>(component),
83             const_cast<char *>(name),
84             appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
85 }
86 
destroyComponentInstance(OMX_COMPONENTTYPE * component)87 OMX_ERRORTYPE TIOMXPlugin::destroyComponentInstance(
88         OMX_COMPONENTTYPE *component) {
89     if (mLibHandle == NULL) {
90         return OMX_ErrorUndefined;
91     }
92 
93     return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component));
94 }
95 
enumerateComponents(OMX_STRING name,size_t size,OMX_U32 index)96 OMX_ERRORTYPE TIOMXPlugin::enumerateComponents(
97         OMX_STRING name,
98         size_t size,
99         OMX_U32 index) {
100     if (mLibHandle == NULL) {
101 	ALOGE("mLibHandle is NULL!");
102         return OMX_ErrorUndefined;
103     }
104 
105     return (*mComponentNameEnum)(name, size, index);
106 }
107 
getRolesOfComponent(const char * name,Vector<String8> * roles)108 OMX_ERRORTYPE TIOMXPlugin::getRolesOfComponent(
109         const char *name,
110         Vector<String8> *roles) {
111     roles->clear();
112 
113     if (mLibHandle == NULL) {
114         return OMX_ErrorUndefined;
115     }
116 
117     OMX_U32 numRoles;
118     OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)(
119             const_cast<OMX_STRING>(name), &numRoles, NULL);
120 
121     if (err != OMX_ErrorNone) {
122         return err;
123     }
124 
125     if (numRoles > 0) {
126         OMX_U8 **array = new OMX_U8 *[numRoles];
127         for (OMX_U32 i = 0; i < numRoles; ++i) {
128             array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
129         }
130 
131         err = (*mGetRolesOfComponentHandle)(
132                 const_cast<OMX_STRING>(name), &numRoles, array);
133 
134         for (OMX_U32 i = 0; i < numRoles; ++i) {
135             if (err == OMX_ErrorNone) {
136                 String8 s((const char *)array[i]);
137                 roles->push(s);
138             }
139 
140             delete[] array[i];
141             array[i] = NULL;
142         }
143 
144         delete[] array;
145         array = NULL;
146     }
147 
148     return err;
149 }
150 
151 }  // namespace android
152