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