• 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 "QComOMXPlugin.h"
18 
19 #include <dlfcn.h>
20 
21 #include <media/stagefright/HardwareAPI.h>
22 #include <media/stagefright/MediaDebug.h>
23 
24 namespace android {
25 
createOMXPlugin()26 OMXPluginBase *createOMXPlugin() {
27     return new QComOMXPlugin;
28 }
29 
QComOMXPlugin()30 QComOMXPlugin::QComOMXPlugin()
31     : mLibHandle(dlopen("libOmxCore.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, "OMX_Init");
40         mDeinit = (DeinitFunc)dlsym(mLibHandle, "OMX_DeInit");
41 
42         mComponentNameEnum =
43             (ComponentNameEnumFunc)dlsym(mLibHandle, "OMX_ComponentNameEnum");
44 
45         mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "OMX_GetHandle");
46         mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "OMX_FreeHandle");
47 
48         mGetRolesOfComponentHandle =
49             (GetRolesOfComponentFunc)dlsym(
50                     mLibHandle, "OMX_GetRolesOfComponent");
51 
52         (*mInit)();
53     }
54 }
55 
~QComOMXPlugin()56 QComOMXPlugin::~QComOMXPlugin() {
57     if (mLibHandle != NULL) {
58         (*mDeinit)();
59 
60         dlclose(mLibHandle);
61         mLibHandle = NULL;
62     }
63 }
64 
makeComponentInstance(const char * name,const OMX_CALLBACKTYPE * callbacks,OMX_PTR appData,OMX_COMPONENTTYPE ** component)65 OMX_ERRORTYPE QComOMXPlugin::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 
destroyComponentInstance(OMX_COMPONENTTYPE * component)80 OMX_ERRORTYPE QComOMXPlugin::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 
enumerateComponents(OMX_STRING name,size_t size,OMX_U32 index)89 OMX_ERRORTYPE QComOMXPlugin::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 
getRolesOfComponent(const char * name,Vector<String8> * roles)100 OMX_ERRORTYPE QComOMXPlugin::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