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_Baseport.c
21 * @author SeungBeom Kim (sbcrux.kim@samsung.com)
22 * HyeYeon Chung (hyeon.chung@samsung.com)
32 #include "Exynos_OMX_Macros.h"
33 #include "Exynos_OSAL_Event.h"
34 #include "Exynos_OSAL_Semaphore.h"
35 #include "Exynos_OSAL_Mutex.h"
37 #include "Exynos_OMX_Baseport.h"
38 #include "Exynos_OMX_Basecomponent.h"
41 #define EXYNOS_LOG_TAG "EXYNOS_BASE_PORT"
42 #define EXYNOS_LOG_OFF
43 //#define EXYNOS_TRACE_ON
44 #include "Exynos_OSAL_Log.h"
47 OMX_ERRORTYPE
Exynos_OMX_InputBufferReturn(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_BUFFERHEADERTYPE
* bufferHeader
)
49 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
50 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
51 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
54 Exynos_OSAL_MutexLock(pExynosPort
->hPortMutex
);
55 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
56 if (bufferHeader
== pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
) {
57 pExynosPort
->extendBufferHeader
[i
].bBufferInOMX
= OMX_FALSE
;
61 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
63 if ((bufferHeader
!= NULL
) && (bufferHeader
->pBuffer
!= NULL
))
64 pExynosComponent
->pCallbacks
->EmptyBufferDone(pOMXComponent
, pExynosComponent
->callbackData
, bufferHeader
);
69 OMX_ERRORTYPE
Exynos_OMX_OutputBufferReturn(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_BUFFERHEADERTYPE
* bufferHeader
)
71 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
72 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
73 EXYNOS_OMX_BASEPORT
*pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
76 Exynos_OSAL_MutexLock(pExynosPort
->hPortMutex
);
77 for (i
= 0; i
< MAX_BUFFER_NUM
; i
++) {
78 if (bufferHeader
== pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
) {
79 pExynosPort
->extendBufferHeader
[i
].bBufferInOMX
= OMX_FALSE
;
83 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
85 if ((bufferHeader
!= NULL
) && (bufferHeader
->pBuffer
!= NULL
))
86 pExynosComponent
->pCallbacks
->FillBufferDone(pOMXComponent
, pExynosComponent
->callbackData
, bufferHeader
);
91 OMX_ERRORTYPE
Exynos_OMX_BufferFlushProcess(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 nPortIndex
, OMX_BOOL bEvent
)
93 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
94 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
95 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
96 OMX_S32 portIndex
= 0;
97 EXYNOS_OMX_DATABUFFER
*flushPortBuffer
[2] = {NULL
, NULL
};
98 OMX_U32 i
= 0, cnt
= 0;
102 if (pOMXComponent
== NULL
) {
103 ret
= OMX_ErrorBadParameter
;
106 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
107 if (ret
!= OMX_ErrorNone
) {
111 if (pOMXComponent
->pComponentPrivate
== NULL
) {
112 ret
= OMX_ErrorBadParameter
;
115 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
117 cnt
= (nPortIndex
== ALL_PORT_INDEX
) ? ALL_PORT_NUM
: 1;
119 for (i
= 0; i
< cnt
; i
++) {
120 if (nPortIndex
== ALL_PORT_INDEX
)
123 portIndex
= nPortIndex
;
125 pExynosComponent
->exynos_BufferFlush(pOMXComponent
, portIndex
, bEvent
);
129 if (ret
!= OMX_ErrorNone
) {
130 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
,"%s : %d", __FUNCTION__
, __LINE__
);
132 if ((pOMXComponent
!= NULL
) &&
133 (pExynosComponent
!= NULL
)) {
134 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
135 pExynosComponent
->callbackData
,
146 OMX_ERRORTYPE
Exynos_OMX_EnablePort(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 portIndex
)
148 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
149 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
150 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
151 OMX_U32 i
= 0, cnt
= 0;
155 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
157 if ((pExynosComponent
->currentState
!= OMX_StateLoaded
) && (pExynosComponent
->currentState
!= OMX_StateWaitForResources
)) {
158 Exynos_OSAL_SemaphoreWait(pExynosPort
->loadedResource
);
160 if (pExynosPort
->exceptionFlag
== INVALID_STATE
) {
161 pExynosPort
->exceptionFlag
= NEED_PORT_DISABLE
;
164 pExynosPort
->portDefinition
.bPopulated
= OMX_TRUE
;
166 pExynosPort
->exceptionFlag
= GENERAL_STATE
;
167 pExynosPort
->portDefinition
.bEnabled
= OMX_TRUE
;
177 OMX_ERRORTYPE
Exynos_OMX_PortEnableProcess(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 nPortIndex
)
179 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
180 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
181 OMX_S32 portIndex
= 0;
182 OMX_U32 i
= 0, cnt
= 0;
186 if (pOMXComponent
== NULL
) {
187 ret
= OMX_ErrorBadParameter
;
190 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
191 if (ret
!= OMX_ErrorNone
) {
195 if (pOMXComponent
->pComponentPrivate
== NULL
) {
196 ret
= OMX_ErrorBadParameter
;
199 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
201 cnt
= (nPortIndex
== ALL_PORT_INDEX
) ? ALL_PORT_NUM
: 1;
203 for (i
= 0; i
< cnt
; i
++) {
204 if (nPortIndex
== ALL_PORT_INDEX
)
207 portIndex
= nPortIndex
;
209 ret
= Exynos_OMX_EnablePort(pOMXComponent
, portIndex
);
210 if (ret
== OMX_ErrorNone
) {
211 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
212 pExynosComponent
->callbackData
,
213 OMX_EventCmdComplete
,
214 OMX_CommandPortEnable
, portIndex
, NULL
);
219 if ((ret
!= OMX_ErrorNone
) && (pOMXComponent
!= NULL
) && (pExynosComponent
!= NULL
)) {
220 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
221 pExynosComponent
->callbackData
,
231 OMX_ERRORTYPE
Exynos_OMX_DisablePort(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 portIndex
)
233 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
234 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
235 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
236 OMX_U32 i
= 0, elemNum
= 0;
237 EXYNOS_OMX_MESSAGE
*message
;
241 pExynosPort
= &pExynosComponent
->pExynosPort
[portIndex
];
243 if (!CHECK_PORT_ENABLED(pExynosPort
)) {
248 if (pExynosComponent
->currentState
!= OMX_StateLoaded
) {
249 if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)) {
250 while (Exynos_OSAL_GetElemNum(&pExynosPort
->bufferQ
) > 0) {
251 message
= (EXYNOS_OMX_MESSAGE
*)Exynos_OSAL_Dequeue(&pExynosPort
->bufferQ
);
252 Exynos_OSAL_Free(message
);
255 pExynosPort
->portDefinition
.bPopulated
= OMX_FALSE
;
256 Exynos_OSAL_SemaphoreWait(pExynosPort
->unloadedResource
);
258 pExynosPort
->portDefinition
.bEnabled
= OMX_FALSE
;
267 OMX_ERRORTYPE
Exynos_OMX_PortDisableProcess(OMX_COMPONENTTYPE
*pOMXComponent
, OMX_S32 nPortIndex
)
269 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
270 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
271 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
272 OMX_S32 portIndex
= 0;
273 OMX_U32 i
= 0, cnt
= 0;
274 EXYNOS_OMX_DATABUFFER
*flushPortBuffer
[2] = {NULL
, NULL
};
278 if (pOMXComponent
== NULL
) {
279 ret
= OMX_ErrorBadParameter
;
282 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
283 if (ret
!= OMX_ErrorNone
) {
287 if (pOMXComponent
->pComponentPrivate
== NULL
) {
288 ret
= OMX_ErrorBadParameter
;
291 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
293 cnt
= (nPortIndex
== ALL_PORT_INDEX
) ? ALL_PORT_NUM
: 1;
295 if ((pExynosComponent
->currentState
== OMX_StateExecuting
) ||
296 (pExynosComponent
->currentState
== OMX_StatePause
)) {
298 for(i
= 0; i
< cnt
; i
++) {
299 if (nPortIndex
== ALL_PORT_INDEX
)
302 portIndex
= nPortIndex
;
304 Exynos_OMX_BufferFlushProcess(pOMXComponent
, portIndex
, OMX_FALSE
);
308 for(i
= 0; i
< cnt
; i
++) {
309 if (nPortIndex
== ALL_PORT_INDEX
)
312 portIndex
= nPortIndex
;
314 ret
= Exynos_OMX_DisablePort(pOMXComponent
, portIndex
);
315 pExynosComponent
->pExynosPort
[portIndex
].bIsPortDisabled
= OMX_FALSE
;
316 if (ret
== OMX_ErrorNone
) {
317 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
318 pExynosComponent
->callbackData
,
319 OMX_EventCmdComplete
,
320 OMX_CommandPortDisable
, portIndex
, NULL
);
325 if ((ret
!= OMX_ErrorNone
) && (pOMXComponent
!= NULL
) && (pExynosComponent
!= NULL
)) {
326 pExynosComponent
->pCallbacks
->EventHandler(pOMXComponent
,
327 pExynosComponent
->callbackData
,
337 OMX_ERRORTYPE
Exynos_OMX_EmptyThisBuffer(
338 OMX_IN OMX_HANDLETYPE hComponent
,
339 OMX_IN OMX_BUFFERHEADERTYPE
*pBuffer
)
341 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
342 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
343 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
344 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
345 OMX_BOOL findBuffer
= OMX_FALSE
;
346 EXYNOS_OMX_MESSAGE
*message
;
351 if (hComponent
== NULL
) {
352 ret
= OMX_ErrorBadParameter
;
355 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
356 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
357 if (ret
!= OMX_ErrorNone
) {
361 if (pOMXComponent
->pComponentPrivate
== NULL
) {
362 ret
= OMX_ErrorBadParameter
;
365 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
366 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
367 ret
= OMX_ErrorInvalidState
;
371 if (pBuffer
== NULL
) {
372 ret
= OMX_ErrorBadParameter
;
375 if (pBuffer
->nInputPortIndex
!= INPUT_PORT_INDEX
) {
376 ret
= OMX_ErrorBadPortIndex
;
380 ret
= Exynos_OMX_Check_SizeVersion(pBuffer
, sizeof(OMX_BUFFERHEADERTYPE
));
381 if (ret
!= OMX_ErrorNone
) {
385 if ((pExynosComponent
->currentState
!= OMX_StateIdle
) &&
386 (pExynosComponent
->currentState
!= OMX_StateExecuting
) &&
387 (pExynosComponent
->currentState
!= OMX_StatePause
)) {
388 ret
= OMX_ErrorIncorrectStateOperation
;
392 pExynosPort
= &pExynosComponent
->pExynosPort
[INPUT_PORT_INDEX
];
393 if ((!CHECK_PORT_ENABLED(pExynosPort
)) ||
394 ((CHECK_PORT_BEING_FLUSHED(pExynosPort
) || CHECK_PORT_BEING_DISABLED(pExynosPort
)) &&
395 (!CHECK_PORT_TUNNELED(pExynosPort
) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
))) ||
396 ((pExynosComponent
->transientState
== EXYNOS_OMX_TransStateExecutingToIdle
) &&
397 (CHECK_PORT_TUNNELED(pExynosPort
) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)))) {
398 ret
= OMX_ErrorIncorrectStateOperation
;
402 Exynos_OSAL_MutexLock(pExynosPort
->hPortMutex
);
403 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
404 if (pBuffer
== pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
) {
405 pExynosPort
->extendBufferHeader
[i
].bBufferInOMX
= OMX_TRUE
;
406 findBuffer
= OMX_TRUE
;
411 if (findBuffer
== OMX_FALSE
) {
412 ret
= OMX_ErrorBadParameter
;
413 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
417 message
= Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE
));
418 if (message
== NULL
) {
419 ret
= OMX_ErrorInsufficientResources
;
420 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
423 message
->messageType
= EXYNOS_OMX_CommandEmptyBuffer
;
424 message
->messageParam
= (OMX_U32
) i
;
425 message
->pCmdData
= (OMX_PTR
)pBuffer
;
427 ret
= Exynos_OSAL_Queue(&pExynosPort
->bufferQ
, (void *)message
);
429 ret
= OMX_ErrorUndefined
;
430 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
433 ret
= Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
434 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
442 OMX_ERRORTYPE
Exynos_OMX_FillThisBuffer(
443 OMX_IN OMX_HANDLETYPE hComponent
,
444 OMX_IN OMX_BUFFERHEADERTYPE
*pBuffer
)
446 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
447 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
448 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
449 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
450 OMX_BOOL findBuffer
= OMX_FALSE
;
451 EXYNOS_OMX_MESSAGE
*message
;
456 if (hComponent
== NULL
) {
457 ret
= OMX_ErrorBadParameter
;
460 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
461 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
462 if (ret
!= OMX_ErrorNone
) {
466 if (pOMXComponent
->pComponentPrivate
== NULL
) {
467 ret
= OMX_ErrorBadParameter
;
470 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
471 if (pExynosComponent
->currentState
== OMX_StateInvalid
) {
472 ret
= OMX_ErrorInvalidState
;
476 if (pBuffer
== NULL
) {
477 ret
= OMX_ErrorBadParameter
;
480 if (pBuffer
->nOutputPortIndex
!= OUTPUT_PORT_INDEX
) {
481 ret
= OMX_ErrorBadPortIndex
;
485 ret
= Exynos_OMX_Check_SizeVersion(pBuffer
, sizeof(OMX_BUFFERHEADERTYPE
));
486 if (ret
!= OMX_ErrorNone
) {
490 if ((pExynosComponent
->currentState
!= OMX_StateIdle
) &&
491 (pExynosComponent
->currentState
!= OMX_StateExecuting
) &&
492 (pExynosComponent
->currentState
!= OMX_StatePause
)) {
493 ret
= OMX_ErrorIncorrectStateOperation
;
497 pExynosPort
= &pExynosComponent
->pExynosPort
[OUTPUT_PORT_INDEX
];
498 if ((!CHECK_PORT_ENABLED(pExynosPort
)) ||
499 ((CHECK_PORT_BEING_FLUSHED(pExynosPort
) || CHECK_PORT_BEING_DISABLED(pExynosPort
)) &&
500 (!CHECK_PORT_TUNNELED(pExynosPort
) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
))) ||
501 ((pExynosComponent
->transientState
== EXYNOS_OMX_TransStateExecutingToIdle
) &&
502 (CHECK_PORT_TUNNELED(pExynosPort
) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort
)))) {
503 ret
= OMX_ErrorIncorrectStateOperation
;
507 Exynos_OSAL_MutexLock(pExynosPort
->hPortMutex
);
508 for (i
= 0; i
< pExynosPort
->portDefinition
.nBufferCountActual
; i
++) {
509 if (pBuffer
== pExynosPort
->extendBufferHeader
[i
].OMXBufferHeader
) {
510 pExynosPort
->extendBufferHeader
[i
].bBufferInOMX
= OMX_TRUE
;
511 findBuffer
= OMX_TRUE
;
516 if (findBuffer
== OMX_FALSE
) {
517 ret
= OMX_ErrorBadParameter
;
518 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
522 message
= Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE
));
523 if (message
== NULL
) {
524 ret
= OMX_ErrorInsufficientResources
;
525 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
528 message
->messageType
= EXYNOS_OMX_CommandFillBuffer
;
529 message
->messageParam
= (OMX_U32
) i
;
530 message
->pCmdData
= (OMX_PTR
)pBuffer
;
532 ret
= Exynos_OSAL_Queue(&pExynosPort
->bufferQ
, (void *)message
);
534 ret
= OMX_ErrorUndefined
;
535 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
539 ret
= Exynos_OSAL_SemaphorePost(pExynosPort
->bufferSemID
);
540 Exynos_OSAL_MutexUnlock(pExynosPort
->hPortMutex
);
548 OMX_ERRORTYPE
Exynos_OMX_Port_Constructor(OMX_HANDLETYPE hComponent
)
550 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
551 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
552 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
553 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
554 EXYNOS_OMX_BASEPORT
*pExynosInputPort
= NULL
;
555 EXYNOS_OMX_BASEPORT
*pExynosOutputPort
= NULL
;
560 if (hComponent
== NULL
) {
561 ret
= OMX_ErrorBadParameter
;
562 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
565 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
566 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
567 if (ret
!= OMX_ErrorNone
) {
571 if (pOMXComponent
->pComponentPrivate
== NULL
) {
572 ret
= OMX_ErrorBadParameter
;
573 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorBadParameter, Line:%d", __LINE__
);
576 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
578 INIT_SET_SIZE_VERSION(&pExynosComponent
->portParam
, OMX_PORT_PARAM_TYPE
);
579 pExynosComponent
->portParam
.nPorts
= ALL_PORT_NUM
;
580 pExynosComponent
->portParam
.nStartPortNumber
= INPUT_PORT_INDEX
;
582 pExynosPort
= Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASEPORT
) * ALL_PORT_NUM
);
583 if (pExynosPort
== NULL
) {
584 ret
= OMX_ErrorInsufficientResources
;
585 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
588 Exynos_OSAL_Memset(pExynosPort
, 0, sizeof(EXYNOS_OMX_BASEPORT
) * ALL_PORT_NUM
);
589 pExynosComponent
->pExynosPort
= pExynosPort
;
592 pExynosInputPort
= &pExynosPort
[INPUT_PORT_INDEX
];
594 Exynos_OSAL_QueueCreate(&pExynosInputPort
->bufferQ
, MAX_QUEUE_ELEMENTS
);
596 pExynosInputPort
->extendBufferHeader
= Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE
) * MAX_BUFFER_NUM
);
597 if (pExynosInputPort
->extendBufferHeader
== NULL
) {
598 Exynos_OSAL_Free(pExynosPort
);
600 ret
= OMX_ErrorInsufficientResources
;
601 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
604 Exynos_OSAL_Memset(pExynosInputPort
->extendBufferHeader
, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE
) * MAX_BUFFER_NUM
);
606 pExynosInputPort
->bufferStateAllocate
= Exynos_OSAL_Malloc(sizeof(OMX_U32
) * MAX_BUFFER_NUM
);
607 if (pExynosInputPort
->bufferStateAllocate
== NULL
) {
608 Exynos_OSAL_Free(pExynosInputPort
->extendBufferHeader
);
609 pExynosInputPort
->extendBufferHeader
= NULL
;
610 Exynos_OSAL_Free(pExynosPort
);
612 ret
= OMX_ErrorInsufficientResources
;
613 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "OMX_ErrorInsufficientResources, Line:%d", __LINE__
);
616 Exynos_OSAL_Memset(pExynosInputPort
->bufferStateAllocate
, 0, sizeof(OMX_U32
) * MAX_BUFFER_NUM
);
618 pExynosInputPort
->bufferSemID
= NULL
;
619 pExynosInputPort
->assignedBufferNum
= 0;
620 pExynosInputPort
->nPlaneCnt
= 0;
621 pExynosInputPort
->portState
= OMX_StateMax
;
622 pExynosInputPort
->bIsPortFlushed
= OMX_FALSE
;
623 pExynosInputPort
->bIsPortDisabled
= OMX_FALSE
;
624 pExynosInputPort
->tunneledComponent
= NULL
;
625 pExynosInputPort
->tunneledPort
= 0;
626 pExynosInputPort
->tunnelBufferNum
= 0;
627 pExynosInputPort
->bufferSupplier
= OMX_BufferSupplyUnspecified
;
628 pExynosInputPort
->tunnelFlags
= 0;
629 pExynosInputPort
->bNeedContigMem
= OMX_FALSE
;
630 ret
= Exynos_OSAL_SemaphoreCreate(&pExynosInputPort
->loadedResource
);
631 if (ret
!= OMX_ErrorNone
) {
632 Exynos_OSAL_Free(pExynosInputPort
->bufferStateAllocate
);
633 pExynosInputPort
->bufferStateAllocate
= NULL
;
634 Exynos_OSAL_Free(pExynosInputPort
->extendBufferHeader
);
635 pExynosInputPort
->extendBufferHeader
= NULL
;
636 Exynos_OSAL_Free(pExynosPort
);
640 ret
= Exynos_OSAL_SemaphoreCreate(&pExynosInputPort
->unloadedResource
);
641 if (ret
!= OMX_ErrorNone
) {
642 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->loadedResource
);
643 pExynosInputPort
->loadedResource
= NULL
;
644 Exynos_OSAL_Free(pExynosInputPort
->bufferStateAllocate
);
645 pExynosInputPort
->bufferStateAllocate
= NULL
;
646 Exynos_OSAL_Free(pExynosInputPort
->extendBufferHeader
);
647 pExynosInputPort
->extendBufferHeader
= NULL
;
648 Exynos_OSAL_Free(pExynosPort
);
653 INIT_SET_SIZE_VERSION(&pExynosInputPort
->portDefinition
, OMX_PARAM_PORTDEFINITIONTYPE
);
654 pExynosInputPort
->portDefinition
.nPortIndex
= INPUT_PORT_INDEX
;
655 pExynosInputPort
->portDefinition
.eDir
= OMX_DirInput
;
656 pExynosInputPort
->portDefinition
.nBufferCountActual
= 0;
657 pExynosInputPort
->portDefinition
.nBufferCountMin
= 0;
658 pExynosInputPort
->portDefinition
.nBufferSize
= 0;
659 pExynosInputPort
->portDefinition
.bEnabled
= OMX_FALSE
;
660 pExynosInputPort
->portDefinition
.bPopulated
= OMX_FALSE
;
661 pExynosInputPort
->portDefinition
.eDomain
= OMX_PortDomainMax
;
662 pExynosInputPort
->portDefinition
.bBuffersContiguous
= OMX_FALSE
;
663 pExynosInputPort
->portDefinition
.nBufferAlignment
= 0;
664 pExynosInputPort
->markType
.hMarkTargetComponent
= NULL
;
665 pExynosInputPort
->markType
.pMarkData
= NULL
;
666 pExynosInputPort
->exceptionFlag
= GENERAL_STATE
;
669 pExynosOutputPort
= &pExynosPort
[OUTPUT_PORT_INDEX
];
671 Exynos_OSAL_QueueCreate(&pExynosOutputPort
->bufferQ
, MAX_QUEUE_ELEMENTS
); /* For in case of "Output Buffer Share", MAX ELEMENTS(DPB + EDPB) */
673 pExynosOutputPort
->extendBufferHeader
= Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE
) * MAX_BUFFER_NUM
);
674 if (pExynosOutputPort
->extendBufferHeader
== NULL
) {
675 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->unloadedResource
);
676 pExynosInputPort
->unloadedResource
= NULL
;
677 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->loadedResource
);
678 pExynosInputPort
->loadedResource
= NULL
;
679 Exynos_OSAL_Free(pExynosInputPort
->bufferStateAllocate
);
680 pExynosInputPort
->bufferStateAllocate
= NULL
;
681 Exynos_OSAL_Free(pExynosInputPort
->extendBufferHeader
);
682 pExynosInputPort
->extendBufferHeader
= NULL
;
683 Exynos_OSAL_Free(pExynosPort
);
685 ret
= OMX_ErrorInsufficientResources
;
688 Exynos_OSAL_Memset(pExynosOutputPort
->extendBufferHeader
, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE
) * MAX_BUFFER_NUM
);
690 pExynosOutputPort
->bufferStateAllocate
= Exynos_OSAL_Malloc(sizeof(OMX_U32
) * MAX_BUFFER_NUM
);
691 if (pExynosOutputPort
->bufferStateAllocate
== NULL
) {
692 Exynos_OSAL_Free(pExynosOutputPort
->extendBufferHeader
);
693 pExynosOutputPort
->extendBufferHeader
= NULL
;
695 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->unloadedResource
);
696 pExynosInputPort
->unloadedResource
= NULL
;
697 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->loadedResource
);
698 pExynosInputPort
->loadedResource
= NULL
;
699 Exynos_OSAL_Free(pExynosInputPort
->bufferStateAllocate
);
700 pExynosInputPort
->bufferStateAllocate
= NULL
;
701 Exynos_OSAL_Free(pExynosInputPort
->extendBufferHeader
);
702 pExynosInputPort
->extendBufferHeader
= NULL
;
703 Exynos_OSAL_Free(pExynosPort
);
705 ret
= OMX_ErrorInsufficientResources
;
708 Exynos_OSAL_Memset(pExynosOutputPort
->bufferStateAllocate
, 0, sizeof(OMX_U32
) * MAX_BUFFER_NUM
);
710 pExynosOutputPort
->bufferSemID
= NULL
;
711 pExynosOutputPort
->assignedBufferNum
= 0;
712 pExynosOutputPort
->nPlaneCnt
= 0;
713 pExynosOutputPort
->portState
= OMX_StateMax
;
714 pExynosOutputPort
->bIsPortFlushed
= OMX_FALSE
;
715 pExynosOutputPort
->bIsPortDisabled
= OMX_FALSE
;
716 pExynosOutputPort
->tunneledComponent
= NULL
;
717 pExynosOutputPort
->tunneledPort
= 0;
718 pExynosOutputPort
->tunnelBufferNum
= 0;
719 pExynosOutputPort
->bufferSupplier
= OMX_BufferSupplyUnspecified
;
720 pExynosOutputPort
->tunnelFlags
= 0;
721 pExynosOutputPort
->bNeedContigMem
= OMX_FALSE
;
722 ret
= Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort
->loadedResource
);
723 if (ret
!= OMX_ErrorNone
) {
724 Exynos_OSAL_Free(pExynosOutputPort
->bufferStateAllocate
);
725 pExynosOutputPort
->bufferStateAllocate
= NULL
;
726 Exynos_OSAL_Free(pExynosOutputPort
->extendBufferHeader
);
727 pExynosOutputPort
->extendBufferHeader
= NULL
;
729 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->unloadedResource
);
730 pExynosInputPort
->unloadedResource
= NULL
;
731 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->loadedResource
);
732 pExynosInputPort
->loadedResource
= NULL
;
733 Exynos_OSAL_Free(pExynosInputPort
->bufferStateAllocate
);
734 pExynosInputPort
->bufferStateAllocate
= NULL
;
735 Exynos_OSAL_Free(pExynosInputPort
->extendBufferHeader
);
736 pExynosInputPort
->extendBufferHeader
= NULL
;
737 Exynos_OSAL_Free(pExynosPort
);
741 ret
= Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort
->unloadedResource
);
742 if (ret
!= OMX_ErrorNone
) {
743 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort
->loadedResource
);
744 pExynosOutputPort
->loadedResource
= NULL
;
745 Exynos_OSAL_Free(pExynosOutputPort
->bufferStateAllocate
);
746 pExynosOutputPort
->bufferStateAllocate
= NULL
;
747 Exynos_OSAL_Free(pExynosOutputPort
->extendBufferHeader
);
748 pExynosOutputPort
->extendBufferHeader
= NULL
;
750 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->unloadedResource
);
751 pExynosInputPort
->unloadedResource
= NULL
;
752 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort
->loadedResource
);
753 pExynosInputPort
->loadedResource
= NULL
;
754 Exynos_OSAL_Free(pExynosInputPort
->bufferStateAllocate
);
755 pExynosInputPort
->bufferStateAllocate
= NULL
;
756 Exynos_OSAL_Free(pExynosInputPort
->extendBufferHeader
);
757 pExynosInputPort
->extendBufferHeader
= NULL
;
758 Exynos_OSAL_Free(pExynosPort
);
763 INIT_SET_SIZE_VERSION(&pExynosOutputPort
->portDefinition
, OMX_PARAM_PORTDEFINITIONTYPE
);
764 pExynosOutputPort
->portDefinition
.nPortIndex
= OUTPUT_PORT_INDEX
;
765 pExynosOutputPort
->portDefinition
.eDir
= OMX_DirOutput
;
766 pExynosOutputPort
->portDefinition
.nBufferCountActual
= 0;
767 pExynosOutputPort
->portDefinition
.nBufferCountMin
= 0;
768 pExynosOutputPort
->portDefinition
.nBufferSize
= 0;
769 pExynosOutputPort
->portDefinition
.bEnabled
= OMX_FALSE
;
770 pExynosOutputPort
->portDefinition
.bPopulated
= OMX_FALSE
;
771 pExynosOutputPort
->portDefinition
.eDomain
= OMX_PortDomainMax
;
772 pExynosOutputPort
->portDefinition
.bBuffersContiguous
= OMX_FALSE
;
773 pExynosOutputPort
->portDefinition
.nBufferAlignment
= 0;
774 pExynosOutputPort
->markType
.hMarkTargetComponent
= NULL
;
775 pExynosOutputPort
->markType
.pMarkData
= NULL
;
776 pExynosOutputPort
->exceptionFlag
= GENERAL_STATE
;
778 pExynosComponent
->checkTimeStamp
.needSetStartTimeStamp
= OMX_FALSE
;
779 pExynosComponent
->checkTimeStamp
.needCheckStartTimeStamp
= OMX_FALSE
;
780 pExynosComponent
->checkTimeStamp
.startTimeStamp
= 0;
781 pExynosComponent
->checkTimeStamp
.nStartFlags
= 0x0;
783 pOMXComponent
->EmptyThisBuffer
= &Exynos_OMX_EmptyThisBuffer
;
784 pOMXComponent
->FillThisBuffer
= &Exynos_OMX_FillThisBuffer
;
793 OMX_ERRORTYPE
Exynos_OMX_Port_Destructor(OMX_HANDLETYPE hComponent
)
795 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
796 OMX_COMPONENTTYPE
*pOMXComponent
= NULL
;
797 EXYNOS_OMX_BASECOMPONENT
*pExynosComponent
= NULL
;
798 EXYNOS_OMX_BASEPORT
*pExynosPort
= NULL
;
800 OMX_S32 countValue
= 0;
805 if (hComponent
== NULL
) {
806 ret
= OMX_ErrorBadParameter
;
809 pOMXComponent
= (OMX_COMPONENTTYPE
*)hComponent
;
810 ret
= Exynos_OMX_Check_SizeVersion(pOMXComponent
, sizeof(OMX_COMPONENTTYPE
));
811 if (ret
!= OMX_ErrorNone
) {
814 if (pOMXComponent
->pComponentPrivate
== NULL
) {
815 ret
= OMX_ErrorBadParameter
;
818 pExynosComponent
= (EXYNOS_OMX_BASECOMPONENT
*)pOMXComponent
->pComponentPrivate
;
820 if (pExynosComponent
->transientState
== EXYNOS_OMX_TransStateLoadedToIdle
) {
821 pExynosComponent
->abendState
= OMX_TRUE
;
822 for (i
= 0; i
< ALL_PORT_NUM
; i
++) {
823 pExynosPort
= &pExynosComponent
->pExynosPort
[i
];
824 Exynos_OSAL_SemaphorePost(pExynosPort
->loadedResource
);
826 Exynos_OSAL_SignalWait(pExynosComponent
->abendStateEvent
, DEF_MAX_WAIT_TIME
);
827 Exynos_OSAL_SignalReset(pExynosComponent
->abendStateEvent
);
830 for (i
= 0; i
< ALL_PORT_NUM
; i
++) {
831 pExynosPort
= &pExynosComponent
->pExynosPort
[i
];
833 Exynos_OSAL_SemaphoreTerminate(pExynosPort
->loadedResource
);
834 pExynosPort
->loadedResource
= NULL
;
835 Exynos_OSAL_SemaphoreTerminate(pExynosPort
->unloadedResource
);
836 pExynosPort
->unloadedResource
= NULL
;
837 Exynos_OSAL_Free(pExynosPort
->bufferStateAllocate
);
838 pExynosPort
->bufferStateAllocate
= NULL
;
839 Exynos_OSAL_Free(pExynosPort
->extendBufferHeader
);
840 pExynosPort
->extendBufferHeader
= NULL
;
842 Exynos_OSAL_QueueTerminate(&pExynosPort
->bufferQ
);
844 Exynos_OSAL_Free(pExynosComponent
->pExynosPort
);
845 pExynosComponent
->pExynosPort
= NULL
;
853 OMX_ERRORTYPE
Exynos_ResetDataBuffer(EXYNOS_OMX_DATABUFFER
*pDataBuffer
)
855 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
857 if (pDataBuffer
== NULL
) {
858 ret
= OMX_ErrorBadParameter
;
862 pDataBuffer
->dataValid
= OMX_FALSE
;
863 pDataBuffer
->dataLen
= 0;
864 pDataBuffer
->remainDataLen
= 0;
865 pDataBuffer
->usedDataLen
= 0;
866 pDataBuffer
->bufferHeader
= NULL
;
867 pDataBuffer
->nFlags
= 0;
868 pDataBuffer
->timeStamp
= 0;
869 pDataBuffer
->pPrivate
= NULL
;
875 OMX_ERRORTYPE
Exynos_ResetCodecData(EXYNOS_OMX_DATA
*pData
)
877 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
880 ret
= OMX_ErrorBadParameter
;
885 pData
->usedDataLen
= 0;
886 pData
->remainDataLen
= 0;
888 pData
->timeStamp
= 0;
889 pData
->pPrivate
= NULL
;
890 pData
->bufferHeader
= NULL
;
896 OMX_ERRORTYPE
Exynos_Shared_BufferToData(EXYNOS_OMX_DATABUFFER
*pUseBuffer
, EXYNOS_OMX_DATA
*pData
, EXYNOS_OMX_PLANE nPlane
)
898 OMX_ERRORTYPE ret
= OMX_ErrorNone
;
900 if (nPlane
== ONE_PLANE
) {
901 /* Case of Shared Buffer, Only support singlePlaneBuffer */
902 pData
->buffer
.singlePlaneBuffer
.dataBuffer
= pUseBuffer
->bufferHeader
->pBuffer
;
904 Exynos_OSAL_Log(EXYNOS_LOG_ERROR
, "Can not support plane");
905 ret
= OMX_ErrorNotImplemented
;
909 pData
->allocSize
= pUseBuffer
->allocSize
;
910 pData
->dataLen
= pUseBuffer
->dataLen
;
911 pData
->usedDataLen
= pUseBuffer
->usedDataLen
;
912 pData
->remainDataLen
= pUseBuffer
->remainDataLen
;
913 pData
->timeStamp
= pUseBuffer
->timeStamp
;
914 pData
->nFlags
= pUseBuffer
->nFlags
;
915 pData
->pPrivate
= pUseBuffer
->pPrivate
;
916 pData
->bufferHeader
= pUseBuffer
->bufferHeader
;