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))
65 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d EmptyBufferDone", __FUNCTION__, __LINE__);
66 pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
72 OMX_ERRORTYPE Exynos_OMX_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, OMX_BUFFERHEADERTYPE* bufferHeader)
74 OMX_ERRORTYPE ret = OMX_ErrorNone;
75 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
76 EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
79 Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
80 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
81 if (bufferHeader == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
82 pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_FALSE;
87 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
89 if ((bufferHeader != NULL) && (bufferHeader->pBuffer != NULL))
91 Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d FillBufferDone", __FUNCTION__, __LINE__);
92 pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
98 OMX_ERRORTYPE Exynos_OMX_BufferFlushProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
100 OMX_ERRORTYPE ret = OMX_ErrorNone;
101 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
102 OMX_S32 portIndex = 0;
103 OMX_U32 i = 0, cnt = 0;
107 if (pOMXComponent == NULL) {
108 ret = OMX_ErrorBadParameter;
111 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
112 if (ret != OMX_ErrorNone) {
116 if (pOMXComponent->pComponentPrivate == NULL) {
117 ret = OMX_ErrorBadParameter;
120 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
122 cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
124 #ifdef TIZEN_FEATURE_E3250
125 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "bufferFlushProcess cnt:%d port:%d", cnt, nPortIndex);
128 for (i = 0; i < cnt; i++) {
129 if (nPortIndex == ALL_PORT_INDEX)
132 portIndex = nPortIndex;
134 pExynosComponent->exynos_BufferFlush(pOMXComponent, portIndex, bEvent);
138 if (ret != OMX_ErrorNone) {
139 Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
141 if ((pOMXComponent != NULL) && (pExynosComponent != NULL)) {
142 pExynosComponent->pCallbacks->EventHandler(pOMXComponent, pExynosComponent->callbackData, OMX_EventError, ret, 0, NULL);
151 OMX_ERRORTYPE Exynos_OMX_EnablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
153 OMX_ERRORTYPE ret = OMX_ErrorNone;
154 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
155 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
158 #ifdef TIZEN_FEATURE_E3250
159 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "enablePort idx:%d", portIndex);
162 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
164 if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
165 Exynos_OSAL_SemaphoreWait(pExynosPort->loadedResource);
166 pExynosPort->portDefinition.bPopulated = OMX_TRUE;
168 pExynosPort->exceptionFlag = GENERAL_STATE;
169 pExynosPort->portDefinition.bEnabled = OMX_TRUE;
178 OMX_ERRORTYPE Exynos_OMX_PortEnableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex)
180 OMX_ERRORTYPE ret = OMX_ErrorNone;
181 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
182 OMX_S32 portIndex = 0;
183 OMX_U32 i = 0, cnt = 0;
187 if (pOMXComponent == NULL) {
188 ret = OMX_ErrorBadParameter;
191 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
192 if (ret != OMX_ErrorNone) {
196 if (pOMXComponent->pComponentPrivate == NULL) {
197 ret = OMX_ErrorBadParameter;
200 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
202 cnt = (nPortIndex == ALL_PORT_INDEX) ? ALL_PORT_NUM : 1;
204 #ifdef TIZEN_FEATURE_E3250
205 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "portEnableProcess cnt:%d port:%d", cnt, nPortIndex);
208 for (i = 0; i < cnt; i++) {
209 if (nPortIndex == ALL_PORT_INDEX)
212 portIndex = nPortIndex;
214 ret = Exynos_OMX_EnablePort(pOMXComponent, portIndex);
215 if (ret == OMX_ErrorNone) {
216 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
217 pExynosComponent->callbackData,
218 OMX_EventCmdComplete,
219 OMX_CommandPortEnable, portIndex, NULL);
224 if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
225 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
226 pExynosComponent->callbackData,
236 OMX_ERRORTYPE Exynos_OMX_DisablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
238 OMX_ERRORTYPE ret = OMX_ErrorNone;
239 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
240 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
241 EXYNOS_OMX_MESSAGE *message;
244 #ifdef TIZEN_FEATURE_E3250
245 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "disablePort idx:%d", portIndex);
248 pExynosPort = &pExynosComponent->pExynosPort[portIndex];
250 if (!CHECK_PORT_ENABLED(pExynosPort)) {
255 if (pExynosComponent->currentState != OMX_StateLoaded) {
256 if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
257 while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
258 message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
259 Exynos_OSAL_Free(message);
262 pExynosPort->portDefinition.bPopulated = OMX_FALSE;
263 Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource);
265 pExynosPort->portDefinition.bEnabled = OMX_FALSE;
274 OMX_ERRORTYPE Exynos_OMX_PortDisableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex)
276 OMX_ERRORTYPE ret = OMX_ErrorNone;
277 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
278 OMX_S32 portIndex = 0;
279 OMX_U32 i = 0, cnt = 0;
283 if (pOMXComponent == NULL) {
284 ret = OMX_ErrorBadParameter;
287 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
288 if (ret != OMX_ErrorNone) {
292 if (pOMXComponent->pComponentPrivate == NULL) {
293 ret = OMX_ErrorBadParameter;
296 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
298 cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
300 #ifdef TIZEN_FEATURE_E3250
301 Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "portDisableProcess cnt:%d port:%d", cnt, nPortIndex);
305 for(i = 0; i < cnt; i++) {
306 if (nPortIndex == ALL_PORT_INDEX)
309 portIndex = nPortIndex;
311 Exynos_OMX_BufferFlushProcess(pOMXComponent, portIndex, OMX_FALSE);
314 for(i = 0; i < cnt; i++) {
315 if (nPortIndex == ALL_PORT_INDEX)
318 portIndex = nPortIndex;
320 ret = Exynos_OMX_DisablePort(pOMXComponent, portIndex);
321 pExynosComponent->pExynosPort[portIndex].bIsPortDisabled = OMX_FALSE;
322 if (ret == OMX_ErrorNone) {
323 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
324 pExynosComponent->callbackData,
325 OMX_EventCmdComplete,
326 OMX_CommandPortDisable, portIndex, NULL);
331 if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
332 pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
333 pExynosComponent->callbackData,
343 OMX_ERRORTYPE Exynos_OMX_EmptyThisBuffer(
344 OMX_IN OMX_HANDLETYPE hComponent,
345 OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
347 OMX_ERRORTYPE ret = OMX_ErrorNone;
348 OMX_COMPONENTTYPE *pOMXComponent = NULL;
349 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
350 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
351 OMX_BOOL findBuffer = OMX_FALSE;
352 EXYNOS_OMX_MESSAGE *message;
357 if (hComponent == NULL) {
358 ret = OMX_ErrorBadParameter;
361 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
362 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
363 if (ret != OMX_ErrorNone) {
367 if (pOMXComponent->pComponentPrivate == NULL) {
368 ret = OMX_ErrorBadParameter;
371 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
372 if (pExynosComponent->currentState == OMX_StateInvalid) {
373 ret = OMX_ErrorInvalidState;
377 if (pBuffer == NULL) {
378 ret = OMX_ErrorBadParameter;
381 if (pBuffer->nInputPortIndex != INPUT_PORT_INDEX) {
382 ret = OMX_ErrorBadPortIndex;
386 ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE));
387 if (ret != OMX_ErrorNone) {
391 if ((pExynosComponent->currentState != OMX_StateIdle) &&
392 (pExynosComponent->currentState != OMX_StateExecuting) &&
393 (pExynosComponent->currentState != OMX_StatePause)) {
394 ret = OMX_ErrorIncorrectStateOperation;
398 pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
399 if ((!CHECK_PORT_ENABLED(pExynosPort)) ||
400 ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) &&
401 (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) ||
402 ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) &&
403 (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) {
404 ret = OMX_ErrorIncorrectStateOperation;
408 Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
409 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
410 if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
411 pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE;
412 findBuffer = OMX_TRUE;
417 if (findBuffer == OMX_FALSE) {
418 ret = OMX_ErrorBadParameter;
419 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
423 message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
424 if (message == NULL) {
425 ret = OMX_ErrorInsufficientResources;
426 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
429 message->messageType = EXYNOS_OMX_CommandEmptyBuffer;
430 message->messageParam = (OMX_U32) i;
431 message->pCmdData = (OMX_PTR)pBuffer;
433 ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message);
435 ret = OMX_ErrorUndefined;
436 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
439 ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
440 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
448 OMX_ERRORTYPE Exynos_OMX_FillThisBuffer(
449 OMX_IN OMX_HANDLETYPE hComponent,
450 OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
452 OMX_ERRORTYPE ret = OMX_ErrorNone;
453 OMX_COMPONENTTYPE *pOMXComponent = NULL;
454 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
455 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
456 OMX_BOOL findBuffer = OMX_FALSE;
457 EXYNOS_OMX_MESSAGE *message;
462 if (hComponent == NULL) {
463 ret = OMX_ErrorBadParameter;
466 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
467 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
468 if (ret != OMX_ErrorNone) {
472 if (pOMXComponent->pComponentPrivate == NULL) {
473 ret = OMX_ErrorBadParameter;
476 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
477 if (pExynosComponent->currentState == OMX_StateInvalid) {
478 ret = OMX_ErrorInvalidState;
482 if (pBuffer == NULL) {
483 ret = OMX_ErrorBadParameter;
486 if (pBuffer->nOutputPortIndex != OUTPUT_PORT_INDEX) {
487 ret = OMX_ErrorBadPortIndex;
491 ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE));
492 if (ret != OMX_ErrorNone) {
496 if ((pExynosComponent->currentState != OMX_StateIdle) &&
497 (pExynosComponent->currentState != OMX_StateExecuting) &&
498 (pExynosComponent->currentState != OMX_StatePause)) {
499 ret = OMX_ErrorIncorrectStateOperation;
503 pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
504 if ((!CHECK_PORT_ENABLED(pExynosPort)) ||
505 ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) &&
506 (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) ||
507 ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) &&
508 (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) {
509 ret = OMX_ErrorIncorrectStateOperation;
513 Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
514 for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
515 if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
516 pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE;
517 findBuffer = OMX_TRUE;
522 if (findBuffer == OMX_FALSE) {
523 ret = OMX_ErrorBadParameter;
524 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
528 message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
529 if (message == NULL) {
530 ret = OMX_ErrorInsufficientResources;
531 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
534 message->messageType = EXYNOS_OMX_CommandFillBuffer;
535 message->messageParam = (OMX_U32) i;
536 message->pCmdData = (OMX_PTR)pBuffer;
538 ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message);
540 ret = OMX_ErrorUndefined;
541 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
545 ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
546 Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
554 OMX_ERRORTYPE Exynos_OMX_Port_Constructor(OMX_HANDLETYPE hComponent)
556 OMX_ERRORTYPE ret = OMX_ErrorNone;
557 OMX_COMPONENTTYPE *pOMXComponent = NULL;
558 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
559 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
560 EXYNOS_OMX_BASEPORT *pExynosInputPort = NULL;
561 EXYNOS_OMX_BASEPORT *pExynosOutputPort = NULL;
565 if (hComponent == NULL) {
566 ret = OMX_ErrorBadParameter;
567 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
570 pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
571 ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
572 if (ret != OMX_ErrorNone) {
576 if (pOMXComponent->pComponentPrivate == NULL) {
577 ret = OMX_ErrorBadParameter;
578 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
581 pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
583 INIT_SET_SIZE_VERSION(&pExynosComponent->portParam, OMX_PORT_PARAM_TYPE);
584 pExynosComponent->portParam.nPorts = ALL_PORT_NUM;
585 pExynosComponent->portParam.nStartPortNumber = INPUT_PORT_INDEX;
587 pExynosPort = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM);
588 if (pExynosPort == NULL) {
589 ret = OMX_ErrorInsufficientResources;
590 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
593 Exynos_OSAL_Memset(pExynosPort, 0, sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM);
594 pExynosComponent->pExynosPort = pExynosPort;
597 pExynosInputPort = &pExynosPort[INPUT_PORT_INDEX];
599 Exynos_OSAL_QueueCreate(&pExynosInputPort->bufferQ, MAX_QUEUE_ELEMENTS);
601 pExynosInputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
602 if (pExynosInputPort->extendBufferHeader == NULL) {
603 Exynos_OSAL_Free(pExynosPort);
605 ret = OMX_ErrorInsufficientResources;
606 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
609 Exynos_OSAL_Memset(pExynosInputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
611 pExynosInputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM);
612 if (pExynosInputPort->bufferStateAllocate == NULL) {
613 Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
614 pExynosInputPort->extendBufferHeader = NULL;
615 Exynos_OSAL_Free(pExynosPort);
617 ret = OMX_ErrorInsufficientResources;
618 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
621 Exynos_OSAL_Memset(pExynosInputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM);
623 pExynosInputPort->bufferSemID = NULL;
624 pExynosInputPort->assignedBufferNum = 0;
625 pExynosInputPort->portState = OMX_StateMax;
626 pExynosInputPort->bIsPortFlushed = OMX_FALSE;
627 pExynosInputPort->bIsPortDisabled = OMX_FALSE;
628 pExynosInputPort->tunneledComponent = NULL;
629 pExynosInputPort->tunneledPort = 0;
630 pExynosInputPort->tunnelBufferNum = 0;
631 pExynosInputPort->bufferSupplier = OMX_BufferSupplyUnspecified;
632 pExynosInputPort->tunnelFlags = 0;
633 ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->loadedResource);
634 if (ret != OMX_ErrorNone) {
635 Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
636 pExynosInputPort->bufferStateAllocate = NULL;
637 Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
638 pExynosInputPort->extendBufferHeader = NULL;
639 Exynos_OSAL_Free(pExynosPort);
643 ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->unloadedResource);
644 if (ret != OMX_ErrorNone) {
645 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
646 pExynosInputPort->loadedResource = NULL;
647 Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
648 pExynosInputPort->bufferStateAllocate = NULL;
649 Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
650 pExynosInputPort->extendBufferHeader = NULL;
651 Exynos_OSAL_Free(pExynosPort);
656 INIT_SET_SIZE_VERSION(&pExynosInputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
657 pExynosInputPort->portDefinition.nPortIndex = INPUT_PORT_INDEX;
658 pExynosInputPort->portDefinition.eDir = OMX_DirInput;
659 pExynosInputPort->portDefinition.nBufferCountActual = 0;
660 pExynosInputPort->portDefinition.nBufferCountMin = 0;
661 pExynosInputPort->portDefinition.nBufferSize = 0;
662 pExynosInputPort->portDefinition.bEnabled = OMX_FALSE;
663 pExynosInputPort->portDefinition.bPopulated = OMX_FALSE;
664 pExynosInputPort->portDefinition.eDomain = OMX_PortDomainMax;
665 pExynosInputPort->portDefinition.bBuffersContiguous = OMX_FALSE;
666 pExynosInputPort->portDefinition.nBufferAlignment = 0;
667 pExynosInputPort->markType.hMarkTargetComponent = NULL;
668 pExynosInputPort->markType.pMarkData = NULL;
669 pExynosInputPort->exceptionFlag = GENERAL_STATE;
672 pExynosOutputPort = &pExynosPort[OUTPUT_PORT_INDEX];
674 Exynos_OSAL_QueueCreate(&pExynosOutputPort->bufferQ, MAX_QUEUE_ELEMENTS); /* For in case of "Output Buffer Share", MAX ELEMENTS(DPB + EDPB) */
676 pExynosOutputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
677 if (pExynosOutputPort->extendBufferHeader == NULL) {
678 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
679 pExynosInputPort->unloadedResource = NULL;
680 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
681 pExynosInputPort->loadedResource = NULL;
682 Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
683 pExynosInputPort->bufferStateAllocate = NULL;
684 Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
685 pExynosInputPort->extendBufferHeader = NULL;
686 Exynos_OSAL_Free(pExynosPort);
688 ret = OMX_ErrorInsufficientResources;
691 Exynos_OSAL_Memset(pExynosOutputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
693 pExynosOutputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM);
694 if (pExynosOutputPort->bufferStateAllocate == NULL) {
695 Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
696 pExynosOutputPort->extendBufferHeader = NULL;
698 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
699 pExynosInputPort->unloadedResource = NULL;
700 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
701 pExynosInputPort->loadedResource = NULL;
702 Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
703 pExynosInputPort->bufferStateAllocate = NULL;
704 Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
705 pExynosInputPort->extendBufferHeader = NULL;
706 Exynos_OSAL_Free(pExynosPort);
708 ret = OMX_ErrorInsufficientResources;
711 Exynos_OSAL_Memset(pExynosOutputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM);
713 pExynosOutputPort->bufferSemID = NULL;
714 pExynosOutputPort->assignedBufferNum = 0;
715 pExynosOutputPort->portState = OMX_StateMax;
716 pExynosOutputPort->bIsPortFlushed = OMX_FALSE;
717 pExynosOutputPort->bIsPortDisabled = OMX_FALSE;
718 pExynosOutputPort->tunneledComponent = NULL;
719 pExynosOutputPort->tunneledPort = 0;
720 pExynosOutputPort->tunnelBufferNum = 0;
721 pExynosOutputPort->bufferSupplier = OMX_BufferSupplyUnspecified;
722 pExynosOutputPort->tunnelFlags = 0;
723 ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->loadedResource);
724 if (ret != OMX_ErrorNone) {
725 Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate);
726 pExynosOutputPort->bufferStateAllocate = NULL;
727 Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
728 pExynosOutputPort->extendBufferHeader = NULL;
730 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
731 pExynosInputPort->unloadedResource = NULL;
732 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
733 pExynosInputPort->loadedResource = NULL;
734 Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
735 pExynosInputPort->bufferStateAllocate = NULL;
736 Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
737 pExynosInputPort->extendBufferHeader = NULL;
738 Exynos_OSAL_Free(pExynosPort);
742 ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->unloadedResource);
743 if (ret != OMX_ErrorNone) {
744 Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->loadedResource);
745 pExynosOutputPort->loadedResource = NULL;
746 Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate);
747 pExynosOutputPort->bufferStateAllocate = NULL;
748 Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
749 pExynosOutputPort->extendBufferHeader = NULL;
751 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
752 pExynosInputPort->unloadedResource = NULL;
753 Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
754 pExynosInputPort->loadedResource = NULL;
755 Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
756 pExynosInputPort->bufferStateAllocate = NULL;
757 Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
758 pExynosInputPort->extendBufferHeader = NULL;
759 Exynos_OSAL_Free(pExynosPort);
764 INIT_SET_SIZE_VERSION(&pExynosOutputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
765 pExynosOutputPort->portDefinition.nPortIndex = OUTPUT_PORT_INDEX;
766 pExynosOutputPort->portDefinition.eDir = OMX_DirOutput;
767 pExynosOutputPort->portDefinition.nBufferCountActual = 0;
768 pExynosOutputPort->portDefinition.nBufferCountMin = 0;
769 pExynosOutputPort->portDefinition.nBufferSize = 0;
770 pExynosOutputPort->portDefinition.bEnabled = OMX_FALSE;
771 pExynosOutputPort->portDefinition.bPopulated = OMX_FALSE;
772 pExynosOutputPort->portDefinition.eDomain = OMX_PortDomainMax;
773 pExynosOutputPort->portDefinition.bBuffersContiguous = OMX_FALSE;
774 pExynosOutputPort->portDefinition.nBufferAlignment = 0;
775 pExynosOutputPort->markType.hMarkTargetComponent = NULL;
776 pExynosOutputPort->markType.pMarkData = NULL;
777 pExynosOutputPort->exceptionFlag = GENERAL_STATE;
779 pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
780 pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
781 pExynosComponent->checkTimeStamp.startTimeStamp = 0;
782 pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
784 pOMXComponent->EmptyThisBuffer = &Exynos_OMX_EmptyThisBuffer;
785 pOMXComponent->FillThisBuffer = &Exynos_OMX_FillThisBuffer;
794 OMX_ERRORTYPE Exynos_OMX_Port_Destructor(OMX_HANDLETYPE hComponent)
796 OMX_ERRORTYPE ret = OMX_ErrorNone;
797 OMX_COMPONENTTYPE *pOMXComponent = NULL;
798 EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
799 EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
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;
819 for (i = 0; i < ALL_PORT_NUM; i++) {
820 pExynosPort = &pExynosComponent->pExynosPort[i];
822 Exynos_OSAL_SemaphoreTerminate(pExynosPort->loadedResource);
823 pExynosPort->loadedResource = NULL;
824 Exynos_OSAL_SemaphoreTerminate(pExynosPort->unloadedResource);
825 pExynosPort->unloadedResource = NULL;
826 Exynos_OSAL_Free(pExynosPort->bufferStateAllocate);
827 pExynosPort->bufferStateAllocate = NULL;
828 Exynos_OSAL_Free(pExynosPort->extendBufferHeader);
829 pExynosPort->extendBufferHeader = NULL;
831 Exynos_OSAL_QueueTerminate(&pExynosPort->bufferQ);
833 Exynos_OSAL_Free(pExynosComponent->pExynosPort);
834 pExynosComponent->pExynosPort = NULL;
842 OMX_ERRORTYPE Exynos_ResetDataBuffer(EXYNOS_OMX_DATABUFFER *pDataBuffer)
844 OMX_ERRORTYPE ret = OMX_ErrorNone;
846 if (pDataBuffer == NULL) {
847 ret = OMX_ErrorBadParameter;
851 pDataBuffer->dataValid = OMX_FALSE;
852 pDataBuffer->dataLen = 0;
853 pDataBuffer->remainDataLen = 0;
854 pDataBuffer->usedDataLen = 0;
855 pDataBuffer->bufferHeader = NULL;
856 pDataBuffer->nFlags = 0;
857 pDataBuffer->timeStamp = 0;
858 pDataBuffer->pPrivate = NULL;
864 OMX_ERRORTYPE Exynos_ResetCodecData(EXYNOS_OMX_DATA *pData)
866 OMX_ERRORTYPE ret = OMX_ErrorNone;
869 ret = OMX_ErrorBadParameter;
874 pData->usedDataLen = 0;
875 pData->remainDataLen = 0;
877 pData->timeStamp = 0;
878 pData->pPrivate = NULL;
879 pData->bufferHeader = NULL;
885 OMX_ERRORTYPE Exynos_Shared_BufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_PLANE nPlane)
887 OMX_ERRORTYPE ret = OMX_ErrorNone;
889 if (nPlane == ONE_PLANE) {
890 /* Case of Shared Buffer, Only support singlePlaneBuffer */
891 pData->buffer.singlePlaneBuffer.dataBuffer = pUseBuffer->bufferHeader->pBuffer;
893 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane");
894 ret = OMX_ErrorNotImplemented;
898 pData->allocSize = pUseBuffer->allocSize;
899 pData->dataLen = pUseBuffer->dataLen;
900 pData->usedDataLen = pUseBuffer->usedDataLen;
901 pData->remainDataLen = pUseBuffer->remainDataLen;
902 pData->timeStamp = pUseBuffer->timeStamp;
903 pData->nFlags = pUseBuffer->nFlags;
904 pData->pPrivate = pUseBuffer->pPrivate;
905 pData->bufferHeader = pUseBuffer->bufferHeader;
911 OMX_ERRORTYPE Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer)
913 OMX_ERRORTYPE ret = OMX_ErrorNone;
915 pUseBuffer->bufferHeader = pData->bufferHeader;
916 pUseBuffer->allocSize = pData->allocSize;
917 pUseBuffer->dataLen = pData->dataLen;
918 pUseBuffer->usedDataLen = pData->usedDataLen;
919 pUseBuffer->remainDataLen = pData->remainDataLen;
920 pUseBuffer->timeStamp = pData->timeStamp;
921 pUseBuffer->nFlags = pData->nFlags;
922 pUseBuffer->pPrivate = pData->pPrivate;