3 * Copyright 2012 Samsung Electronics S.LSI Co. LTD
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 * @file Exynos_OMX_Basecomponent.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * Yunji Kim (yunji.kim@samsung.com)
33 #include "Exynos_OSAL_Event.h"
34 #include "Exynos_OSAL_Thread.h"
35 #include "Exynos_OSAL_ETC.h"
36 #include "Exynos_OSAL_Semaphore.h"
37 #include "Exynos_OSAL_Mutex.h"
38 #include "Exynos_OMX_Baseport.h"
39 #include "Exynos_OMX_Basecomponent.h"
40 #include "Exynos_OMX_Resourcemanager.h"
41 #include "Exynos_OMX_Macros.h"
44 #define EXYNOS_LOG_TAG "EXYNOS_BASE_COMP"
45 #define EXYNOS_LOG_OFF
46 //#define EXYNOS_TRACE_ON
47 #include "Exynos_OSAL_Log.h"
50 /* Change CHECK_SIZE_VERSION Macro */
51 OMX_ERRORTYPE Exynos_OMX_Check_SizeVersion(OMX_PTR header, OMX_U32 size)
53 OMX_ERRORTYPE ret = OMX_ErrorNone;
55 OMX_VERSIONTYPE* version = NULL;
57 ret = OMX_ErrorBadParameter;
60 version = (OMX_VERSIONTYPE*)((char*)header + sizeof(OMX_U32));
61 if (*((OMX_U32*)header) != size) {
62 ret = OMX_ErrorBadParameter;
65 if (version->s.nVersionMajor != VERSIONMAJOR_NUMBER ||
66 version->s.nVersionMinor != VERSIONMINOR_NUMBER) {
67 ret = OMX_ErrorVersionMismatch;
75 OMX_ERRORTYPE Exynos_OMX_GetComponentVersion(
76 OMX_IN OMX_HANDLETYPE hComponent,
77 OMX_OUT OMX_STRING pComponentName,
78 OMX_OUT OMX_VERSIONTYPE *pComponentVersion,
79 OMX_OUT OMX_VERSIONTYPE *pSpecVersion,
80 OMX_OUT OMX_UUIDTYPE *pComponentUUID)
82 OMX_ERRORTYPE ret = OMX_ErrorNone;
83 OMX_COMPONENTTYPE *pOMXComponent = NULL;
84 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
89 /* check parameters */
90 if (hComponent == NULL ||
91 pComponentName == NULL || pComponentVersion == NULL ||
92 pSpecVersion == NULL || pComponentUUID == NULL) {
93 ret = OMX_ErrorBadParameter;
96 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
97 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
98 if (ret != OMX_ErrorNone) {
102 if (pOMXComponent->pComponentPrivate == NULL) {
103 ret = OMX_ErrorBadParameter;
106 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
108 if (pExynosComponent->currentState == OMX_StateInvalid) {
109 ret = OMX_ErrorInvalidState;
113 Exynos_OSAL_Strcpy(pComponentName, pExynosComponent->componentName);
114 Exynos_OSAL_Memcpy(pComponentVersion, &(pExynosComponent->componentVersion), sizeof(OMX_VERSIONTYPE));
115 Exynos_OSAL_Memcpy(pSpecVersion, &(pExynosComponent->specVersion), sizeof(OMX_VERSIONTYPE));
117 /* Fill UUID with handle address, PID and UID.
118 * This should guarantee uiniqness */
119 compUUID[0] = (OMX_U32)pOMXComponent;
120 compUUID[1] = getpid();
121 compUUID[2] = getuid();
122 Exynos_OSAL_Memcpy(*pComponentUUID, compUUID, 3 * sizeof(*compUUID));
132 OMX_ERRORTYPE Exynos_OMX_GetState (
133 OMX_IN OMX_HANDLETYPE hComponent,
134 OMX_OUT OMX_STATETYPE *pState)
136 OMX_ERRORTYPE ret = OMX_ErrorNone;
137 OMX_COMPONENTTYPE *pOMXComponent = NULL;
138 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
142 if (hComponent == NULL || pState == NULL) {
143 ret = OMX_ErrorBadParameter;
146 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
147 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
148 if (ret != OMX_ErrorNone) {
152 if (pOMXComponent->pComponentPrivate == NULL) {
153 ret = OMX_ErrorBadParameter;
156 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
158 *pState = pExynosComponent->currentState;
167 OMX_ERRORTYPE Exynos_OMX_ComponentStateSet(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 messageParam)
169 OMX_ERRORTYPE ret = OMX_ErrorNone;
170 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
171 EXYNOS_OMX_MESSAGE *message;
172 OMX_STATETYPE destState = messageParam;
173 OMX_STATETYPE currentState = pExynosComponent->currentState;
174 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
175 unsigned int i = 0, j = 0;
180 /* check parameters */
181 if (currentState == destState) {
182 ret = OMX_ErrorSameState;
185 if (currentState == OMX_StateInvalid) {
186 ret = OMX_ErrorInvalidState;
190 if ((currentState == OMX_StateLoaded) && (destState == OMX_StateIdle)) {
191 ret = Exynos_OMX_Get_Resource(pOMXComponent);
192 if (ret != OMX_ErrorNone) {
196 if (((currentState == OMX_StateIdle) && (destState == OMX_StateLoaded)) ||
197 ((currentState == OMX_StateIdle) && (destState == OMX_StateInvalid)) ||
198 ((currentState == OMX_StateExecuting) && (destState == OMX_StateInvalid)) ||
199 ((currentState == OMX_StatePause) && (destState == OMX_StateInvalid))) {
200 Exynos_OMX_Release_Resource(pOMXComponent);
203 #ifndef TIZEN_FEATURE_E3250
204 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "destState: %d", destState);
206 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "destState: %d", destState);
209 case OMX_StateInvalid:
210 switch (currentState) {
211 case OMX_StateWaitForResources:
212 Exynos_OMX_Out_WaitForResource(pOMXComponent);
214 case OMX_StateExecuting:
216 case OMX_StateLoaded:
217 pExynosComponent->currentState = OMX_StateInvalid;
218 ret = pExynosComponent->exynos_BufferProcessTerminate(pOMXComponent);
220 for (i = 0; i < ALL_PORT_NUM; i++) {
221 if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
222 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
223 pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
224 } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
225 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
226 pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
227 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
228 pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
230 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
231 pExynosComponent->pExynosPort[i].hPortMutex = NULL;
234 if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
235 Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
236 pExynosComponent->pauseEvent = NULL;
238 for (i = 0; i < ALL_PORT_NUM; i++) {
239 Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
240 pExynosComponent->pExynosPort[i].pauseEvent = NULL;
241 if (pExynosComponent->pExynosPort[i].bufferProcessType & BUFFER_SHARE) {
242 Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
243 pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
247 for (i = 0; i < ALL_PORT_NUM; i++) {
248 Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
249 pExynosComponent->pExynosPort[i].bufferSemID = NULL;
251 if (pExynosComponent->exynos_codec_componentTerminate != NULL)
252 pExynosComponent->exynos_codec_componentTerminate(pOMXComponent);
254 ret = OMX_ErrorInvalidState;
257 ret = OMX_ErrorInvalidState;
261 case OMX_StateLoaded:
262 switch (currentState) {
264 ret = pExynosComponent->exynos_BufferProcessTerminate(pOMXComponent);
266 for (i = 0; i < ALL_PORT_NUM; i++) {
267 if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
268 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
269 pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
270 } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
271 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
272 pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
273 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
274 pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
276 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
277 pExynosComponent->pExynosPort[i].hPortMutex = NULL;
279 if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
280 Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
281 pExynosComponent->pauseEvent = NULL;
283 for (i = 0; i < ALL_PORT_NUM; i++) {
284 Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
285 pExynosComponent->pExynosPort[i].pauseEvent = NULL;
286 if (pExynosComponent->pExynosPort[i].bufferProcessType & BUFFER_SHARE) {
287 Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
288 pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
292 for (i = 0; i < ALL_PORT_NUM; i++) {
293 Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
294 pExynosComponent->pExynosPort[i].bufferSemID = NULL;
297 pExynosComponent->exynos_codec_componentTerminate(pOMXComponent);
299 for (i = 0; i < (pExynosComponent->portParam.nPorts); i++) {
300 pExynosPort = (pExynosComponent->pExynosPort + i);
301 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
302 while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
303 message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
305 Exynos_OSAL_Free(message);
307 ret = pExynosComponent->exynos_FreeTunnelBuffer(pExynosPort, i);
308 if (OMX_ErrorNone != ret) {
312 if (CHECK_PORT_ENABLED(pExynosPort)) {
313 Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource);
314 while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
315 message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
317 Exynos_OSAL_Free(message);
319 pExynosPort->portDefinition.bPopulated = OMX_FALSE;
323 pExynosComponent->currentState = OMX_StateLoaded;
325 case OMX_StateWaitForResources:
326 ret = Exynos_OMX_Out_WaitForResource(pOMXComponent);
327 pExynosComponent->currentState = OMX_StateLoaded;
329 case OMX_StateExecuting:
332 ret = OMX_ErrorIncorrectStateTransition;
337 switch (currentState) {
338 case OMX_StateLoaded:
339 for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
340 pExynosPort = (pExynosComponent->pExynosPort + i);
341 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
342 if (CHECK_PORT_ENABLED(pExynosPort)) {
343 ret = pExynosComponent->exynos_AllocateTunnelBuffer(pExynosPort, i);
344 if (ret!=OMX_ErrorNone)
348 if (CHECK_PORT_ENABLED(pExynosPort)) {
349 Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[i].loadedResource);
350 pExynosPort->portDefinition.bPopulated = OMX_TRUE;
354 ret = pExynosComponent->exynos_codec_componentInit(pOMXComponent);
355 if (ret != OMX_ErrorNone) {
357 * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free
361 if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
362 Exynos_OSAL_SignalCreate(&pExynosComponent->pauseEvent);
364 for (i = 0; i < ALL_PORT_NUM; i++) {
365 Exynos_OSAL_SignalCreate(&pExynosComponent->pExynosPort[i].pauseEvent);
366 if (pExynosComponent->pExynosPort[i].bufferProcessType & BUFFER_SHARE)
367 Exynos_OSAL_SignalCreate(&pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
370 for (i = 0; i < ALL_PORT_NUM; i++) {
371 ret = Exynos_OSAL_SemaphoreCreate(&pExynosComponent->pExynosPort[i].bufferSemID);
372 if (ret != OMX_ErrorNone) {
373 ret = OMX_ErrorInsufficientResources;
374 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
378 for (i = 0; i < ALL_PORT_NUM; i++) {
379 if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
380 ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
381 if (ret != OMX_ErrorNone) {
382 ret = OMX_ErrorInsufficientResources;
383 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
386 } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
387 ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
388 if (ret != OMX_ErrorNone) {
389 ret = OMX_ErrorInsufficientResources;
390 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
393 ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
394 if (ret != OMX_ErrorNone) {
395 ret = OMX_ErrorInsufficientResources;
396 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
400 ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].hPortMutex);
401 if (ret != OMX_ErrorNone) {
402 ret = OMX_ErrorInsufficientResources;
407 ret = pExynosComponent->exynos_BufferProcessCreate(pOMXComponent);
408 if (ret != OMX_ErrorNone) {
410 * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free
412 if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
413 Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
414 pExynosComponent->pauseEvent = NULL;
416 for (i = 0; i < ALL_PORT_NUM; i++) {
417 Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
418 pExynosComponent->pExynosPort[i].pauseEvent = NULL;
419 if (pExynosComponent->pExynosPort[i].bufferProcessType & BUFFER_SHARE) {
420 Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
421 pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
425 for (i = 0; i < ALL_PORT_NUM; i++) {
426 if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
427 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
428 pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
429 } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
430 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
431 pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
432 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
433 pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
435 Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
436 pExynosComponent->pExynosPort[i].hPortMutex = NULL;
438 for (i = 0; i < ALL_PORT_NUM; i++) {
439 Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
440 pExynosComponent->pExynosPort[i].bufferSemID = NULL;
443 ret = OMX_ErrorInsufficientResources;
446 pExynosComponent->currentState = OMX_StateIdle;
448 case OMX_StateExecuting:
450 Exynos_OMX_BufferFlushProcess(pOMXComponent, ALL_PORT_INDEX, OMX_FALSE);
451 pExynosComponent->currentState = OMX_StateIdle;
453 case OMX_StateWaitForResources:
454 pExynosComponent->currentState = OMX_StateIdle;
457 ret = OMX_ErrorIncorrectStateTransition;
461 case OMX_StateExecuting:
462 switch (currentState) {
463 case OMX_StateLoaded:
464 ret = OMX_ErrorIncorrectStateTransition;
467 for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
468 pExynosPort = &pExynosComponent->pExynosPort[i];
469 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort) && CHECK_PORT_ENABLED(pExynosPort)) {
470 for (j = 0; j < pExynosPort->tunnelBufferNum; j++) {
471 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
476 pExynosComponent->transientState = EXYNOS_OMX_TransStateMax;
477 pExynosComponent->currentState = OMX_StateExecuting;
478 if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
479 Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
481 for (i = 0; i < ALL_PORT_NUM; i++) {
482 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[i].pauseEvent);
487 for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
488 pExynosPort = &pExynosComponent->pExynosPort[i];
489 if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort) && CHECK_PORT_ENABLED(pExynosPort)) {
490 OMX_S32 semaValue = 0, cnt = 0;
491 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[i].bufferSemID, &semaValue);
492 if (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > semaValue) {
493 cnt = Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) - semaValue;
494 for (k = 0; k < cnt; k++) {
495 Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
501 pExynosComponent->currentState = OMX_StateExecuting;
502 if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
503 Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
505 for (i = 0; i < ALL_PORT_NUM; i++) {
506 Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[i].pauseEvent);
510 case OMX_StateWaitForResources:
511 ret = OMX_ErrorIncorrectStateTransition;
514 ret = OMX_ErrorIncorrectStateTransition;
519 switch (currentState) {
520 case OMX_StateLoaded:
521 ret = OMX_ErrorIncorrectStateTransition;
524 pExynosComponent->currentState = OMX_StatePause;
526 case OMX_StateExecuting:
527 pExynosComponent->currentState = OMX_StatePause;
529 case OMX_StateWaitForResources:
530 ret = OMX_ErrorIncorrectStateTransition;
533 ret = OMX_ErrorIncorrectStateTransition;
537 case OMX_StateWaitForResources:
538 switch (currentState) {
539 case OMX_StateLoaded:
540 ret = Exynos_OMX_In_WaitForResource(pOMXComponent);
541 pExynosComponent->currentState = OMX_StateWaitForResources;
544 case OMX_StateExecuting:
546 ret = OMX_ErrorIncorrectStateTransition;
549 ret = OMX_ErrorIncorrectStateTransition;
554 ret = OMX_ErrorIncorrectStateTransition;
559 if (ret == OMX_ErrorNone) {
560 if (pExynosComponent->pCallbacks != NULL) {
561 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
562 pExynosComponent->callbackData,
563 OMX_EventCmdComplete, OMX_CommandStateSet,
567 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s:%d", __FUNCTION__, __LINE__);
568 if (pExynosComponent->pCallbacks != NULL) {
569 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
570 pExynosComponent->callbackData,
571 OMX_EventError, ret, 0, NULL);
579 static OMX_ERRORTYPE Exynos_OMX_MessageHandlerThread(OMX_PTR threadData)
581 OMX_ERRORTYPE ret = OMX_ErrorNone;
582 OMX_COMPONENTTYPE *pOMXComponent = NULL;
583 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
584 EXYNOS_OMX_MESSAGE *message = NULL;
585 OMX_U32 messageType = 0, portIndex = 0;
589 if (threadData == NULL) {
590 ret = OMX_ErrorBadParameter;
594 pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
595 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
596 if (ret != OMX_ErrorNone) {
600 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
602 while (pExynosComponent->bExitMessageHandlerThread == OMX_FALSE) {
603 Exynos_OSAL_SemaphoreWait(pExynosComponent->msgSemaphoreHandle);
604 message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosComponent->messageQ);
605 if (message != NULL) {
606 messageType = message->messageType;
607 switch (messageType) {
608 case OMX_CommandStateSet:
609 ret = Exynos_OMX_ComponentStateSet(pOMXComponent, message->messageParam);
611 case OMX_CommandFlush:
612 ret = Exynos_OMX_BufferFlushProcess(pOMXComponent, message->messageParam, OMX_TRUE);
614 case OMX_CommandPortDisable:
615 ret = Exynos_OMX_PortDisableProcess(pOMXComponent, message->messageParam);
617 case OMX_CommandPortEnable:
618 ret = Exynos_OMX_PortEnableProcess(pOMXComponent, message->messageParam);
620 case OMX_CommandMarkBuffer:
621 portIndex = message->messageParam;
622 pExynosComponent->pExynosPort[portIndex].markType.hMarkTargetComponent = ((OMX_MARKTYPE *)message->pCmdData)->hMarkTargetComponent;
623 pExynosComponent->pExynosPort[portIndex].markType.pMarkData = ((OMX_MARKTYPE *)message->pCmdData)->pMarkData;
625 case (OMX_COMMANDTYPE)EXYNOS_OMX_CommandComponentDeInit:
626 pExynosComponent->bExitMessageHandlerThread = OMX_TRUE;
631 Exynos_OSAL_Free(message);
636 Exynos_OSAL_ThreadExit(NULL);
644 static OMX_ERRORTYPE Exynos_StateSet(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
646 OMX_U32 destState = nParam;
649 if ((destState == OMX_StateIdle) && (pExynosComponent->currentState == OMX_StateLoaded)) {
650 pExynosComponent->transientState = EXYNOS_OMX_TransStateLoadedToIdle;
651 for(i = 0; i < pExynosComponent->portParam.nPorts; i++) {
652 pExynosComponent->pExynosPort[i].portState = OMX_StateIdle;
654 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateIdle");
655 } else if ((destState == OMX_StateLoaded) && (pExynosComponent->currentState == OMX_StateIdle)) {
656 pExynosComponent->transientState = EXYNOS_OMX_TransStateIdleToLoaded;
657 for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
658 pExynosComponent->pExynosPort[i].portState = OMX_StateLoaded;
660 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateLoaded");
661 } else if ((destState == OMX_StateIdle) && (pExynosComponent->currentState == OMX_StateExecuting)) {
662 pExynosComponent->transientState = EXYNOS_OMX_TransStateExecutingToIdle;
663 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateIdle");
664 } else if ((destState == OMX_StateExecuting) && (pExynosComponent->currentState == OMX_StateIdle)) {
665 pExynosComponent->transientState = EXYNOS_OMX_TransStateIdleToExecuting;
666 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateExecuting");
667 } else if (destState == OMX_StateInvalid) {
668 for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
669 pExynosComponent->pExynosPort[i].portState = OMX_StateInvalid;
673 return OMX_ErrorNone;
676 static OMX_ERRORTYPE Exynos_SetPortFlush(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
678 OMX_ERRORTYPE ret = OMX_ErrorNone;
679 OMX_S32 portIndex = nParam;
680 OMX_U16 i = 0, cnt = 0, index = 0;
683 if ((pExynosComponent->currentState == OMX_StateExecuting) ||
684 (pExynosComponent->currentState == OMX_StatePause)) {
685 if ((portIndex != ALL_PORT_INDEX) &&
686 ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
687 ret = OMX_ErrorBadPortIndex;
691 /*********************
692 * need flush event set ?????
693 **********************/
694 cnt = (portIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
695 for (i = 0; i < cnt; i++) {
696 if (portIndex == ALL_PORT_INDEX)
700 pExynosComponent->pExynosPort[index].bIsPortFlushed = OMX_TRUE;
703 ret = OMX_ErrorIncorrectStateOperation;
712 static OMX_ERRORTYPE Exynos_SetPortEnable(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
714 OMX_ERRORTYPE ret = OMX_ErrorNone;
715 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
716 OMX_S32 portIndex = nParam;
721 if ((portIndex != ALL_PORT_INDEX) &&
722 ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
723 ret = OMX_ErrorBadPortIndex;
727 if (portIndex == ALL_PORT_INDEX) {
728 for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
729 pExynosPort = &pExynosComponent->pExynosPort[i];
730 if (CHECK_PORT_ENABLED(pExynosPort)) {
731 ret = OMX_ErrorIncorrectStateOperation;
734 pExynosPort->portState = OMX_StateIdle;
738 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
739 if (CHECK_PORT_ENABLED(pExynosPort)) {
740 ret = OMX_ErrorIncorrectStateOperation;
743 pExynosPort->portState = OMX_StateIdle;
755 static OMX_ERRORTYPE Exynos_SetPortDisable(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
757 OMX_ERRORTYPE ret = OMX_ErrorNone;
758 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
759 OMX_S32 portIndex = nParam;
764 if ((portIndex != ALL_PORT_INDEX) &&
765 ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
766 ret = OMX_ErrorBadPortIndex;
770 if (portIndex == ALL_PORT_INDEX) {
771 for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
772 pExynosPort = &pExynosComponent->pExynosPort[i];
773 if (!CHECK_PORT_ENABLED(pExynosPort)) {
774 ret = OMX_ErrorIncorrectStateOperation;
777 pExynosPort->portState = OMX_StateLoaded;
778 pExynosPort->bIsPortDisabled = OMX_TRUE;
781 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
782 pExynosPort->portState = OMX_StateLoaded;
783 pExynosPort->bIsPortDisabled = OMX_TRUE;
793 static OMX_ERRORTYPE Exynos_SetMarkBuffer(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
795 OMX_ERRORTYPE ret = OMX_ErrorNone;
797 if (nParam >= pExynosComponent->portParam.nPorts) {
798 ret = OMX_ErrorBadPortIndex;
802 if ((pExynosComponent->currentState == OMX_StateExecuting) ||
803 (pExynosComponent->currentState == OMX_StatePause)) {
806 ret = OMX_ErrorIncorrectStateOperation;
813 static OMX_ERRORTYPE Exynos_OMX_CommandQueue(
814 EXYNOS_OMX_BASECOMPONENT *pExynosComponent,
819 OMX_ERRORTYPE ret = OMX_ErrorNone;
820 EXYNOS_OMX_MESSAGE *command = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
822 if (command == NULL) {
823 ret = OMX_ErrorInsufficientResources;
826 command->messageType = (OMX_U32)Cmd;
827 command->messageParam = nParam;
828 command->pCmdData = pCmdData;
830 ret = Exynos_OSAL_Queue(&pExynosComponent->messageQ, (void *)command);
832 ret = OMX_ErrorUndefined;
835 ret = Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
841 OMX_ERRORTYPE Exynos_OMX_SendCommand(
842 OMX_IN OMX_HANDLETYPE hComponent,
843 OMX_IN OMX_COMMANDTYPE Cmd,
844 OMX_IN OMX_U32 nParam,
845 OMX_IN OMX_PTR pCmdData)
847 OMX_ERRORTYPE ret = OMX_ErrorNone;
848 OMX_COMPONENTTYPE *pOMXComponent = NULL;
849 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
853 if (hComponent == NULL) {
854 ret = OMX_ErrorBadParameter;
857 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
858 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
859 if (ret != OMX_ErrorNone) {
863 if (pOMXComponent->pComponentPrivate == NULL) {
864 ret = OMX_ErrorBadParameter;
867 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
869 if (pExynosComponent->currentState == OMX_StateInvalid) {
870 ret = OMX_ErrorInvalidState;
875 case OMX_CommandStateSet :
876 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandStateSet");
877 Exynos_StateSet(pExynosComponent, nParam);
879 case OMX_CommandFlush :
880 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandFlush");
881 ret = Exynos_SetPortFlush(pExynosComponent, nParam);
882 if (ret != OMX_ErrorNone)
885 case OMX_CommandPortDisable :
886 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandPortDisable");
887 ret = Exynos_SetPortDisable(pExynosComponent, nParam);
888 if (ret != OMX_ErrorNone)
891 case OMX_CommandPortEnable :
892 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandPortEnable");
893 ret = Exynos_SetPortEnable(pExynosComponent, nParam);
894 if (ret != OMX_ErrorNone)
897 case OMX_CommandMarkBuffer :
898 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandMarkBuffer");
899 ret = Exynos_SetMarkBuffer(pExynosComponent, nParam);
900 if (ret != OMX_ErrorNone)
907 ret = Exynos_OMX_CommandQueue(pExynosComponent, Cmd, nParam, pCmdData);
915 OMX_ERRORTYPE Exynos_OMX_GetParameter(
916 OMX_IN OMX_HANDLETYPE hComponent,
917 OMX_IN OMX_INDEXTYPE nParamIndex,
918 OMX_INOUT OMX_PTR ComponentParameterStructure)
920 OMX_ERRORTYPE ret = OMX_ErrorNone;
921 OMX_COMPONENTTYPE *pOMXComponent = NULL;
922 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
926 if (hComponent == NULL) {
927 ret = OMX_ErrorBadParameter;
930 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
931 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
932 if (ret != OMX_ErrorNone) {
936 if (pOMXComponent->pComponentPrivate == NULL) {
937 ret = OMX_ErrorBadParameter;
940 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
942 if (ComponentParameterStructure == NULL) {
943 ret = OMX_ErrorBadParameter;
946 if (pExynosComponent->currentState == OMX_StateInvalid) {
947 ret = OMX_ErrorInvalidState;
951 switch (nParamIndex) {
952 case OMX_IndexParamAudioInit:
953 case OMX_IndexParamVideoInit:
954 case OMX_IndexParamImageInit:
955 case OMX_IndexParamOtherInit:
957 OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
958 ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
959 if (ret != OMX_ErrorNone) {
962 portParam->nPorts = 0;
963 portParam->nStartPortNumber = 0;
966 case OMX_IndexParamPortDefinition:
968 OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
969 OMX_U32 portIndex = portDefinition->nPortIndex;
970 EXYNOS_OMX_BASEPORT *pExynosPort;
972 if (portIndex >= pExynosComponent->portParam.nPorts) {
973 ret = OMX_ErrorBadPortIndex;
976 ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
977 if (ret != OMX_ErrorNone) {
981 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
982 Exynos_OSAL_Memcpy(portDefinition, &pExynosPort->portDefinition, portDefinition->nSize);
985 case OMX_IndexParamPriorityMgmt:
987 OMX_PRIORITYMGMTTYPE *compPriority = (OMX_PRIORITYMGMTTYPE *)ComponentParameterStructure;
989 ret = Exynos_OMX_Check_SizeVersion(compPriority, sizeof(OMX_PRIORITYMGMTTYPE));
990 if (ret != OMX_ErrorNone) {
994 compPriority->nGroupID = pExynosComponent->compPriority.nGroupID;
995 compPriority->nGroupPriority = pExynosComponent->compPriority.nGroupPriority;
999 case OMX_IndexParamCompBufferSupplier:
1001 OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
1002 OMX_U32 portIndex = bufferSupplier->nPortIndex;
1003 EXYNOS_OMX_BASEPORT *pExynosPort;
1005 if ((pExynosComponent->currentState == OMX_StateLoaded) ||
1006 (pExynosComponent->currentState == OMX_StateWaitForResources)) {
1007 if (portIndex >= pExynosComponent->portParam.nPorts) {
1008 ret = OMX_ErrorBadPortIndex;
1011 ret = Exynos_OMX_Check_SizeVersion(bufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
1012 if (ret != OMX_ErrorNone) {
1016 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1019 if (pExynosPort->portDefinition.eDir == OMX_DirInput) {
1020 if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
1021 bufferSupplier->eBufferSupplier = OMX_BufferSupplyInput;
1022 } else if (CHECK_PORT_TUNNELED(pExynosPort)) {
1023 bufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput;
1025 bufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
1028 if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
1029 bufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput;
1030 } else if (CHECK_PORT_TUNNELED(pExynosPort)) {
1031 bufferSupplier->eBufferSupplier = OMX_BufferSupplyInput;
1033 bufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
1039 ret = OMX_ErrorIncorrectStateOperation;
1046 ret = OMX_ErrorUnsupportedIndex;
1052 ret = OMX_ErrorNone;
1061 OMX_ERRORTYPE Exynos_OMX_SetParameter(
1062 OMX_IN OMX_HANDLETYPE hComponent,
1063 OMX_IN OMX_INDEXTYPE nIndex,
1064 OMX_IN OMX_PTR ComponentParameterStructure)
1066 OMX_ERRORTYPE ret = OMX_ErrorNone;
1067 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1068 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1072 if (hComponent == NULL) {
1073 ret = OMX_ErrorBadParameter;
1076 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1077 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1078 if (ret != OMX_ErrorNone) {
1082 if (pOMXComponent->pComponentPrivate == NULL) {
1083 ret = OMX_ErrorBadParameter;
1086 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1088 if (ComponentParameterStructure == NULL) {
1089 ret = OMX_ErrorBadParameter;
1092 if (pExynosComponent->currentState == OMX_StateInvalid) {
1093 ret = OMX_ErrorInvalidState;
1098 case OMX_IndexParamAudioInit:
1099 case OMX_IndexParamVideoInit:
1100 case OMX_IndexParamImageInit:
1101 case OMX_IndexParamOtherInit:
1103 OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
1104 ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
1105 if (ret != OMX_ErrorNone) {
1109 if ((pExynosComponent->currentState != OMX_StateLoaded) &&
1110 (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1111 ret = OMX_ErrorIncorrectStateOperation;
1114 ret = OMX_ErrorUndefined;
1115 /* Exynos_OSAL_Memcpy(&pExynosComponent->portParam, portParam, sizeof(OMX_PORT_PARAM_TYPE)); */
1118 case OMX_IndexParamPortDefinition:
1120 OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
1121 OMX_U32 portIndex = portDefinition->nPortIndex;
1122 EXYNOS_OMX_BASEPORT *pExynosPort;
1123 OMX_PARAM_PORTDEFINITIONTYPE portDefinition_backup;
1125 if (portIndex >= pExynosComponent->portParam.nPorts) {
1126 ret = OMX_ErrorBadPortIndex;
1129 ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
1130 if (ret != OMX_ErrorNone) {
1134 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1136 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1137 if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
1138 ret = OMX_ErrorIncorrectStateOperation;
1142 if (portDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
1143 ret = OMX_ErrorBadParameter;
1147 Exynos_OSAL_Memcpy(&portDefinition_backup, &pExynosPort->portDefinition, portDefinition->nSize);
1148 Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, portDefinition, portDefinition->nSize);
1149 RESTORE_READONLYPARAMETERS_OMX_PARAM_PORTDEFINITIONTYPE(&pExynosPort->portDefinition,&portDefinition_backup);
1152 case OMX_IndexParamPriorityMgmt:
1154 OMX_PRIORITYMGMTTYPE *compPriority = (OMX_PRIORITYMGMTTYPE *)ComponentParameterStructure;
1156 if ((pExynosComponent->currentState != OMX_StateLoaded) &&
1157 (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1158 ret = OMX_ErrorIncorrectStateOperation;
1162 ret = Exynos_OMX_Check_SizeVersion(compPriority, sizeof(OMX_PRIORITYMGMTTYPE));
1163 if (ret != OMX_ErrorNone) {
1167 pExynosComponent->compPriority.nGroupID = compPriority->nGroupID;
1168 pExynosComponent->compPriority.nGroupPriority = compPriority->nGroupPriority;
1171 case OMX_IndexParamCompBufferSupplier:
1173 OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
1174 OMX_U32 portIndex = bufferSupplier->nPortIndex;
1175 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
1178 if (portIndex >= pExynosComponent->portParam.nPorts) {
1179 ret = OMX_ErrorBadPortIndex;
1182 ret = Exynos_OMX_Check_SizeVersion(bufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
1183 if (ret != OMX_ErrorNone) {
1187 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
1188 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
1189 if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
1190 ret = OMX_ErrorIncorrectStateOperation;
1195 if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyUnspecified) {
1196 ret = OMX_ErrorNone;
1199 if (CHECK_PORT_TUNNELED(pExynosPort) == 0) {
1200 ret = OMX_ErrorNone; /*OMX_ErrorNone ?????*/
1204 if (pExynosPort->portDefinition.eDir == OMX_DirInput) {
1205 if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) {
1207 if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
1208 ret = OMX_ErrorNone;
1211 pExynosPort->tunnelFlags |= EXYNOS_TUNNEL_IS_SUPPLIER;
1212 bufferSupplier->nPortIndex = pExynosPort->tunneledPort;
1213 ret = OMX_SetParameter(pExynosPort->tunneledComponent, OMX_IndexParamCompBufferSupplier, bufferSupplier);
1215 } else if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) {
1216 ret = OMX_ErrorNone;
1217 if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
1218 pExynosPort->tunnelFlags &= ~EXYNOS_TUNNEL_IS_SUPPLIER;
1219 bufferSupplier->nPortIndex = pExynosPort->tunneledPort;
1220 ret = OMX_SetParameter(pExynosPort->tunneledComponent, OMX_IndexParamCompBufferSupplier, bufferSupplier);
1224 } else if (pExynosPort->portDefinition.eDir == OMX_DirOutput) {
1225 if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) {
1226 ret = OMX_ErrorNone;
1227 if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
1228 pExynosPort->tunnelFlags &= ~EXYNOS_TUNNEL_IS_SUPPLIER;
1229 ret = OMX_ErrorNone;
1232 } else if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) {
1234 if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
1235 ret = OMX_ErrorNone;
1238 pExynosPort->tunnelFlags |= EXYNOS_TUNNEL_IS_SUPPLIER;
1239 ret = OMX_ErrorNone;
1247 ret = OMX_ErrorUnsupportedIndex;
1253 ret = OMX_ErrorNone;
1262 OMX_ERRORTYPE Exynos_OMX_GetConfig(
1263 OMX_IN OMX_HANDLETYPE hComponent,
1264 OMX_IN OMX_INDEXTYPE nIndex,
1265 OMX_INOUT OMX_PTR pComponentConfigStructure)
1267 OMX_ERRORTYPE ret = OMX_ErrorNone;
1268 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1269 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1273 if (hComponent == NULL) {
1274 ret = OMX_ErrorBadParameter;
1277 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1278 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1279 if (ret != OMX_ErrorNone) {
1283 if (pOMXComponent->pComponentPrivate == NULL) {
1284 ret = OMX_ErrorBadParameter;
1287 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1289 if (pComponentConfigStructure == NULL) {
1290 ret = OMX_ErrorBadParameter;
1293 if (pExynosComponent->currentState == OMX_StateInvalid) {
1294 ret = OMX_ErrorInvalidState;
1300 ret = OMX_ErrorUnsupportedIndex;
1310 OMX_ERRORTYPE Exynos_OMX_SetConfig(
1311 OMX_IN OMX_HANDLETYPE hComponent,
1312 OMX_IN OMX_INDEXTYPE nIndex,
1313 OMX_IN OMX_PTR pComponentConfigStructure)
1315 OMX_ERRORTYPE ret = OMX_ErrorNone;
1316 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1317 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1321 if (hComponent == NULL) {
1322 ret = OMX_ErrorBadParameter;
1325 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1326 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1327 if (ret != OMX_ErrorNone) {
1331 if (pOMXComponent->pComponentPrivate == NULL) {
1332 ret = OMX_ErrorBadParameter;
1335 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1337 if (pComponentConfigStructure == NULL) {
1338 ret = OMX_ErrorBadParameter;
1341 if (pExynosComponent->currentState == OMX_StateInvalid) {
1342 ret = OMX_ErrorInvalidState;
1348 ret = OMX_ErrorUnsupportedIndex;
1358 OMX_ERRORTYPE Exynos_OMX_GetExtensionIndex(
1359 OMX_IN OMX_HANDLETYPE hComponent,
1360 OMX_IN OMX_STRING cParameterName,
1361 OMX_OUT OMX_INDEXTYPE *pIndexType)
1363 OMX_ERRORTYPE ret = OMX_ErrorNone;
1364 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1365 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1369 if (hComponent == NULL) {
1370 ret = OMX_ErrorBadParameter;
1373 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1374 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1375 if (ret != OMX_ErrorNone) {
1379 if (pOMXComponent->pComponentPrivate == NULL) {
1380 ret = OMX_ErrorBadParameter;
1383 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1385 if ((cParameterName == NULL) || (pIndexType == NULL)) {
1386 ret = OMX_ErrorBadParameter;
1389 if (pExynosComponent->currentState == OMX_StateInvalid) {
1390 ret = OMX_ErrorInvalidState;
1394 ret = OMX_ErrorBadParameter;
1402 OMX_ERRORTYPE Exynos_OMX_SetCallbacks (
1403 OMX_IN OMX_HANDLETYPE hComponent,
1404 OMX_IN OMX_CALLBACKTYPE* pCallbacks,
1405 OMX_IN OMX_PTR pAppData)
1407 OMX_ERRORTYPE ret = OMX_ErrorNone;
1408 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1409 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1413 if (hComponent == NULL) {
1414 ret = OMX_ErrorBadParameter;
1417 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1418 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1419 if (ret != OMX_ErrorNone) {
1423 if (pOMXComponent->pComponentPrivate == NULL) {
1424 ret = OMX_ErrorBadParameter;
1427 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1429 if (pCallbacks == NULL) {
1430 ret = OMX_ErrorBadParameter;
1433 if (pExynosComponent->currentState == OMX_StateInvalid) {
1434 ret = OMX_ErrorInvalidState;
1437 if (pExynosComponent->currentState != OMX_StateLoaded) {
1438 ret = OMX_ErrorIncorrectStateOperation;
1442 pExynosComponent->pCallbacks = pCallbacks;
1443 pExynosComponent->callbackData = pAppData;
1445 ret = OMX_ErrorNone;
1453 OMX_ERRORTYPE Exynos_OMX_UseEGLImage(
1454 OMX_IN OMX_HANDLETYPE hComponent,
1455 OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
1456 OMX_IN OMX_U32 nPortIndex,
1457 OMX_IN OMX_PTR pAppPrivate,
1458 OMX_IN void *eglImage)
1460 return OMX_ErrorNotImplemented;
1463 OMX_ERRORTYPE Exynos_OMX_BaseComponent_Constructor(
1464 OMX_IN OMX_HANDLETYPE hComponent)
1466 OMX_ERRORTYPE ret = OMX_ErrorNone;
1467 OMX_COMPONENTTYPE *pOMXComponent;
1468 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1472 if (hComponent == NULL) {
1473 ret = OMX_ErrorBadParameter;
1474 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
1477 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1478 pExynosComponent = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASECOMPONENT));
1479 if (pExynosComponent == NULL) {
1480 ret = OMX_ErrorInsufficientResources;
1481 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1484 Exynos_OSAL_Memset(pExynosComponent, 0, sizeof(EXYNOS_OMX_BASECOMPONENT));
1485 pOMXComponent->pComponentPrivate = (OMX_PTR)pExynosComponent;
1487 ret = Exynos_OSAL_SemaphoreCreate(&pExynosComponent->msgSemaphoreHandle);
1488 if (ret != OMX_ErrorNone) {
1489 ret = OMX_ErrorInsufficientResources;
1490 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1493 ret = Exynos_OSAL_MutexCreate(&pExynosComponent->compMutex);
1494 if (ret != OMX_ErrorNone) {
1495 ret = OMX_ErrorInsufficientResources;
1496 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1500 pExynosComponent->bExitMessageHandlerThread = OMX_FALSE;
1501 Exynos_OSAL_QueueCreate(&pExynosComponent->messageQ, MAX_QUEUE_ELEMENTS);
1502 ret = Exynos_OSAL_ThreadCreate(&pExynosComponent->hMessageHandler, Exynos_OMX_MessageHandlerThread, pOMXComponent);
1503 if (ret != OMX_ErrorNone) {
1504 ret = OMX_ErrorInsufficientResources;
1505 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
1509 pExynosComponent->bMultiThreadProcess = OMX_FALSE;
1511 pOMXComponent->GetComponentVersion = &Exynos_OMX_GetComponentVersion;
1512 pOMXComponent->SendCommand = &Exynos_OMX_SendCommand;
1513 pOMXComponent->GetState = &Exynos_OMX_GetState;
1514 pOMXComponent->SetCallbacks = &Exynos_OMX_SetCallbacks;
1515 pOMXComponent->UseEGLImage = &Exynos_OMX_UseEGLImage;
1523 OMX_ERRORTYPE Exynos_OMX_BaseComponent_Destructor(
1524 OMX_IN OMX_HANDLETYPE hComponent)
1526 OMX_ERRORTYPE ret = OMX_ErrorNone;
1527 OMX_COMPONENTTYPE *pOMXComponent = NULL;
1528 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
1529 OMX_S32 semaValue = 0;
1533 if (hComponent == NULL) {
1534 ret = OMX_ErrorBadParameter;
1537 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
1538 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
1539 if (ret != OMX_ErrorNone) {
1543 if (pOMXComponent->pComponentPrivate == NULL) {
1544 ret = OMX_ErrorBadParameter;
1547 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
1549 Exynos_OMX_CommandQueue(pExynosComponent, EXYNOS_OMX_CommandComponentDeInit, 0, NULL);
1550 Exynos_OSAL_SleepMillisec(0);
1551 Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->msgSemaphoreHandle, &semaValue);
1553 Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
1554 Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
1556 Exynos_OSAL_ThreadTerminate(pExynosComponent->hMessageHandler);
1557 pExynosComponent->hMessageHandler = NULL;
1559 Exynos_OSAL_MutexTerminate(pExynosComponent->compMutex);
1560 pExynosComponent->compMutex = NULL;
1561 Exynos_OSAL_SemaphoreTerminate(pExynosComponent->msgSemaphoreHandle);
1562 pExynosComponent->msgSemaphoreHandle = NULL;
1563 Exynos_OSAL_QueueTerminate(&pExynosComponent->messageQ);
1565 Exynos_OSAL_Free(pExynosComponent);
1566 pExynosComponent = NULL;
1568 ret = OMX_ErrorNone;