1 /*
2 * Copyright (C) 2011 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 //#define LOG_NDEBUG 0
18 #define LOG_TAG "SoftOMXComponent"
19 #include <utils/Log.h>
20
21 #include "include/SoftOMXComponent.h"
22
23 #include <media/stagefright/foundation/ADebug.h>
24
25 namespace android {
26
SoftOMXComponent(const char * name,const OMX_CALLBACKTYPE * callbacks,OMX_PTR appData,OMX_COMPONENTTYPE ** component)27 SoftOMXComponent::SoftOMXComponent(
28 const char *name,
29 const OMX_CALLBACKTYPE *callbacks,
30 OMX_PTR appData,
31 OMX_COMPONENTTYPE **component)
32 : mName(name),
33 mCallbacks(callbacks),
34 mComponent(new OMX_COMPONENTTYPE),
35 mLibHandle(NULL) {
36 mComponent->nSize = sizeof(*mComponent);
37 mComponent->nVersion.s.nVersionMajor = 1;
38 mComponent->nVersion.s.nVersionMinor = 0;
39 mComponent->nVersion.s.nRevision = 0;
40 mComponent->nVersion.s.nStep = 0;
41 mComponent->pComponentPrivate = this;
42 mComponent->pApplicationPrivate = appData;
43
44 mComponent->GetComponentVersion = NULL;
45 mComponent->SendCommand = SendCommandWrapper;
46 mComponent->GetParameter = GetParameterWrapper;
47 mComponent->SetParameter = SetParameterWrapper;
48 mComponent->GetConfig = GetConfigWrapper;
49 mComponent->SetConfig = SetConfigWrapper;
50 mComponent->GetExtensionIndex = GetExtensionIndexWrapper;
51 mComponent->GetState = GetStateWrapper;
52 mComponent->ComponentTunnelRequest = NULL;
53 mComponent->UseBuffer = UseBufferWrapper;
54 mComponent->AllocateBuffer = AllocateBufferWrapper;
55 mComponent->FreeBuffer = FreeBufferWrapper;
56 mComponent->EmptyThisBuffer = EmptyThisBufferWrapper;
57 mComponent->FillThisBuffer = FillThisBufferWrapper;
58 mComponent->SetCallbacks = NULL;
59 mComponent->ComponentDeInit = NULL;
60 mComponent->UseEGLImage = NULL;
61 mComponent->ComponentRoleEnum = NULL;
62
63 *component = mComponent;
64 }
65
~SoftOMXComponent()66 SoftOMXComponent::~SoftOMXComponent() {
67 delete mComponent;
68 mComponent = NULL;
69 }
70
setLibHandle(void * libHandle)71 void SoftOMXComponent::setLibHandle(void *libHandle) {
72 CHECK(libHandle != NULL);
73 mLibHandle = libHandle;
74 }
75
libHandle() const76 void *SoftOMXComponent::libHandle() const {
77 return mLibHandle;
78 }
79
initCheck() const80 OMX_ERRORTYPE SoftOMXComponent::initCheck() const {
81 return OMX_ErrorNone;
82 }
83
name() const84 const char *SoftOMXComponent::name() const {
85 return mName.c_str();
86 }
87
notify(OMX_EVENTTYPE event,OMX_U32 data1,OMX_U32 data2,OMX_PTR data)88 void SoftOMXComponent::notify(
89 OMX_EVENTTYPE event,
90 OMX_U32 data1, OMX_U32 data2, OMX_PTR data) {
91 (*mCallbacks->EventHandler)(
92 mComponent,
93 mComponent->pApplicationPrivate,
94 event,
95 data1,
96 data2,
97 data);
98 }
99
notifyEmptyBufferDone(OMX_BUFFERHEADERTYPE * header)100 void SoftOMXComponent::notifyEmptyBufferDone(OMX_BUFFERHEADERTYPE *header) {
101 (*mCallbacks->EmptyBufferDone)(
102 mComponent, mComponent->pApplicationPrivate, header);
103 }
104
notifyFillBufferDone(OMX_BUFFERHEADERTYPE * header)105 void SoftOMXComponent::notifyFillBufferDone(OMX_BUFFERHEADERTYPE *header) {
106 (*mCallbacks->FillBufferDone)(
107 mComponent, mComponent->pApplicationPrivate, header);
108 }
109
110 // static
SendCommandWrapper(OMX_HANDLETYPE component,OMX_COMMANDTYPE cmd,OMX_U32 param,OMX_PTR data)111 OMX_ERRORTYPE SoftOMXComponent::SendCommandWrapper(
112 OMX_HANDLETYPE component,
113 OMX_COMMANDTYPE cmd,
114 OMX_U32 param,
115 OMX_PTR data) {
116 SoftOMXComponent *me =
117 (SoftOMXComponent *)
118 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
119
120 return me->sendCommand(cmd, param, data);
121 }
122
123 // static
GetParameterWrapper(OMX_HANDLETYPE component,OMX_INDEXTYPE index,OMX_PTR params)124 OMX_ERRORTYPE SoftOMXComponent::GetParameterWrapper(
125 OMX_HANDLETYPE component,
126 OMX_INDEXTYPE index,
127 OMX_PTR params) {
128 SoftOMXComponent *me =
129 (SoftOMXComponent *)
130 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
131
132 return me->getParameter(index, params);
133 }
134
135 // static
SetParameterWrapper(OMX_HANDLETYPE component,OMX_INDEXTYPE index,OMX_PTR params)136 OMX_ERRORTYPE SoftOMXComponent::SetParameterWrapper(
137 OMX_HANDLETYPE component,
138 OMX_INDEXTYPE index,
139 OMX_PTR params) {
140 SoftOMXComponent *me =
141 (SoftOMXComponent *)
142 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
143
144 return me->setParameter(index, params);
145 }
146
147 // static
GetConfigWrapper(OMX_HANDLETYPE component,OMX_INDEXTYPE index,OMX_PTR params)148 OMX_ERRORTYPE SoftOMXComponent::GetConfigWrapper(
149 OMX_HANDLETYPE component,
150 OMX_INDEXTYPE index,
151 OMX_PTR params) {
152 SoftOMXComponent *me =
153 (SoftOMXComponent *)
154 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
155
156 return me->getConfig(index, params);
157 }
158
159 // static
SetConfigWrapper(OMX_HANDLETYPE component,OMX_INDEXTYPE index,OMX_PTR params)160 OMX_ERRORTYPE SoftOMXComponent::SetConfigWrapper(
161 OMX_HANDLETYPE component,
162 OMX_INDEXTYPE index,
163 OMX_PTR params) {
164 SoftOMXComponent *me =
165 (SoftOMXComponent *)
166 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
167
168 return me->setConfig(index, params);
169 }
170
171 // static
GetExtensionIndexWrapper(OMX_HANDLETYPE component,OMX_STRING name,OMX_INDEXTYPE * index)172 OMX_ERRORTYPE SoftOMXComponent::GetExtensionIndexWrapper(
173 OMX_HANDLETYPE component,
174 OMX_STRING name,
175 OMX_INDEXTYPE *index) {
176 SoftOMXComponent *me =
177 (SoftOMXComponent *)
178 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
179
180 return me->getExtensionIndex(name, index);
181 }
182
183 // static
UseBufferWrapper(OMX_HANDLETYPE component,OMX_BUFFERHEADERTYPE ** buffer,OMX_U32 portIndex,OMX_PTR appPrivate,OMX_U32 size,OMX_U8 * ptr)184 OMX_ERRORTYPE SoftOMXComponent::UseBufferWrapper(
185 OMX_HANDLETYPE component,
186 OMX_BUFFERHEADERTYPE **buffer,
187 OMX_U32 portIndex,
188 OMX_PTR appPrivate,
189 OMX_U32 size,
190 OMX_U8 *ptr) {
191 SoftOMXComponent *me =
192 (SoftOMXComponent *)
193 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
194
195 return me->useBuffer(buffer, portIndex, appPrivate, size, ptr);
196 }
197
198 // static
AllocateBufferWrapper(OMX_HANDLETYPE component,OMX_BUFFERHEADERTYPE ** buffer,OMX_U32 portIndex,OMX_PTR appPrivate,OMX_U32 size)199 OMX_ERRORTYPE SoftOMXComponent::AllocateBufferWrapper(
200 OMX_HANDLETYPE component,
201 OMX_BUFFERHEADERTYPE **buffer,
202 OMX_U32 portIndex,
203 OMX_PTR appPrivate,
204 OMX_U32 size) {
205 SoftOMXComponent *me =
206 (SoftOMXComponent *)
207 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
208
209 return me->allocateBuffer(buffer, portIndex, appPrivate, size);
210 }
211
212 // static
FreeBufferWrapper(OMX_HANDLETYPE component,OMX_U32 portIndex,OMX_BUFFERHEADERTYPE * buffer)213 OMX_ERRORTYPE SoftOMXComponent::FreeBufferWrapper(
214 OMX_HANDLETYPE component,
215 OMX_U32 portIndex,
216 OMX_BUFFERHEADERTYPE *buffer) {
217 SoftOMXComponent *me =
218 (SoftOMXComponent *)
219 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
220
221 return me->freeBuffer(portIndex, buffer);
222 }
223
224 // static
EmptyThisBufferWrapper(OMX_HANDLETYPE component,OMX_BUFFERHEADERTYPE * buffer)225 OMX_ERRORTYPE SoftOMXComponent::EmptyThisBufferWrapper(
226 OMX_HANDLETYPE component,
227 OMX_BUFFERHEADERTYPE *buffer) {
228 SoftOMXComponent *me =
229 (SoftOMXComponent *)
230 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
231
232 return me->emptyThisBuffer(buffer);
233 }
234
235 // static
FillThisBufferWrapper(OMX_HANDLETYPE component,OMX_BUFFERHEADERTYPE * buffer)236 OMX_ERRORTYPE SoftOMXComponent::FillThisBufferWrapper(
237 OMX_HANDLETYPE component,
238 OMX_BUFFERHEADERTYPE *buffer) {
239 SoftOMXComponent *me =
240 (SoftOMXComponent *)
241 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
242
243 return me->fillThisBuffer(buffer);
244 }
245
246 // static
GetStateWrapper(OMX_HANDLETYPE component,OMX_STATETYPE * state)247 OMX_ERRORTYPE SoftOMXComponent::GetStateWrapper(
248 OMX_HANDLETYPE component,
249 OMX_STATETYPE *state) {
250 SoftOMXComponent *me =
251 (SoftOMXComponent *)
252 ((OMX_COMPONENTTYPE *)component)->pComponentPrivate;
253
254 return me->getState(state);
255 }
256
257 ////////////////////////////////////////////////////////////////////////////////
258
sendCommand(OMX_COMMANDTYPE,OMX_U32,OMX_PTR)259 OMX_ERRORTYPE SoftOMXComponent::sendCommand(
260 OMX_COMMANDTYPE /* cmd */, OMX_U32 /* param */, OMX_PTR /* data */) {
261 return OMX_ErrorUndefined;
262 }
263
getParameter(OMX_INDEXTYPE,OMX_PTR)264 OMX_ERRORTYPE SoftOMXComponent::getParameter(
265 OMX_INDEXTYPE /* index */, OMX_PTR /* params */) {
266 return OMX_ErrorUndefined;
267 }
268
setParameter(OMX_INDEXTYPE,const OMX_PTR)269 OMX_ERRORTYPE SoftOMXComponent::setParameter(
270 OMX_INDEXTYPE /* index */, const OMX_PTR /* params */) {
271 return OMX_ErrorUndefined;
272 }
273
getConfig(OMX_INDEXTYPE,OMX_PTR)274 OMX_ERRORTYPE SoftOMXComponent::getConfig(
275 OMX_INDEXTYPE /* index */, OMX_PTR /* params */) {
276 return OMX_ErrorUndefined;
277 }
278
setConfig(OMX_INDEXTYPE,const OMX_PTR)279 OMX_ERRORTYPE SoftOMXComponent::setConfig(
280 OMX_INDEXTYPE /* index */, const OMX_PTR /* params */) {
281 return OMX_ErrorUndefined;
282 }
283
getExtensionIndex(const char *,OMX_INDEXTYPE *)284 OMX_ERRORTYPE SoftOMXComponent::getExtensionIndex(
285 const char * /* name */, OMX_INDEXTYPE * /* index */) {
286 return OMX_ErrorUnsupportedIndex;
287 }
288
useBuffer(OMX_BUFFERHEADERTYPE **,OMX_U32,OMX_PTR,OMX_U32,OMX_U8 *)289 OMX_ERRORTYPE SoftOMXComponent::useBuffer(
290 OMX_BUFFERHEADERTYPE ** /* buffer */,
291 OMX_U32 /* portIndex */,
292 OMX_PTR /* appPrivate */,
293 OMX_U32 /* size */,
294 OMX_U8 * /* ptr */) {
295 return OMX_ErrorUndefined;
296 }
297
allocateBuffer(OMX_BUFFERHEADERTYPE **,OMX_U32,OMX_PTR,OMX_U32)298 OMX_ERRORTYPE SoftOMXComponent::allocateBuffer(
299 OMX_BUFFERHEADERTYPE ** /* buffer */,
300 OMX_U32 /* portIndex */,
301 OMX_PTR /* appPrivate */,
302 OMX_U32 /* size */) {
303 return OMX_ErrorUndefined;
304 }
305
freeBuffer(OMX_U32,OMX_BUFFERHEADERTYPE *)306 OMX_ERRORTYPE SoftOMXComponent::freeBuffer(
307 OMX_U32 /* portIndex */,
308 OMX_BUFFERHEADERTYPE * /* buffer */) {
309 return OMX_ErrorUndefined;
310 }
311
emptyThisBuffer(OMX_BUFFERHEADERTYPE *)312 OMX_ERRORTYPE SoftOMXComponent::emptyThisBuffer(
313 OMX_BUFFERHEADERTYPE * /* buffer */) {
314 return OMX_ErrorUndefined;
315 }
316
fillThisBuffer(OMX_BUFFERHEADERTYPE *)317 OMX_ERRORTYPE SoftOMXComponent::fillThisBuffer(
318 OMX_BUFFERHEADERTYPE * /* buffer */) {
319 return OMX_ErrorUndefined;
320 }
321
getState(OMX_STATETYPE *)322 OMX_ERRORTYPE SoftOMXComponent::getState(OMX_STATETYPE * /* state */) {
323 return OMX_ErrorUndefined;
324 }
325
326 } // namespace android
327