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);
7638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; 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
8620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
8720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
8820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
8938ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_OMX_BufferFlushProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
9020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
9138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE             ret = OMX_ErrorNone;
9220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
9320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
9438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_S32                   portIndex = 0;
9538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
9638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_U32                   i = 0, cnt = 0;
9720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
9820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
9920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent == NULL) {
10120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
10220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
10320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
10420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
10520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
10620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
10720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
10820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
10920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
11020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
11120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
11220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
11320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
11420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
11620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
11720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < cnt; i++) {
11820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (nPortIndex == ALL_PORT_INDEX)
11920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = i;
12020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
12120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = nPortIndex;
12220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosComponent->exynos_BufferFlush(pOMXComponent, portIndex, bEvent);
12420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
12520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
12620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
12720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
12838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
12920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
13038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        pExynosComponent->callbackData,
13138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        OMX_EventError,
13238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang                        ret, 0, NULL);
13320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
13420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
13620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
13720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
13820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
13920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_EnablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
14120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
14220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
14320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
14420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
14520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0, cnt = 0;
14620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
14820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
14920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
15020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
15138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
15238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosPort->loadedResource);
15320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->portDefinition.bPopulated = OMX_TRUE;
15420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
15538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->exceptionFlag = GENERAL_STATE;
15638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
15738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
15820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
15920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
16120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
16220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
16420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
16520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
16620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_PortEnableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex)
16720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
16820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
16920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
17020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                portIndex = 0;
17120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0, cnt = 0;
17220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
17420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
17520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent == NULL) {
17620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
17720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
17820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
17920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
18020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
18120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
18220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
18320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
18420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
18520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
18620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
18720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
18820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
18920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    cnt = (nPortIndex == ALL_PORT_INDEX) ? ALL_PORT_NUM : 1;
19120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < cnt; i++) {
19320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (nPortIndex == ALL_PORT_INDEX)
19420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = i;
19520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
19620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = nPortIndex;
19720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
19820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_EnablePort(pOMXComponent, portIndex);
19920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret == OMX_ErrorNone) {
20020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
20120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            pExynosComponent->callbackData,
20220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_EventCmdComplete,
20320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_CommandPortEnable, portIndex, NULL);
20420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
20520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
20620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
20720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
20820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
20920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
21020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            pExynosComponent->callbackData,
21120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_EventError,
21220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            ret, 0, NULL);
21320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
21420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
21620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
21720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
21820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
21920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_DisablePort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
22120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
22220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
22320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
22420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
22520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0, elemNum = 0;
22620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message;
22720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
22820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
22920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
23120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (!CHECK_PORT_ENABLED(pExynosPort)) {
23320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorNone;
23420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
23520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
23620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
23738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosComponent->currentState != OMX_StateLoaded) {
23838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
23938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
24020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
24120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                Exynos_OSAL_Free(message);
24220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            }
24320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
24438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->portDefinition.bPopulated = OMX_FALSE;
24538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource);
24620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
24720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort->portDefinition.bEnabled = OMX_FALSE;
24820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
24920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
25120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
25220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
25420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
25520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
25620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_PortDisableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex)
25720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
25820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
25920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
26038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
26120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_S32                portIndex = 0;
26220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0, cnt = 0;
26338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
26420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
26620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
26720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent == NULL) {
26820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
26920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
27020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
27120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
27220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
27320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
27420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
27520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
27620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
27720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
27820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
27920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
28020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
28120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
28320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
28420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* port flush*/
28520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for(i = 0; i < cnt; i++) {
28620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (nPortIndex == ALL_PORT_INDEX)
28720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = i;
28820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
28920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = nPortIndex;
29020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OMX_BufferFlushProcess(pOMXComponent, portIndex, OMX_FALSE);
29220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
29320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
29420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for(i = 0; i < cnt; i++) {
29520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (nPortIndex == ALL_PORT_INDEX)
29620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = i;
29720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        else
29820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            portIndex = nPortIndex;
29920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
30020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = Exynos_OMX_DisablePort(pOMXComponent, portIndex);
30120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->pExynosPort[portIndex].bIsPortDisabled = OMX_FALSE;
30220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        if (ret == OMX_ErrorNone) {
30320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
30420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            pExynosComponent->callbackData,
30520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_EventCmdComplete,
30620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                            OMX_CommandPortDisable, portIndex, NULL);
30720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
30820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
30920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
31020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
31120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
31220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
31320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        pExynosComponent->callbackData,
31420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        OMX_EventError,
31520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang                        ret, 0, NULL);
31620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
31720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
31820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
31920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
32020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
32120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
32220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
32320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_EmptyThisBuffer(
32420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE        hComponent,
32520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
32620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
32720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
32820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
32920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
33020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
33120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL               findBuffer = OMX_FALSE;
33220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message;
33320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0;
33420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
33520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
33620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
33720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
33820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
33920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
34020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
34120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
34220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
34320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
34420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
34520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
34620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
34720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
34820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
34920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
35020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
35120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
35220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
35320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
35420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
35520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
35620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
35720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pBuffer == NULL) {
35820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
35920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
36020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
36120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pBuffer->nInputPortIndex != INPUT_PORT_INDEX) {
36220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
36320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
36420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
36520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
36620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE));
36720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
36820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
36920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
37020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
37120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState != OMX_StateIdle) &&
37220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState != OMX_StateExecuting) &&
37320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState != OMX_StatePause)) {
37420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
37520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
37620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
37720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
37820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
37920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosPort)) ||
38020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) &&
38120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) ||
38220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) &&
38320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) {
38420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
38520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
38620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
38720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
38838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
38920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
39038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
39138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE;
39220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            findBuffer = OMX_TRUE;
39320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
39420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
39520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
39620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
39720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (findBuffer == OMX_FALSE) {
39820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
39938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
40020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
40120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
40220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
40320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
40420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (message == NULL) {
40520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
40638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
40720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
40820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
40920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->messageType = EXYNOS_OMX_CommandEmptyBuffer;
41020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->messageParam = (OMX_U32) i;
41120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->pCmdData = (OMX_PTR)pBuffer;
41220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
41320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message);
41420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != 0) {
41520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUndefined;
41638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
41720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
41820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
41920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
42038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
42120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
42320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
42420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
42620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
42720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
42820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_FillThisBuffer(
42920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_HANDLETYPE        hComponent,
43020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
43120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
43220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE           ret = OMX_ErrorNone;
43320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
43420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
43520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
43620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_BOOL               findBuffer = OMX_FALSE;
43720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_MESSAGE       *message;
43820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_U32                i = 0;
43920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
44120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
44220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
44320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
44420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
44520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
44620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
44720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
44820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
44920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
45020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
45120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
45220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
45320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
45420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
45520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
45620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
45720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosComponent->currentState == OMX_StateInvalid) {
45820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInvalidState;
45920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
46020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
46120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
46220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pBuffer == NULL) {
46320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
46420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
46520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
46620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pBuffer->nOutputPortIndex != OUTPUT_PORT_INDEX) {
46720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadPortIndex;
46820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
46920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
47020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
47120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE));
47220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
47320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
47420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
47520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
47620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((pExynosComponent->currentState != OMX_StateIdle) &&
47720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState != OMX_StateExecuting) &&
47820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (pExynosComponent->currentState != OMX_StatePause)) {
47920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
48020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
48120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
48220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
48320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
48420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if ((!CHECK_PORT_ENABLED(pExynosPort)) ||
48520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) &&
48620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) ||
48720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) &&
48820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) {
48920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorIncorrectStateOperation;
49020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
49120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
49220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
49338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
49420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
49538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
49638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE;
49720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            findBuffer = OMX_TRUE;
49820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang            break;
49920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        }
50020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
50120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (findBuffer == OMX_FALSE) {
50320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
50438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
50520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
50620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
50720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
50820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
50920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (message == NULL) {
51020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
51138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
51220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
51320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
51420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->messageType = EXYNOS_OMX_CommandFillBuffer;
51520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->messageParam = (OMX_U32) i;
51620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    message->pCmdData = (OMX_PTR)pBuffer;
51720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
51820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message);
51920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != 0) {
52020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorUndefined;
52138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
52220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
52320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
52420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
52520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
52638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
52720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
52820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
52920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
53020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
53220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
53320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
53420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Port_Constructor(OMX_HANDLETYPE hComponent)
53520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
53620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_ERRORTYPE          ret = OMX_ErrorNone;
53720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
53820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
53920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
54020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosInputPort = NULL;
54120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = NULL;
54220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
54320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
54420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionIn();
54520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
54620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
54720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
54820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
54920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
55020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
55120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
55220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
55320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
55420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
55520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
55620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
55720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
55820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
55920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
56020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
56120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
56220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
56320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
56420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    INIT_SET_SIZE_VERSION(&pExynosComponent->portParam, OMX_PORT_PARAM_TYPE);
56520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->portParam.nPorts = ALL_PORT_NUM;
56620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->portParam.nStartPortNumber = INPUT_PORT_INDEX;
56720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
56820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosPort = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM);
56920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosPort == NULL) {
57020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
57120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
57220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
57320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
57420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosPort, 0, sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM);
57520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->pExynosPort = pExynosPort;
57620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
57720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Input Port */
57820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort = &pExynosPort[INPUT_PORT_INDEX];
57920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_QueueCreate(&pExynosInputPort->bufferQ, MAX_QUEUE_ELEMENTS);
58120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
58238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosInputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
58338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosInputPort->extendBufferHeader == NULL) {
58420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
58520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
58620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
58720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
58820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
58920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
59038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(pExynosInputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
59120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
59220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM);
59320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosInputPort->bufferStateAllocate == NULL) {
59438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
59538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
59620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
59720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
59820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
59920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
60020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
60120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
60220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosInputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM);
60320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
60420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bufferSemID = NULL;
60520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->assignedBufferNum = 0;
60620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portState = OMX_StateMax;
60720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bIsPortFlushed = OMX_FALSE;
60820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bIsPortDisabled = OMX_FALSE;
60920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->tunneledComponent = NULL;
61020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->tunneledPort = 0;
61120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->tunnelBufferNum = 0;
61220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->bufferSupplier = OMX_BufferSupplyUnspecified;
61320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->tunnelFlags = 0;
61420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->loadedResource);
61520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
61620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
61720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
61838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
61938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
62020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
62120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
62220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
62320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
62420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->unloadedResource);
62520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
62620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
62720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
62820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
62920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
63038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
63138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
63220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
63320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
63420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
63520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
63620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
63720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    INIT_SET_SIZE_VERSION(&pExynosInputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
63820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nPortIndex = INPUT_PORT_INDEX;
63920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.eDir = OMX_DirInput;
64020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nBufferCountActual = 0;
64120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nBufferCountMin = 0;
64220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nBufferSize = 0;
64320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.bEnabled = OMX_FALSE;
64420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.bPopulated = OMX_FALSE;
64520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.eDomain = OMX_PortDomainMax;
64620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.bBuffersContiguous = OMX_FALSE;
64720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->portDefinition.nBufferAlignment = 0;
64820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->markType.hMarkTargetComponent = NULL;
64920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosInputPort->markType.pMarkData = NULL;
65038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosInputPort->exceptionFlag = GENERAL_STATE;
65120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    /* Output Port */
65320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort = &pExynosPort[OUTPUT_PORT_INDEX];
65420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_QueueCreate(&pExynosOutputPort->bufferQ, MAX_QUEUE_ELEMENTS); /* For in case of "Output Buffer Share", MAX ELEMENTS(DPB + EDPB) */
65620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
65738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosOutputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
65838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pExynosOutputPort->extendBufferHeader == NULL) {
65920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
66020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->unloadedResource = NULL;
66120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
66220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
66320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
66420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
66538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
66638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
66720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
66820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
66920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
67020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
67120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
67238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    Exynos_OSAL_Memset(pExynosOutputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
67320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM);
67520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pExynosOutputPort->bufferStateAllocate == NULL) {
67638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
67738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosOutputPort->extendBufferHeader = NULL;
67820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
67920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
68020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->unloadedResource = NULL;
68120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
68220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
68320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
68420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
68538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
68638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
68720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
68820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
68920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorInsufficientResources;
69020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
69120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
69220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Memset(pExynosOutputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM);
69320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
69420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bufferSemID = NULL;
69520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->assignedBufferNum = 0;
69620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portState = OMX_StateMax;
69720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bIsPortFlushed = OMX_FALSE;
69820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bIsPortDisabled = OMX_FALSE;
69920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->tunneledComponent = NULL;
70020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->tunneledPort = 0;
70120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->tunnelBufferNum = 0;
70220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->bufferSupplier = OMX_BufferSupplyUnspecified;
70320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->tunnelFlags = 0;
70420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->loadedResource);
70520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
70620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate);
70720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosOutputPort->bufferStateAllocate = NULL;
70838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
70938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosOutputPort->extendBufferHeader = NULL;
71020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
71120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
71220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->unloadedResource = NULL;
71320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
71420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
71520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
71620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
71738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
71838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
71920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
72020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
72120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
72220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
72320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->unloadedResource);
72420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
72520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->loadedResource);
72620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosOutputPort->loadedResource = NULL;
72720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate);
72820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosOutputPort->bufferStateAllocate = NULL;
72938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
73038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosOutputPort->extendBufferHeader = NULL;
73120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
73220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
73320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->unloadedResource = NULL;
73420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
73520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->loadedResource = NULL;
73620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
73720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosInputPort->bufferStateAllocate = NULL;
73838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
73938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosInputPort->extendBufferHeader = NULL;
74020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort);
74120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = NULL;
74220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
74320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
74420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
74520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    INIT_SET_SIZE_VERSION(&pExynosOutputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
74620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nPortIndex = OUTPUT_PORT_INDEX;
74720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.eDir = OMX_DirOutput;
74820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nBufferCountActual = 0;
74920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nBufferCountMin = 0;
75020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nBufferSize = 0;
75120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.bEnabled = OMX_FALSE;
75220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.bPopulated = OMX_FALSE;
75320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.eDomain = OMX_PortDomainMax;
75420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.bBuffersContiguous = OMX_FALSE;
75520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->portDefinition.nBufferAlignment = 0;
75620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->markType.hMarkTargetComponent = NULL;
75720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosOutputPort->markType.pMarkData = NULL;
75838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pExynosOutputPort->exceptionFlag = GENERAL_STATE;
75920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
76120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
76220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->checkTimeStamp.startTimeStamp = 0;
76320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
76420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->EmptyThisBuffer = &Exynos_OMX_EmptyThisBuffer;
76620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent->FillThisBuffer  = &Exynos_OMX_FillThisBuffer;
76720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
76820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
76920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
77020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
77120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
77320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
77420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
77520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangOMX_ERRORTYPE Exynos_OMX_Port_Destructor(OMX_HANDLETYPE hComponent)
77620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang{
777d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    OMX_ERRORTYPE             ret = OMX_ErrorNone;
778d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
77920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
78020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
78120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
782d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    OMX_S32 countValue = 0;
78320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    int i = 0;
78420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
785d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    FunctionIn();
786d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim
78720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (hComponent == NULL) {
78820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
78920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
79020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
79120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
79220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
79320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (ret != OMX_ErrorNone) {
79420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
79520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
79620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    if (pOMXComponent->pComponentPrivate == NULL) {
79720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        ret = OMX_ErrorBadParameter;
79820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        goto EXIT;
79920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
80020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
801d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim
802d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    if (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) {
803d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        pExynosComponent->abendState = OMX_TRUE;
804d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        for (i = 0; i < ALL_PORT_NUM; i++) {
805d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim            pExynosPort = &pExynosComponent->pExynosPort[i];
806d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim            Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
807d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        }
808d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        Exynos_OSAL_SignalWait(pExynosComponent->abendStateEvent, DEF_MAX_WAIT_TIME);
809d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim        Exynos_OSAL_SignalReset(pExynosComponent->abendStateEvent);
810d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim    }
811d9966f64b1a4f195c099ccff95672d8fc7b8fed6SeungBeom Kim
81220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    for (i = 0; i < ALL_PORT_NUM; i++) {
81320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort = &pExynosComponent->pExynosPort[i];
81420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
81520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosPort->loadedResource);
81620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->loadedResource = NULL;
81720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_SemaphoreTerminate(pExynosPort->unloadedResource);
81820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->unloadedResource = NULL;
81920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_Free(pExynosPort->bufferStateAllocate);
82020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        pExynosPort->bufferStateAllocate = NULL;
82138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Free(pExynosPort->extendBufferHeader);
82238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pExynosPort->extendBufferHeader = NULL;
82320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
82420d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang        Exynos_OSAL_QueueTerminate(&pExynosPort->bufferQ);
82520d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    }
82620d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    Exynos_OSAL_Free(pExynosComponent->pExynosPort);
82720d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    pExynosComponent->pExynosPort = NULL;
82820d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    ret = OMX_ErrorNone;
82920d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho ChangEXIT:
83020d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    FunctionOut();
83120d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang
83220d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang    return ret;
83320d3e6e3118a6e19627296e9247e948d54ec0fb8Jiho Chang}
83438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83538ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_ResetDataBuffer(EXYNOS_OMX_DATABUFFER *pDataBuffer)
83638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
83738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
83838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
83938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pDataBuffer == NULL) {
84038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
84138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
84238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
84338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
84438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->dataValid     = OMX_FALSE;
84538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->dataLen       = 0;
84638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->remainDataLen = 0;
84738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->usedDataLen   = 0;
84838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->bufferHeader  = NULL;
84938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->nFlags        = 0;
85038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->timeStamp     = 0;
85138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pDataBuffer->pPrivate      = NULL;
85238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
85338ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
85438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
85538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
85638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
85738ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_ResetCodecData(EXYNOS_OMX_DATA *pData)
85838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
85938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
86038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
86138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (pData == NULL) {
86238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorBadParameter;
86338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
86438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
86538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
86638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->dataLen       = 0;
86738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->usedDataLen   = 0;
86838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->remainDataLen = 0;
86938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->nFlags        = 0;
87038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->timeStamp     = 0;
87138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->pPrivate      = NULL;
87238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->bufferHeader  = NULL;
87338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
87438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
87538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
87638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
87738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
87838ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_BufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_PLANE nPlane)
87938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
88038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
88138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
88238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    if (nPlane == ONE_PLANE) {
88338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        /* Case of Shared Buffer, Only support singlePlaneBuffer */
88438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        pData->buffer.singlePlaneBuffer.dataBuffer = pUseBuffer->bufferHeader->pBuffer;
88538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    } else {
88638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane");
88738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        ret = OMX_ErrorNotImplemented;
88838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang        goto EXIT;
88938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    }
89038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
89138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->allocSize     = pUseBuffer->allocSize;
89238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->dataLen       = pUseBuffer->dataLen;
89338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->usedDataLen   = pUseBuffer->usedDataLen;
89438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->remainDataLen = pUseBuffer->remainDataLen;
89538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->timeStamp     = pUseBuffer->timeStamp;
89638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->nFlags        = pUseBuffer->nFlags;
89738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->pPrivate      = pUseBuffer->pPrivate;
89838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pData->bufferHeader  = pUseBuffer->bufferHeader;
89938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90038ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangEXIT:
90138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
90238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
90338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90438ef2572d26fc760c584a1855a3d002f34eb0231Jiho ChangOMX_ERRORTYPE Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer)
90538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang{
90638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    OMX_ERRORTYPE ret = OMX_ErrorNone;
90738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
90838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->bufferHeader          = pData->bufferHeader;
90938ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->allocSize             = pData->allocSize;
91038ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->dataLen               = pData->dataLen;
91138ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->usedDataLen           = pData->usedDataLen;
91238ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->remainDataLen         = pData->remainDataLen;
91338ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->timeStamp             = pData->timeStamp;
91438ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->nFlags                = pData->nFlags;
91538ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    pUseBuffer->pPrivate              = pData->pPrivate;
91638ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang
91738ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang    return ret;
91838ef2572d26fc760c584a1855a3d002f34eb0231Jiho Chang}
919