blob: ee76ffe8a5dcf732f6a9895f9adc50457b016d94 [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{
Jason Hu490aba92014-08-15 03:45:37 +080048#ifdef TARGET_HAS_ISV
49 AddCore("libisv_omx_core.so");
50#else
Byron Gardner419d3402014-08-12 15:09:23 -070051 AddCore("libwrs_omxil_core_pvwrapped.so");
52#if defined(USE_MEDIASDK)
53 AddCore("libmfx_omx_core.so");
54#endif
Jason Hu490aba92014-08-15 03:45:37 +080055#endif
Byron Gardner419d3402014-08-12 15:09:23 -070056}
57
58OMX_ERRORTYPE WrsOMXPlugin::AddCore(const char* coreName)
59{
60 void* libHandle = dlopen(coreName, RTLD_NOW);
61
62 if (libHandle != NULL) {
63 WrsOMXCore* core = (WrsOMXCore*)calloc(1,sizeof(WrsOMXCore));
64
65 if (!core) {
66 dlclose(libHandle);
67 return OMX_ErrorUndefined;
68 }
69 // set plugin lib handle and methods
70 core->mLibHandle = libHandle;
71 core->mInit = (WrsOMXCore::InitFunc)dlsym(libHandle, "OMX_Init");
72 core->mDeinit = (WrsOMXCore::DeinitFunc)dlsym(libHandle, "OMX_Deinit");
73
74 core->mComponentNameEnum =
75 (WrsOMXCore::ComponentNameEnumFunc)dlsym(libHandle, "OMX_ComponentNameEnum");
76
77 core->mGetHandle = (WrsOMXCore::GetHandleFunc)dlsym(libHandle, "OMX_GetHandle");
78 core->mFreeHandle = (WrsOMXCore::FreeHandleFunc)dlsym(libHandle, "OMX_FreeHandle");
79
80 core->mGetRolesOfComponentHandle =
81 (WrsOMXCore::GetRolesOfComponentFunc)dlsym(
82 libHandle, "OMX_GetRolesOfComponent");
83 if (core->mInit != NULL) {
84 (*(core->mInit))();
85 }
86 if (core->mComponentNameEnum != NULL) {
87 // calculating number of components registered inside given OMX core
88 char tmpComponentName[OMX_MAX_STRINGNAME_SIZE] = { 0 };
89 OMX_U32 tmpIndex = 0;
90 while (OMX_ErrorNone == ((*(core->mComponentNameEnum))(tmpComponentName, OMX_MAX_STRINGNAME_SIZE, tmpIndex))) {
91 tmpIndex++;
92 ALOGI("OMX IL core %s: declares component %s", coreName, tmpComponentName);
93 }
94 core->mNumComponents = tmpIndex;
95 ALOGI("OMX IL core %s: contains %ld components", coreName, core->mNumComponents);
96 }
97 // add plugin to the vector
98 mCores.push_back(core);
99 }
100 else {
101 ALOGW("OMX IL core %s not found", coreName);
102 return OMX_ErrorUndefined; // Do we need to return error message
103 }
104 return OMX_ErrorNone;
105}
106
107WrsOMXPlugin::~WrsOMXPlugin() {
108 for (OMX_U32 i = 0; i < mCores.size(); i++) {
109 if (mCores[i] != NULL && mCores[i]->mLibHandle != NULL) {
110 (*(mCores[i]->mDeinit))();
111
112 dlclose(mCores[i]->mLibHandle);
113 free(mCores[i]);
114 }
115 }
116}
117
118OMX_ERRORTYPE WrsOMXPlugin::makeComponentInstance(
119 const char *name,
120 const OMX_CALLBACKTYPE *callbacks,
121 OMX_PTR appData,
122 OMX_COMPONENTTYPE **component) {
123 for (OMX_U32 i = 0; i < mCores.size(); i++) {
124 if (mCores[i] != NULL) {
125 if (mCores[i]->mLibHandle == NULL) {
126 continue;
127 }
128
129 OMX_ERRORTYPE omx_res = (*(mCores[i]->mGetHandle))(
130 reinterpret_cast<OMX_HANDLETYPE *>(component),
131 const_cast<char *>(name),
132 appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
133 if(omx_res == OMX_ErrorNone) {
134 Mutex::Autolock autoLock(mMutex);
135 WrsOMXComponent comp;
136
137 comp.mComponent = *component;
138 comp.mCore = mCores[i];
139
140 mComponents.push_back(comp);
141 return OMX_ErrorNone;
142 }
143 }
144 }
145 return OMX_ErrorInvalidComponentName;
146}
147
148OMX_ERRORTYPE WrsOMXPlugin::destroyComponentInstance(
149 OMX_COMPONENTTYPE *component) {
150 Mutex::Autolock autoLock(mMutex);
151 for (OMX_U32 i = 0; i < mComponents.size(); i++) {
152 if (mComponents[i].mComponent == component) {
153 if (mComponents[i].mCore == NULL || mComponents[i].mCore->mLibHandle == NULL) {
154 return OMX_ErrorUndefined;
155 }
156 OMX_ERRORTYPE omx_res = (*(mComponents[i].mCore->mFreeHandle))(reinterpret_cast<OMX_HANDLETYPE *>(component));
157 mComponents.erase(mComponents.begin() + i);
158 return omx_res;
159 }
160 }
161 return OMX_ErrorInvalidComponent;
162}
163
164OMX_ERRORTYPE WrsOMXPlugin::enumerateComponents(
165 OMX_STRING name,
166 size_t size,
167 OMX_U32 index) {
168 // returning components
169 OMX_U32 relativeIndex = index;
170 for (OMX_U32 i = 0; i < mCores.size(); i++) {
171 if (mCores[i]->mLibHandle == NULL) {
172 continue;
173 }
174 if (relativeIndex < mCores[i]->mNumComponents) return ((*(mCores[i]->mComponentNameEnum))(name, size, relativeIndex));
175 else relativeIndex -= mCores[i]->mNumComponents;
176 }
177 return OMX_ErrorNoMore;
178}
179
180OMX_ERRORTYPE WrsOMXPlugin::getRolesOfComponent(
181 const char *name,
182 Vector<String8> *roles) {
183 roles->clear();
184 for (OMX_U32 j = 0; j < mCores.size(); j++) {
185 if (mCores[j]->mLibHandle == NULL) {
186 continue;
187 }
188
189 OMX_U32 numRoles;
190 OMX_ERRORTYPE err = (*(mCores[j]->mGetRolesOfComponentHandle))(
191 const_cast<OMX_STRING>(name), &numRoles, NULL);
192
193 if (err != OMX_ErrorNone) {
194 continue;
195 }
196
197 if (numRoles > 0) {
198 OMX_U8 **array = new OMX_U8 *[numRoles];
199 for (OMX_U32 i = 0; i < numRoles; ++i) {
200 array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
201 }
202
203 OMX_U32 numRoles2 = numRoles;
204 err = (*(mCores[j]->mGetRolesOfComponentHandle))(
205 const_cast<OMX_STRING>(name), &numRoles2, array);
206
207 CHECK_EQ(err, OMX_ErrorNone);
208 CHECK_EQ(numRoles, numRoles2);
209
210 for (OMX_U32 i = 0; i < numRoles; ++i) {
211 String8 s((const char *)array[i]);
212 roles->push(s);
213
214 delete[] array[i];
215 array[i] = NULL;
216 }
217
218 delete[] array;
219 array = NULL;
220 }
221 return OMX_ErrorNone;
222 }
223 return OMX_ErrorInvalidComponent;
224}
225
226} // namespace android