120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/*
220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * Copyright 2012 Samsung Electronics S.LSI Co. LTD
420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Licensed under the Apache License, Version 2.0 (the "License");
620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * you may not use this file except in compliance with the License.
720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * You may obtain a copy of the License at
820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *      http://www.apache.org/licenses/LICENSE-2.0
1020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *
1120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * Unless required by applicable law or agreed to in writing, software
1220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * distributed under the License is distributed on an "AS IS" BASIS,
1320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * See the License for the specific language governing permissions and
1520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * limitations under the License.
1620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */
1720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
1820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang/*
1920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @file       Exynos_OMX_Baseport.c
2020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @brief
2120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
2220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang *             HyeYeon Chung (hyeon.chung@samsung.com)
2338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang * @version    2.0.0
2420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang * @history
2538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang *    2012.02.20 : Create
2620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang */
2720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
2820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdio.h>
2920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <stdlib.h>
3020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include <string.h>
3120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
3220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Macros.h"
3320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Event.h"
3420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Semaphore.h"
3520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Mutex.h"
3620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
3720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Baseport.h"
3820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OMX_Basecomponent.h"
3920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#undef  EXYNOS_LOG_TAG
4120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_TAG    "EXYNOS_BASE_PORT"
4220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#define EXYNOS_LOG_OFF
4338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang//#define EXYNOS_TRACE_ON
4420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang#include "Exynos_OSAL_Log.h"
4520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
4738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, OMX_BUFFERHEADERTYPE* bufferHeader)
4820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
4938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
5020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
5138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
5238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                   i = 0;
5320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
5438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
5538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
5638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (bufferHeader == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
5738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_FALSE;
5838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            break;
5920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
6020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
6120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
6338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
6420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
6620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
6720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
6838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, OMX_BUFFERHEADERTYPE* bufferHeader)
6920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
7038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
7138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
7238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
7338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                   i = 0;
7420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
7538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
76c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim    for (i = 0; i < MAX_BUFFER_NUM; i++) {
7738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (bufferHeader == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
7838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_FALSE;
7938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            break;
8020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
8120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
8220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
8438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
8520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
86c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom KimEXIT:
87c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d, bufferHeader:0x%x", __FUNCTION__, __LINE__, bufferHeader);
8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
8920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferFlushProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
9338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
9420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
9520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
9638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32                   portIndex = 0;
9738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
9838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                   i = 0, cnt = 0;
9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent == NULL) {
10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < cnt; i++) {
12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (nPortIndex == ALL_PORT_INDEX)
12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = i;
12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
12320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = nPortIndex;
12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->exynos_BufferFlush(pOMXComponent, portIndex, bEvent);
12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
13120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->callbackData,
13338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        OMX_EventError,
13438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        ret, 0, NULL);
13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_EnablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0, cnt = 0;
14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
15220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
15438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosPort->loadedResource);
155c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim
156c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim        if (pExynosPort->exceptionFlag == INVALID_STATE) {
157c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim            pExynosPort->exceptionFlag = NEED_PORT_DISABLE;
158c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim            goto EXIT;
159c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim        }
16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->portDefinition.bPopulated = OMX_TRUE;
16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
16238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->exceptionFlag = GENERAL_STATE;
16338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
16438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_PortEnableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex)
17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                portIndex = 0;
17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0, cnt = 0;
17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent == NULL) {
18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    cnt = (nPortIndex == ALL_PORT_INDEX) ? ALL_PORT_NUM : 1;
19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < cnt; i++) {
20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (nPortIndex == ALL_PORT_INDEX)
20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = i;
20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = nPortIndex;
20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_EnablePort(pOMXComponent, portIndex);
20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret == OMX_ErrorNone) {
20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            pExynosComponent->callbackData,
20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_EventCmdComplete,
21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_CommandPortEnable, portIndex, NULL);
21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            pExynosComponent->callbackData,
21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_EventError,
21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            ret, 0, NULL);
22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_DisablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0, elemNum = 0;
23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message;
23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
23820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (!CHECK_PORT_ENABLED(pExynosPort)) {
24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
24438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState != OMX_StateLoaded) {
24538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
24638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_Free(message);
24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
25138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->portDefinition.bPopulated = OMX_FALSE;
25238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource);
25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_FALSE;
25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_PortDisableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex)
26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
26520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
26620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
26738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
26820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                portIndex = 0;
26920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0, cnt = 0;
27038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
27320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent == NULL) {
27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
27720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
27820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
28120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
28420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
28520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* port flush*/
29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for(i = 0; i < cnt; i++) {
29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (nPortIndex == ALL_PORT_INDEX)
29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = i;
29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = nPortIndex;
29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_BufferFlushProcess(pOMXComponent, portIndex, OMX_FALSE);
29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for(i = 0; i < cnt; i++) {
30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (nPortIndex == ALL_PORT_INDEX)
30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = i;
30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = nPortIndex;
30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_DisablePort(pOMXComponent, portIndex);
30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->pExynosPort[portIndex].bIsPortDisabled = OMX_FALSE;
30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret == OMX_ErrorNone) {
31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            pExynosComponent->callbackData,
31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_EventCmdComplete,
31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_CommandPortDisable, portIndex, NULL);
31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        pExynosComponent->callbackData,
32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        OMX_EventError,
32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        ret, 0, NULL);
32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_EmptyThisBuffer(
33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE        hComponent,
33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL               findBuffer = OMX_FALSE;
33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message;
34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0;
34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
34820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
34920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
35620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
36120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
36220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pBuffer == NULL) {
36520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
36620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
36720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
36820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pBuffer->nInputPortIndex != INPUT_PORT_INDEX) {
36920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
37020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
37120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
37220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
37320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE));
37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
37520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState != OMX_StateIdle) &&
37920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState != OMX_StateExecuting) &&
38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState != OMX_StatePause)) {
38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
38320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
38420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
38520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
38620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosPort)) ||
387c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim        (CHECK_PORT_BEING_FLUSHED(pExynosPort) &&
38820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) ||
38920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) &&
39020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) {
39120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
39220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
39320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
39420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
39538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
39620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
39738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
39838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE;
39920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            findBuffer = OMX_TRUE;
40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
40120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
40220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
40320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (findBuffer == OMX_FALSE) {
40520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
40638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
41020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
41120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (message == NULL) {
41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
41338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
41620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->messageType = EXYNOS_OMX_CommandEmptyBuffer;
41720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->messageParam = (OMX_U32) i;
41820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->pCmdData = (OMX_PTR)pBuffer;
41920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message);
42120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != 0) {
42220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUndefined;
42338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
42420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
42520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
42738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
42820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
43220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
43420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
43520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_FillThisBuffer(
43620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE        hComponent,
43720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
43820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
43920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
44020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL               findBuffer = OMX_FALSE;
44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message;
44520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0;
44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
45020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
45420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
46820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pBuffer == NULL) {
47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pBuffer->nOutputPortIndex != OUTPUT_PORT_INDEX) {
47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE));
47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
48320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState != OMX_StateIdle) &&
48420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState != OMX_StateExecuting) &&
48520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState != OMX_StatePause)) {
48620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
48820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosPort)) ||
492c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim        (CHECK_PORT_BEING_FLUSHED(pExynosPort) &&
49320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) ||
49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) &&
49520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) {
49620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
49920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
501c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim    for (i = 0; i < MAX_BUFFER_NUM; i++) {
50238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
50338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE;
50420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            findBuffer = OMX_TRUE;
50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
50620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
50720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
50820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (findBuffer == OMX_FALSE) {
51020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
51220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
51520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (message == NULL) {
51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
51838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
52120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->messageType = EXYNOS_OMX_CommandFillBuffer;
52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->messageParam = (OMX_U32) i;
52320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->pCmdData = (OMX_PTR)pBuffer;
52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message);
52620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != 0) {
52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUndefined;
52838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
52920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
53120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
53338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
53720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
54020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Port_Constructor(OMX_HANDLETYPE hComponent)
54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
54320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
54520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = NULL;
54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = NULL;
54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
55020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
55120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
55520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
56720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
56820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
57120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    INIT_SET_SIZE_VERSION(&pExynosComponent->portParam, OMX_PORT_PARAM_TYPE);
57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->portParam.nPorts = ALL_PORT_NUM;
57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->portParam.nStartPortNumber = INPUT_PORT_INDEX;
57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM);
57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosPort == NULL) {
57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
58020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort, 0, sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM);
58220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->pExynosPort = pExynosPort;
58320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input Port */
58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort = &pExynosPort[INPUT_PORT_INDEX];
58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_QueueCreate(&pExynosInputPort->bufferQ, MAX_QUEUE_ELEMENTS);
58820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosInputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosInputPort->extendBufferHeader == NULL) {
59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
59420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
59520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
59738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(pExynosInputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
59820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM);
60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosInputPort->bufferStateAllocate == NULL) {
60138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
60238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosInputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM);
61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bufferSemID = NULL;
61220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->assignedBufferNum = 0;
61320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portState = OMX_StateMax;
61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bIsPortFlushed = OMX_FALSE;
61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bIsPortDisabled = OMX_FALSE;
61620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->tunneledComponent = NULL;
61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->tunneledPort = 0;
61820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->tunnelBufferNum = 0;
61920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bufferSupplier = OMX_BufferSupplyUnspecified;
62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->tunnelFlags = 0;
62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->loadedResource);
62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
62538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
62638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
63020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
63120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->unloadedResource);
63220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
63420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
63520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
63620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
63738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
63838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    INIT_SET_SIZE_VERSION(&pExynosInputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
64520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nPortIndex = INPUT_PORT_INDEX;
64620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.eDir = OMX_DirInput;
64720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nBufferCountActual = 0;
64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nBufferCountMin = 0;
64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nBufferSize = 0;
65020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.bEnabled = OMX_FALSE;
65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.bPopulated = OMX_FALSE;
65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.eDomain = OMX_PortDomainMax;
65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.bBuffersContiguous = OMX_FALSE;
65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nBufferAlignment = 0;
65520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->markType.hMarkTargetComponent = NULL;
65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->markType.pMarkData = NULL;
65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosInputPort->exceptionFlag = GENERAL_STATE;
65820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output Port */
66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort = &pExynosPort[OUTPUT_PORT_INDEX];
66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
662c01f2434dc56e71482229e8ab8c7d5cda7c46d01SeungBeom Kim    Exynos_OSAL_QueueCreate(&pExynosOutputPort->bufferQ, MAX_QUEUE_ELEMENTS); /* For in case of "Output Buffer Share", MAX ELEMENTS(DPB + EDPB) */
66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
66438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosOutputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->extendBufferHeader == NULL) {
66620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->unloadedResource = NULL;
66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
67338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
67620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
67720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
67938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(pExynosOutputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM);
68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosOutputPort->bufferStateAllocate == NULL) {
68338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
68438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosOutputPort->extendBufferHeader = NULL;
68520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
68620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->unloadedResource = NULL;
68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
69238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
69338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosOutputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM);
70020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
70120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bufferSemID = NULL;
70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->assignedBufferNum = 0;
70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portState = OMX_StateMax;
70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bIsPortFlushed = OMX_FALSE;
70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bIsPortDisabled = OMX_FALSE;
70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->tunneledComponent = NULL;
70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->tunneledPort = 0;
70820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->tunnelBufferNum = 0;
70920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bufferSupplier = OMX_BufferSupplyUnspecified;
71020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->tunnelFlags = 0;
71120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->loadedResource);
71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate);
71420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosOutputPort->bufferStateAllocate = NULL;
71538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
71638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosOutputPort->extendBufferHeader = NULL;
71720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
71820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
71920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->unloadedResource = NULL;
72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
72438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
72538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
72720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
72920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
73020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->unloadedResource);
73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
73220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->loadedResource);
73320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosOutputPort->loadedResource = NULL;
73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate);
73520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosOutputPort->bufferStateAllocate = NULL;
73638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
73738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosOutputPort->extendBufferHeader = NULL;
73820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
73920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->unloadedResource = NULL;
74120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
74538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
74638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
74720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
74920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    INIT_SET_SIZE_VERSION(&pExynosOutputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nPortIndex = OUTPUT_PORT_INDEX;
75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.eDir = OMX_DirOutput;
75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nBufferCountActual = 0;
75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nBufferCountMin = 0;
75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nBufferSize = 0;
75820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.bEnabled = OMX_FALSE;
75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.bPopulated = OMX_FALSE;
76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.eDomain = OMX_PortDomainMax;
76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.bBuffersContiguous = OMX_FALSE;
76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nBufferAlignment = 0;
76320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->markType.hMarkTargetComponent = NULL;
76420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->markType.pMarkData = NULL;
76538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosOutputPort->exceptionFlag = GENERAL_STATE;
76620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
76820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
76920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->checkTimeStamp.startTimeStamp = 0;
77020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->EmptyThisBuffer = &Exynos_OMX_EmptyThisBuffer;
77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->FillThisBuffer  = &Exynos_OMX_FillThisBuffer;
77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
77720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
77820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
78220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Port_Destructor(OMX_HANDLETYPE hComponent)
78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
784d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    OMX_ERRORTYPE             ret = OMX_ErrorNone;
785d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
78620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
789d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    OMX_S32 countValue = 0;
79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
792d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    FunctionIn();
793d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim
79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
80120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
80220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
80320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
80420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
80520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
80620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
80720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
808d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim
809d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    if (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) {
810d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        pExynosComponent->abendState = OMX_TRUE;
811d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        for (i = 0; i < ALL_PORT_NUM; i++) {
812d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[i];
813d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim            Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
814d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        }
815d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        Exynos_OSAL_SignalWait(pExynosComponent->abendStateEvent, DEF_MAX_WAIT_TIME);
816d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        Exynos_OSAL_SignalReset(pExynosComponent->abendStateEvent);
817d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    }
818d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim
81920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < ALL_PORT_NUM; i++) {
82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[i];
82120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
82220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosPort->loadedResource);
82320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->loadedResource = NULL;
82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosPort->unloadedResource);
82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->unloadedResource = NULL;
82620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort->bufferStateAllocate);
82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->bufferStateAllocate = NULL;
82838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosPort->extendBufferHeader);
82938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->extendBufferHeader = NULL;
83020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosPort->bufferQ);
83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->pExynosPort);
83420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->pExynosPort = NULL;
83520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
83620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
83720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
83820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
84020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_ResetDataBuffer(EXYNOS_OMX_DATABUFFER *pDataBuffer)
84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDataBuffer == NULL) {
84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
84938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
85038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->dataValid     = OMX_FALSE;
85238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->dataLen       = 0;
85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->remainDataLen = 0;
85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->usedDataLen   = 0;
85538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->bufferHeader  = NULL;
85638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->nFlags        = 0;
85738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->timeStamp     = 0;
85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->pPrivate      = NULL;
85938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
86038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_ResetCodecData(EXYNOS_OMX_DATA *pData)
86538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
86638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
86738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
86838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pData == NULL) {
86938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
87038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
87138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
87238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
87338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->dataLen       = 0;
87438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->usedDataLen   = 0;
87538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->remainDataLen = 0;
87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->nFlags        = 0;
87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->timeStamp     = 0;
87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->pPrivate      = NULL;
87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->bufferHeader  = NULL;
880f8d511af096144c3c33d823f879ae0e471ae5284SeungBeom Kim    pData->allocSize     = 0;
88138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_BufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_PLANE nPlane)
88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
88838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPlane == ONE_PLANE) {
89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Case of Shared Buffer, Only support singlePlaneBuffer */
89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pData->buffer.singlePlaneBuffer.dataBuffer = pUseBuffer->bufferHeader->pBuffer;
89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane");
89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNotImplemented;
89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
89738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->allocSize     = pUseBuffer->allocSize;
90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->dataLen       = pUseBuffer->dataLen;
90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->usedDataLen   = pUseBuffer->usedDataLen;
90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->remainDataLen = pUseBuffer->remainDataLen;
90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->timeStamp     = pUseBuffer->timeStamp;
90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->nFlags        = pUseBuffer->nFlags;
90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->pPrivate      = pUseBuffer->pPrivate;
90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->bufferHeader  = pUseBuffer->bufferHeader;
90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
91238ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer)
91338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
91438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->bufferHeader          = pData->bufferHeader;
91738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->allocSize             = pData->allocSize;
91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->dataLen               = pData->dataLen;
91938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->usedDataLen           = pData->usedDataLen;
92038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->remainDataLen         = pData->remainDataLen;
92138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->timeStamp             = pData->timeStamp;
92238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->nFlags                = pData->nFlags;
92338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->pPrivate              = pData->pPrivate;
92438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
92538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
92638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
927