blob: f9c62e2e1ea7692c957ca732addb08e0a7b94f03 [file] [log] [blame]
Byron Gardner419d3402014-08-12 15:09:23 -07001/*
2* Copyright (c) 2009-2011 Intel Corporation. All rights reserved.
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/*
18 * Copyright (C) 2009 The Android Open Source Project
19 *
20 * Licensed under the Apache License, Version 2.0 (the "License");
21 * you may not use this file except in compliance with the License.
22 * You may obtain a copy of the License at
23 *
24 * http://www.apache.org/licenses/LICENSE-2.0
25 *
26 * Unless required by applicable law or agreed to in writing, software
27 * distributed under the License is distributed on an "AS IS" BASIS,
28 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29 * See the License for the specific language governing permissions and
30 * limitations under the License.
31 */
32
33#include "WrsOMXPlugin.h"
34
35#include <dlfcn.h>
36
37#include <HardwareAPI.h>
38#include <media/stagefright/foundation/ADebug.h>
39
40namespace android {
41
42OMXPluginBase *createOMXPlugin() {
43 return new WrsOMXPlugin;
44}
45
46WrsOMXPlugin::WrsOMXPlugin()
47{
48 AddCore("libwrs_omxil_core_pvwrapped.so");
49#if defined(USE_MEDIASDK)
50 AddCore("libmfx_omx_core.so");
51#endif
52}
53
54OMX_ERRORTYPE WrsOMXPlugin::AddCore(const char* coreName)
55{
56 void* libHandle = dlopen(coreName, RTLD_NOW);
57
58 if (libHandle != NULL) {
59 WrsOMXCore* core = (WrsOMXCore*)calloc(1,sizeof(WrsOMXCore));
60
61 if (!core) {
62 dlclose(libHandle);
63 return OMX_ErrorUndefined;
64 }
65 // set plugin lib handle and methods
66 core->mLibHandle = libHandle;
67 core->mInit = (WrsOMXCore::InitFunc)dlsym(libHandle, "OMX_Init");
68 core->mDeinit = (WrsOMXCore::DeinitFunc)dlsym(libHandle, "OMX_Deinit");
69
70 core->mComponentNameEnum =
71 (WrsOMXCore::ComponentNameEnumFunc)dlsym(libHandle, "OMX_ComponentNameEnum");
72
73 core->mGetHandle = (WrsOMXCore::GetHandleFunc)dlsym(libHandle, "OMX_GetHandle");
74 core->mFreeHandle = (WrsOMXCore::FreeHandleFunc)dlsym(libHandle, "OMX_FreeHandle");
75
76 core->mGetRolesOfComponentHandle =
77 (WrsOMXCore::GetRolesOfComponentFunc)dlsym(
78 libHandle, "OMX_GetRolesOfComponent");
79 if (core->mInit != NULL) {
80 (*(core->mInit))();
81 }
82 if (core->mComponentNameEnum != NULL) {
83 // calculating number of components registered inside given OMX core
84 char tmpComponentName[OMX_MAX_STRINGNAME_SIZE] = { 0 };
85 OMX_U32 tmpIndex = 0;
86 while (OMX_ErrorNone == ((*(core->mComponentNameEnum))(tmpComponentName, OMX_MAX_STRINGNAME_SIZE, tmpIndex))) {
87 tmpIndex++;
88 ALOGI("OMX IL core %s: declares component %s", coreName, tmpComponentName);
89 }
90 core->mNumComponents = tmpIndex;
91 ALOGI("OMX IL core %s: contains %ld components", coreName, core->mNumComponents);
92 }
93 // add plugin to the vector
94 mCores.push_back(core);
95 }
96 else {
97 ALOGW("OMX IL core %s not found", coreName);
98 return OMX_ErrorUndefined; // Do we need to return error message
99 }
100 return OMX_ErrorNone;
101}
102
103WrsOMXPlugin::~WrsOMXPlugin() {
104 for (OMX_U32 i = 0; i < mCores.size(); i++) {
105 if (mCores[i] != NULL && mCores[i]->mLibHandle != NULL) {
106 (*(mCores[i]->mDeinit))();
107
108 dlclose(mCores[i]->mLibHandle);
109 free(mCores[i]);
110 }
111 }
112}
113
114OMX_ERRORTYPE WrsOMXPlugin::makeComponentInstance(
115 const char *name,
116 const OMX_CALLBACKTYPE *callbacks,
117 OMX_PTR appData,
118 OMX_COMPONENTTYPE **component) {
119 for (OMX_U32 i = 0; i < mCores.size(); i++) {
120 if (mCores[i] != NULL) {
121 if (mCores[i]->mLibHandle == NULL) {
122 continue;
123 }
124
125 OMX_ERRORTYPE omx_res = (*(mCores[i]->mGetHandle))(
126 reinterpret_cast<OMX_HANDLETYPE *>(component),
127 const_cast<char *>(name),
128 appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
129 if(omx_res == OMX_ErrorNone) {
130 Mutex::Autolock autoLock(mMutex);
131 WrsOMXComponent comp;
132
133 comp.mComponent = *component;
134 comp.mCore = mCores[i];
135
136 mComponents.push_back(comp);
137 return OMX_ErrorNone;
138 }
139 }
140 }
141 return OMX_ErrorInvalidComponentName;
142}
143
144OMX_ERRORTYPE WrsOMXPlugin::destroyComponentInstance(
145 OMX_COMPONENTTYPE *component) {
146 Mutex::Autolock autoLock(mMutex);
147 for (OMX_U32 i = 0; i < mComponents.size(); i++) {
148 if (mComponents[i].mComponent == component) {
149 if (mComponents[i].mCore == NULL || mComponents[i].mCore->mLibHandle == NULL) {
150 return OMX_ErrorUndefined;
151 }
152 OMX_ERRORTYPE omx_res = (*(mComponents[i].mCore->mFreeHandle))(reinterpret_cast<OMX_HANDLETYPE *>(component));
153 mComponents.erase(mComponents.begin() + i);
154 return omx_res;
155 }
156 }
157 return OMX_ErrorInvalidComponent;
158}
159
160OMX_ERRORTYPE WrsOMXPlugin::enumerateComponents(
161 OMX_STRING name,
162 size_t size,
163 OMX_U32 index) {
164 // returning components
165 OMX_U32 relativeIndex = index;
166 for (OMX_U32 i = 0; i < mCores.size(); i++) {
167 if (mCores[i]->mLibHandle == NULL) {
168 continue;
169 }
170 if (relativeIndex < mCores[i]->mNumComponents) return ((*(mCores[i]->mComponentNameEnum))(name, size, relativeIndex));
171 else relativeIndex -= mCores[i]->mNumComponents;
172 }
173 return OMX_ErrorNoMore;
174}
175
176OMX_ERRORTYPE WrsOMXPlugin::getRolesOfComponent(
177 const char *name,
178 Vector<String8> *roles) {
179 roles->clear();
180 for (OMX_U32 j = 0; j < mCores.size(); j++) {
181 if (mCores[j]->mLibHandle == NULL) {
182 continue;
183 }
184
185 OMX_U32 numRoles;
186 OMX_ERRORTYPE err = (*(mCores[j]->mGetRolesOfComponentHandle))(
187 const_cast<OMX_STRING>(name), &numRoles, NULL);
188
189 if (err != OMX_ErrorNone) {
190 continue;
191 }
192
193 if (numRoles > 0) {
194 OMX_U8 **array = new OMX_U8 *[numRoles];
195 for (OMX_U32 i = 0; i < numRoles; ++i) {
196 array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
197 }
198
199 OMX_U32 numRoles2 = numRoles;
200 err = (*(mCores[j]->mGetRolesOfComponentHandle))(
201 const_cast<OMX_STRING>(name), &numRoles2, array);
202
203 CHECK_EQ(err, OMX_ErrorNone);
204 CHECK_EQ(numRoles, numRoles2);
205
206 for (OMX_U32 i = 0; i < numRoles; ++i) {
207 String8 s((const char *)array[i]);
208 roles->push(s);
209
210 delete[] array[i];
211 array[i] = NULL;
212 }
213
214 delete[] array;
215 array = NULL;
216 }
217 return OMX_ErrorNone;
218 }
219 return OMX_ErrorInvalidComponent;
220}
221
222} // namespace android