exynos_omx: multi_thread: Convert DOS to Unix.
authorSeungBeom Kim <sbcrux.kim@samsung.com>
Mon, 2 Jul 2012 06:07:19 +0000 (15:07 +0900)
committerDima Zavin <dima@android.com>
Tue, 24 Jul 2012 22:12:40 +0000 (15:12 -0700)
Change-Id: I55ccef02a191e41a46442c11e57bf505130eca36
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c

index 095df6863c291bbb1fd3148e1f8627404d09beda..e7003e81030cd16c27e727b45e84629262054dac 100644 (file)
-/*\r
- *\r
- * Copyright 2012 Samsung Electronics S.LSI Co. LTD\r
- *\r
- * Licensed under the Apache License, Version 2.0 (the "License");\r
- * you may not use this file except in compliance with the License.\r
- * You may obtain a copy of the License at\r
- *\r
- *      http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
- * Unless required by applicable law or agreed to in writing, software\r
- * distributed under the License is distributed on an "AS IS" BASIS,\r
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
- * See the License for the specific language governing permissions and\r
- * limitations under the License.\r
- */\r
-\r
-/*\r
- * @file        Exynos_OMX_VencControl.c\r
- * @brief\r
- * @author      SeungBeom Kim (sbcrux.kim@samsung.com)\r
- * @version     2.0.0\r
- * @history\r
- *   2012.02.20 : Create\r
- */\r
-\r
-#include <stdio.h>\r
-#include <stdlib.h>\r
-#include <string.h>\r
-#include "Exynos_OMX_Macros.h"\r
-#include "Exynos_OSAL_Event.h"\r
-#include "Exynos_OMX_Venc.h"\r
-#include "Exynos_OMX_VencControl.h"\r
-#include "Exynos_OMX_Basecomponent.h"\r
-#include "Exynos_OSAL_Thread.h"\r
-#include "Exynos_OSAL_Semaphore.h"\r
-#include "Exynos_OSAL_Mutex.h"\r
-#include "Exynos_OSAL_ETC.h"\r
-#include "Exynos_OSAL_SharedMemory.h"\r
-\r
-#ifdef USE_ANB\r
-#include "Exynos_OSAL_Android.h"\r
-#endif\r
-\r
-#undef  EXYNOS_LOG_TAG\r
-#define EXYNOS_LOG_TAG    "EXYNOS_VIDEO_ENCCONTROL"\r
-#define EXYNOS_LOG_OFF\r
-//#define EXYNOS_TRACE_ON\r
-#include "Exynos_OSAL_Log.h"\r
-\r
-\r
-OMX_ERRORTYPE Exynos_OMX_UseBuffer(\r
-    OMX_IN OMX_HANDLETYPE            hComponent,\r
-    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,\r
-    OMX_IN OMX_U32                   nPortIndex,\r
-    OMX_IN OMX_PTR                   pAppPrivate,\r
-    OMX_IN OMX_U32                   nSizeBytes,\r
-    OMX_IN OMX_U8                   *pBuffer)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    OMX_COMPONENTTYPE     *pOMXComponent = NULL;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;\r
-    OMX_U32                i = 0;\r
-\r
-    FunctionIn();\r
-\r
-    if (hComponent == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-\r
-    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];\r
-    if (nPortIndex >= pExynosComponent->portParam.nPorts) {\r
-        ret = OMX_ErrorBadPortIndex;\r
-        goto EXIT;\r
-    }\r
-    if (pExynosPort->portState != OMX_StateIdle) {\r
-        ret = OMX_ErrorIncorrectStateOperation;\r
-        goto EXIT;\r
-    }\r
-\r
-    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {\r
-        ret = OMX_ErrorBadPortIndex;\r
-        goto EXIT;\r
-    }\r
-\r
-    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));\r
-    if (temp_bufferHeader == NULL) {\r
-        ret = OMX_ErrorInsufficientResources;\r
-        goto EXIT;\r
-    }\r
-    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));\r
-\r
-    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {\r
-        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {\r
-            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;\r
-            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);\r
-            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);\r
-            temp_bufferHeader->pBuffer        = pBuffer;\r
-            temp_bufferHeader->nAllocLen      = nSizeBytes;\r
-            temp_bufferHeader->pAppPrivate    = pAppPrivate;\r
-            if (nPortIndex == INPUT_PORT_INDEX)\r
-                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;\r
-            else\r
-                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;\r
-\r
-            pExynosPort->assignedBufferNum++;\r
-            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {\r
-                pExynosPort->portDefinition.bPopulated = OMX_TRUE;\r
-                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */\r
-                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);\r
-                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */\r
-            }\r
-            *ppBufferHdr = temp_bufferHeader;\r
-            ret = OMX_ErrorNone;\r
-            goto EXIT;\r
-        }\r
-    }\r
-\r
-    Exynos_OSAL_Free(temp_bufferHeader);\r
-    ret = OMX_ErrorInsufficientResources;\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(\r
-    OMX_IN OMX_HANDLETYPE            hComponent,\r
-    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,\r
-    OMX_IN OMX_U32                   nPortIndex,\r
-    OMX_IN OMX_PTR                   pAppPrivate,\r
-    OMX_IN OMX_U32                   nSizeBytes)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    OMX_COMPONENTTYPE     *pOMXComponent = NULL;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoDec = NULL;\r
-    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;\r
-    OMX_U8                *temp_buffer = NULL;\r
-    OMX_U32                i = 0;\r
-\r
-    FunctionIn();\r
-\r
-    if (hComponent == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    pVideoDec = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-\r
-    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];\r
-    if (nPortIndex >= pExynosComponent->portParam.nPorts) {\r
-        ret = OMX_ErrorBadPortIndex;\r
-        goto EXIT;\r
-    }\r
-/*\r
-    if (pExynosPort->portState != OMX_StateIdle ) {\r
-        ret = OMX_ErrorIncorrectStateOperation;\r
-        goto EXIT;\r
-    }\r
-*/\r
-    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {\r
-        ret = OMX_ErrorBadPortIndex;\r
-        goto EXIT;\r
-    }\r
-\r
-    if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
-         temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nSizeBytes, NORMAL_MEMORY);\r
-        if (temp_buffer == NULL) {\r
-            ret = OMX_ErrorInsufficientResources;\r
-            goto EXIT;\r
-        }\r
-    } else {\r
-        temp_buffer = Exynos_OSAL_Malloc(sizeof(OMX_U8) * nSizeBytes);\r
-        if (temp_buffer == NULL) {\r
-            ret = OMX_ErrorInsufficientResources;\r
-            goto EXIT;\r
-        }\r
-    }\r
-\r
-    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));\r
-    if (temp_bufferHeader == NULL) {\r
-        if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
-            Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);\r
-        } else {\r
-            Exynos_OSAL_Free(temp_buffer);\r
-        }\r
-\r
-        temp_buffer = NULL;\r
-        ret = OMX_ErrorInsufficientResources;\r
-        goto EXIT;\r
-    }\r
-    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));\r
-\r
-    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {\r
-        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {\r
-            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;\r
-            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);\r
-            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);\r
-            temp_bufferHeader->pBuffer        = temp_buffer;\r
-            temp_bufferHeader->nAllocLen      = nSizeBytes;\r
-            temp_bufferHeader->pAppPrivate    = pAppPrivate;\r
-            if (nPortIndex == INPUT_PORT_INDEX)\r
-                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;\r
-            else\r
-                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;\r
-            pExynosPort->assignedBufferNum++;\r
-            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {\r
-                pExynosPort->portDefinition.bPopulated = OMX_TRUE;\r
-                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */\r
-                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);\r
-                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */\r
-            }\r
-            *ppBuffer = temp_bufferHeader;\r
-            ret = OMX_ErrorNone;\r
-            goto EXIT;\r
-        }\r
-    }\r
-\r
-    Exynos_OSAL_Free(temp_bufferHeader);\r
-    if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
-        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);\r
-    } else {\r
-        Exynos_OSAL_Free(temp_buffer);\r
-    }\r
-\r
-    ret = OMX_ErrorInsufficientResources;\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_FreeBuffer(\r
-    OMX_IN OMX_HANDLETYPE hComponent,\r
-    OMX_IN OMX_U32        nPortIndex,\r
-    OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    OMX_COMPONENTTYPE     *pOMXComponent = NULL;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoDec = NULL;\r
-    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;\r
-    OMX_U8                *temp_buffer = NULL;\r
-    OMX_U32                i = 0;\r
-\r
-    FunctionIn();\r
-\r
-    if (hComponent == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    pVideoDec = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];\r
-\r
-    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {\r
-        ret = OMX_ErrorBadPortIndex;\r
-        goto EXIT;\r
-    }\r
-\r
-    if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {\r
-        (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,\r
-                        pExynosComponent->callbackData,\r
-                        (OMX_U32)OMX_EventError,\r
-                        (OMX_U32)OMX_ErrorPortUnpopulated,\r
-                        nPortIndex, NULL);\r
-    }\r
-\r
-    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { // JH Chang for test\r
-//    for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {\r
-        if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {\r
-            if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {\r
-                if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {\r
-                    if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
-                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);\r
-                    } else {\r
-                        Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);\r
-                    }\r
-                    pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;\r
-                    pBufferHdr->pBuffer = NULL;\r
-                } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {\r
-                    ; /* None*/\r
-                }\r
-                pExynosPort->assignedBufferNum--;\r
-                if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {\r
-                    Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);\r
-                    pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;\r
-                    pBufferHdr = NULL;\r
-                }\r
-                pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;\r
-                ret = OMX_ErrorNone;\r
-                goto EXIT;\r
-            }\r
-        }\r
-    }\r
-\r
-EXIT:\r
-    if (ret == OMX_ErrorNone) {\r
-        if (pExynosPort->assignedBufferNum == 0) {\r
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");\r
-            /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */\r
-            Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);\r
-            /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */\r
-            pExynosPort->portDefinition.bPopulated = OMX_FALSE;\r
-        }\r
-    }\r
-\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)\r
-{\r
-    OMX_ERRORTYPE                 ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;\r
-    OMX_BUFFERHEADERTYPE         *temp_bufferHeader = NULL;\r
-    OMX_U8                       *temp_buffer = NULL;\r
-    OMX_U32                       bufferSize = 0;\r
-    OMX_PARAM_PORTDEFINITIONTYPE  portDefinition;\r
-\r
-    ret = OMX_ErrorTunnelingUnsupported;\r
-EXIT:\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)\r
-{\r
-    OMX_ERRORTYPE ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASEPORT* pExynosPort = NULL;\r
-    OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;\r
-    OMX_U8 *temp_buffer = NULL;\r
-    OMX_U32 bufferSize = 0;\r
-\r
-    ret = OMX_ErrorTunnelingUnsupported;\r
-EXIT:\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(\r
-    OMX_IN OMX_HANDLETYPE hComp,\r
-    OMX_IN OMX_U32        nPort,\r
-    OMX_IN OMX_HANDLETYPE hTunneledComp,\r
-    OMX_IN OMX_U32        nTunneledPort,\r
-    OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)\r
-{\r
-    OMX_ERRORTYPE ret = OMX_ErrorNone;\r
-\r
-    ret = OMX_ErrorTunnelingUnsupported;\r
-EXIT:\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER *pDataBuffer[])\r
-{\r
-    OMX_ERRORTYPE ret = OMX_ErrorNone;\r
-\r
-    FunctionIn();\r
-\r
-    *pDataBuffer = NULL;\r
-\r
-    if (pExynosPort->portWayType == WAY1_PORT) {\r
-        *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;\r
-    } else if (pExynosPort->portWayType == WAY2_PORT) {\r
-            pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);\r
-            pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);\r
-    }\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;\r
-    EXYNOS_OMX_DATABUFFER    *pDataPortBuffer[2] = {NULL, NULL};\r
-    EXYNOS_OMX_MESSAGE       *message = NULL;\r
-    OMX_U32                flushNum = 0;\r
-    OMX_S32                semValue = 0;\r
-    int i = 0, maxBufferNum = 0;\r
-    FunctionIn();\r
-\r
-    pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-\r
-    while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {\r
-        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);\r
-        if (semValue == 0)\r
-            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);\r
-\r
-        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);\r
-        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);\r
-        if ((message != NULL) && (message->messageType != EXYNOS_OMX_CommandFakeBuffer)) {\r
-            bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;\r
-            bufferHeader->nFilledLen = 0;\r
-\r
-            if (portIndex == OUTPUT_PORT_INDEX) {\r
-                Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);\r
-            } else if (portIndex == INPUT_PORT_INDEX) {\r
-                Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);\r
-            }\r
-        }\r
-        Exynos_OSAL_Free(message);\r
-        message = NULL;\r
-    }\r
-\r
-    Exynos_OMX_GetFlushBuffer(pExynosPort, pDataPortBuffer);\r
-    if (portIndex == INPUT_PORT_INDEX) {\r
-        if (pDataPortBuffer[0]->dataValid == OMX_TRUE)\r
-            Exynos_FlushInputBufferReturn(pOMXComponent, pDataPortBuffer[0]);\r
-        if (pDataPortBuffer[1]->dataValid == OMX_TRUE)\r
-            Exynos_FlushInputBufferReturn(pOMXComponent, pDataPortBuffer[1]);\r
-    } else if (portIndex == OUTPUT_PORT_INDEX) {\r
-        if (pDataPortBuffer[0]->dataValid == OMX_TRUE)\r
-            Exynos_FlushOutputBufferReturn(pOMXComponent, pDataPortBuffer[0]);\r
-        if (pDataPortBuffer[1]->dataValid == OMX_TRUE)\r
-            Exynos_FlushOutputBufferReturn(pOMXComponent, pDataPortBuffer[1]);\r
-    }\r
-\r
-    if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {\r
-        if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
-            if (pExynosPort->processData.bufferHeader != NULL) {\r
-                if (portIndex == INPUT_PORT_INDEX) {\r
-                    Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);\r
-                } else if (portIndex == OUTPUT_PORT_INDEX) {\r
-                    Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);\r
-                }\r
-            }\r
-            Exynos_ResetCodecData(&pExynosPort->processData);\r
-\r
-            maxBufferNum = pExynosPort->portDefinition.nBufferCountActual;\r
-            for (i = 0; i < maxBufferNum; i++) {\r
-                if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) {\r
-                    if (portIndex == OUTPUT_PORT_INDEX) {\r
-                        Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);\r
-                    } else if (portIndex == INPUT_PORT_INDEX) {\r
-                        Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);\r
-                    }\r
-                }\r
-            }\r
-        }\r
-    } else {\r
-        Exynos_ResetCodecData(&pExynosPort->processData);\r
-    }\r
-\r
-    while(1) {\r
-        OMX_S32 cnt = 0;\r
-        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);\r
-        if (cnt <= 0)\r
-            break;\r
-        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);\r
-    }\r
-    Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ);\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)\r
-{\r
-    OMX_ERRORTYPE             ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;\r
-    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};\r
-    OMX_U32                   i = 0, cnt = 0;\r
-\r
-    FunctionIn();\r
-\r
-    if (pOMXComponent == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-\r
-    Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);\r
-\r
-    pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;\r
-\r
-    if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {\r
-        Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);\r
-    } else {\r
-        Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);\r
-    }\r
-\r
-    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];\r
-    Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer);\r
-\r
-    if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)\r
-        Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);\r
-    Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);\r
-\r
-    pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);\r
-    Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);\r
-    pVideoEnc->exynos_codec_stop(pOMXComponent, nPortIndex);\r
-    Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex);\r
-    ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);\r
-    if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)\r
-        pVideoEnc->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);\r
-    Exynos_ResetCodecData(&pExynosPort->processData);\r
-\r
-    if (ret == OMX_ErrorNone) {\r
-        if (nPortIndex == INPUT_PORT_INDEX) {\r
-            pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;\r
-            pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;\r
-            Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);\r
-            Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);\r
-            pExynosComponent->getAllDelayBuffer = OMX_FALSE;\r
-            pExynosComponent->bSaveFlagEOS = OMX_FALSE;\r
-            pExynosComponent->reInputData = OMX_FALSE;\r
-        }\r
-\r
-        pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;\r
-        Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", pOMXComponent, nPortIndex);\r
-        if (bEvent == OMX_TRUE)\r
-            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,\r
-                            pExynosComponent->callbackData,\r
-                            OMX_EventCmdComplete,\r
-                            OMX_CommandFlush, nPortIndex, NULL);\r
-    }\r
-    Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex);\r
-    Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex);\r
-\r
-EXIT:\r
-    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {\r
-        Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);\r
-        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
-                        pExynosComponent->callbackData,\r
-                        OMX_EventError,\r
-                        ret, 0, NULL);\r
-    }\r
-\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];\r
-    EXYNOS_OMX_DATABUFFER    *dataBuffer = NULL;\r
-    OMX_BUFFERHEADERTYPE  *bufferHeader = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    if ((exynosOMXInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {\r
-        dataBuffer = &(exynosOMXInputPort->way.port2WayDataBuffer.inputDataBuffer);\r
-    } else if (exynosOMXInputPort->bufferProcessType == BUFFER_SHARE) {\r
-        dataBuffer = &(exynosOMXInputPort->way.port2WayDataBuffer.outputDataBuffer);\r
-    }\r
-\r
-    bufferHeader = dataBuffer->bufferHeader;\r
-\r
-    if (bufferHeader != NULL) {\r
-        if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {\r
-            bufferHeader->hMarkTargetComponent      = exynosOMXInputPort->markType.hMarkTargetComponent;\r
-            bufferHeader->pMarkData                 = exynosOMXInputPort->markType.pMarkData;\r
-            exynosOMXInputPort->markType.hMarkTargetComponent = NULL;\r
-            exynosOMXInputPort->markType.pMarkData = NULL;\r
-        }\r
-\r
-        if (bufferHeader->hMarkTargetComponent != NULL) {\r
-            if (bufferHeader->hMarkTargetComponent == pOMXComponent) {\r
-                pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
-                                pExynosComponent->callbackData,\r
-                                OMX_EventMark,\r
-                                0, 0, bufferHeader->pMarkData);\r
-            } else {\r
-                pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;\r
-                pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;\r
-            }\r
-        }\r
-\r
-        bufferHeader->nFilledLen = 0;\r
-        bufferHeader->nOffset = 0;\r
-        Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);\r
-    }\r
-\r
-    /* reset dataBuffer */\r
-    Exynos_ResetDataBuffer(dataBuffer);\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_FlushInputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];\r
-    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    bufferHeader = dataBuffer->bufferHeader;\r
-\r
-    if (bufferHeader != NULL) {\r
-        if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {\r
-            bufferHeader->hMarkTargetComponent      = exynosOMXInputPort->markType.hMarkTargetComponent;\r
-            bufferHeader->pMarkData                 = exynosOMXInputPort->markType.pMarkData;\r
-            exynosOMXInputPort->markType.hMarkTargetComponent = NULL;\r
-            exynosOMXInputPort->markType.pMarkData = NULL;\r
-        }\r
-\r
-        if (bufferHeader->hMarkTargetComponent != NULL) {\r
-            if (bufferHeader->hMarkTargetComponent == pOMXComponent) {\r
-                pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
-                                pExynosComponent->callbackData,\r
-                                OMX_EventMark,\r
-                                0, 0, bufferHeader->pMarkData);\r
-            } else {\r
-                pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;\r
-                pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;\r
-            }\r
-        }\r
-\r
-        bufferHeader->nFilledLen = 0;\r
-        bufferHeader->nOffset = 0;\r
-        Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);\r
-    }\r
-\r
-    /* reset dataBuffer */\r
-    Exynos_ResetDataBuffer(dataBuffer);\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];\r
-    EXYNOS_OMX_MESSAGE    *message = NULL;\r
-    EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    inputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);\r
-\r
-    if (pExynosComponent->currentState != OMX_StateExecuting) {\r
-        ret = OMX_ErrorUndefined;\r
-        goto EXIT;\r
-    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&\r
-               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {\r
-        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);\r
-        if (inputUseBuffer->dataValid != OMX_TRUE) {\r
-            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);\r
-            if (message == NULL) {\r
-                ret = OMX_ErrorUndefined;\r
-                goto EXIT;\r
-            }\r
-\r
-            if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {\r
-                ret = OMX_ErrorCodecFlush;\r
-                goto EXIT;\r
-            }\r
-\r
-            inputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);\r
-            inputUseBuffer->allocSize     = inputUseBuffer->bufferHeader->nAllocLen;\r
-            inputUseBuffer->dataLen       = inputUseBuffer->bufferHeader->nFilledLen;\r
-            inputUseBuffer->remainDataLen = inputUseBuffer->dataLen;\r
-            inputUseBuffer->usedDataLen   = 0;\r
-            inputUseBuffer->dataValid     = OMX_TRUE;\r
-            inputUseBuffer->nFlags        = inputUseBuffer->bufferHeader->nFlags;\r
-            inputUseBuffer->timeStamp     = inputUseBuffer->bufferHeader->nTimeStamp;\r
-\r
-            Exynos_OSAL_Free(message);\r
-\r
-            if (inputUseBuffer->allocSize <= inputUseBuffer->dataLen)\r
-                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer->allocSize, inputUseBuffer->dataLen);\r
-        }\r
-        ret = OMX_ErrorNone;\r
-    }\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
-    EXYNOS_OMX_DATABUFFER    *dataBuffer = NULL;\r
-    OMX_BUFFERHEADERTYPE  *bufferHeader = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    dataBuffer = &(exynosOMXOutputPort->way.port2WayDataBuffer.outputDataBuffer);\r
-    bufferHeader = dataBuffer->bufferHeader;\r
-\r
-    if (bufferHeader != NULL) {\r
-        bufferHeader->nFilledLen = dataBuffer->remainDataLen;\r
-        bufferHeader->nOffset    = 0;\r
-        bufferHeader->nFlags     = dataBuffer->nFlags;\r
-        bufferHeader->nTimeStamp = dataBuffer->timeStamp;\r
-\r
-        if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {\r
-            bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;\r
-            bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;\r
-            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;\r
-            pExynosComponent->propagateMarkType.pMarkData = NULL;\r
-        }\r
-\r
-        if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {\r
-            bufferHeader->nFilledLen = 0;\r
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");\r
-            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
-                            pExynosComponent->callbackData,\r
-                            OMX_EventBufferFlag,\r
-                            OUTPUT_PORT_INDEX,\r
-                            bufferHeader->nFlags, NULL);\r
-        }\r
-\r
-        Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);\r
-    }\r
-\r
-    /* reset dataBuffer */\r
-    Exynos_ResetDataBuffer(dataBuffer);\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)\r
-{\r
-    OMX_ERRORTYPE          ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
-    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    bufferHeader = dataBuffer->bufferHeader;\r
-\r
-    if (bufferHeader != NULL) {\r
-        bufferHeader->nFilledLen = dataBuffer->remainDataLen;\r
-        bufferHeader->nOffset    = 0;\r
-        bufferHeader->nFlags     = dataBuffer->nFlags;\r
-        bufferHeader->nTimeStamp = dataBuffer->timeStamp;\r
-\r
-        if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {\r
-            bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;\r
-            bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;\r
-            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;\r
-            pExynosComponent->propagateMarkType.pMarkData = NULL;\r
-        }\r
-\r
-        if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {\r
-            bufferHeader->nFilledLen = 0;\r
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");\r
-            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,\r
-                            pExynosComponent->callbackData,\r
-                            OMX_EventBufferFlag,\r
-                            OUTPUT_PORT_INDEX,\r
-                            bufferHeader->nFlags, NULL);\r
-        }\r
-\r
-        Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);\r
-    }\r
-\r
-    /* reset dataBuffer */\r
-    Exynos_ResetDataBuffer(dataBuffer);\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)\r
-{\r
-    OMX_ERRORTYPE       ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
-    EXYNOS_OMX_MESSAGE    *message = NULL;\r
-    EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {\r
-        outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);\r
-    } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {\r
-        outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);\r
-    }\r
-\r
-    if (pExynosComponent->currentState != OMX_StateExecuting) {\r
-        ret = OMX_ErrorUndefined;\r
-        goto EXIT;\r
-    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&\r
-               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){\r
-        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);\r
-        if (outputUseBuffer->dataValid != OMX_TRUE) {\r
-            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);\r
-            if (message == NULL) {\r
-                ret = OMX_ErrorUndefined;\r
-                goto EXIT;\r
-            }\r
-            if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {\r
-                ret = OMX_ErrorCodecFlush;\r
-                goto EXIT;\r
-            }\r
-\r
-            outputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);\r
-            outputUseBuffer->allocSize     = outputUseBuffer->bufferHeader->nAllocLen;\r
-            outputUseBuffer->dataLen       = 0; //dataBuffer->bufferHeader->nFilledLen;\r
-            outputUseBuffer->remainDataLen = outputUseBuffer->dataLen;\r
-            outputUseBuffer->usedDataLen   = 0; //dataBuffer->bufferHeader->nOffset;\r
-            outputUseBuffer->dataValid     = OMX_TRUE;\r
-            /* dataBuffer->nFlags             = dataBuffer->bufferHeader->nFlags; */\r
-            /* dataBuffer->nTimeStamp         = dataBuffer->bufferHeader->nTimeStamp; */\r
-/*\r
-            if (pExynosPort->bufferProcessType == BUFFER_SHARE)\r
-                outputUseBuffer->pPrivate      = outputUseBuffer->bufferHeader->pOutputPortPrivate;\r
-            else if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {\r
-                pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;\r
-                pExynosPort->processData.allocSize  = outputUseBuffer->bufferHeader->nAllocLen;\r
-            }\r
-*/\r
-\r
-            Exynos_OSAL_Free(message);\r
-        }\r
-        ret = OMX_ErrorNone;\r
-    }\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)\r
-{\r
-    OMX_ERRORTYPE       ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    pExynosPort= &pExynosComponent->pExynosPort[PortIndex];\r
-\r
-    if (data == NULL) {\r
-        ret = OMX_ErrorInsufficientResources;\r
-        goto EXIT;\r
-    }\r
-\r
-    ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data);\r
-    if (ret != 0) {\r
-        ret = OMX_ErrorUndefined;\r
-        goto EXIT;\r
-    }\r
-    Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);\r
-\r
-    ret = OMX_ErrorNone;\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR *data)\r
-{\r
-    OMX_ERRORTYPE       ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;\r
-    OMX_U32 tempData;\r
-\r
-    FunctionIn();\r
-\r
-    pExynosPort = &pExynosComponent->pExynosPort[PortIndex];\r
-    Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);\r
-    tempData = (OMX_U32)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ);\r
-    if (tempData == NULL) {\r
-        *data = NULL;\r
-        ret = OMX_ErrorUndefined;\r
-        goto EXIT;\r
-    }\r
-    *data = (OMX_PTR)tempData;\r
-\r
-    ret = OMX_ErrorNone;\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex)\r
-{\r
-    OMX_ERRORTYPE       ret = OMX_ErrorNone;\r
-    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    pExynosPort= &pExynosComponent->pExynosPort[PortIndex];\r
-\r
-    ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ);\r
-    if (ret != 0) {\r
-        ret = OMX_ErrorUndefined;\r
-        goto EXIT;\r
-    }\r
-    while (1) {\r
-        int cnt = 0;\r
-        Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt);\r
-        if (cnt > 0)\r
-            Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);\r
-        else\r
-            break;\r
-    }\r
-    ret = OMX_ErrorNone;\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(\r
-    OMX_IN OMX_HANDLETYPE hComponent,\r
-    OMX_IN OMX_INDEXTYPE  nParamIndex,\r
-    OMX_INOUT OMX_PTR     ComponentParameterStructure)\r
-{\r
-    OMX_ERRORTYPE             ret = OMX_ErrorNone;\r
-    OMX_COMPONENTTYPE        *pOMXComponent = NULL;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    if (hComponent == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-\r
-    if (pExynosComponent->currentState == OMX_StateInvalid ) {\r
-        ret = OMX_ErrorInvalidState;\r
-        goto EXIT;\r
-    }\r
-\r
-    if (ComponentParameterStructure == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-\r
-    switch (nParamIndex) {\r
-    case OMX_IndexParamVideoInit:\r
-    {\r
-        OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;\r
-        ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));\r
-        if (ret != OMX_ErrorNone) {\r
-            goto EXIT;\r
-        }\r
-\r
-        portParam->nPorts           = pExynosComponent->portParam.nPorts;\r
-        portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;\r
-        ret = OMX_ErrorNone;\r
-    }\r
-        break;\r
-    case OMX_IndexParamVideoPortFormat:\r
-    {\r
-        OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;\r
-        OMX_U32                         portIndex = portFormat->nPortIndex;\r
-        OMX_U32                         index    = portFormat->nIndex;\r
-        EXYNOS_OMX_BASEPORT            *pExynosPort = NULL;\r
-        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;\r
-        OMX_U32                         supportFormatNum = 0;\r
-\r
-        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));\r
-        if (ret != OMX_ErrorNone) {\r
-            goto EXIT;\r
-        }\r
-\r
-        if ((portIndex >= pExynosComponent->portParam.nPorts)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        }\r
-\r
-\r
-        if (portIndex == INPUT_PORT_INDEX) {\r
-            pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];\r
-            portDefinition = &pExynosPort->portDefinition;\r
-\r
-            switch (index) {\r
-            case supportFormat_0:\r
-                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
-                portFormat->eColorFormat       = OMX_COLOR_FormatYUV420Planar;\r
-                portFormat->xFramerate           = portDefinition->format.video.xFramerate;\r
-                break;\r
-            case supportFormat_1:\r
-                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
-                portFormat->eColorFormat       = OMX_COLOR_FormatYUV420SemiPlanar;\r
-                portFormat->xFramerate         = portDefinition->format.video.xFramerate;\r
-                break;\r
-            case supportFormat_2:\r
-                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
-                portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12Tiled;\r
-                portFormat->xFramerate         = portDefinition->format.video.xFramerate;\r
-                break;\r
-            case supportFormat_3:\r
-                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
-                portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV21Linear;\r
-                portFormat->xFramerate         = portDefinition->format.video.xFramerate;\r
-                break;\r
-            case supportFormat_4:\r
-                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;\r
-                portFormat->eColorFormat       = OMX_COLOR_FormatAndroidOpaque;\r
-                portFormat->xFramerate         = portDefinition->format.video.xFramerate;\r
-                break;\r
-            default:\r
-                if (index > supportFormat_0) {\r
-                    ret = OMX_ErrorNoMore;\r
-                    goto EXIT;\r
-                }\r
-                break;\r
-            }\r
-        } else if (portIndex == OUTPUT_PORT_INDEX) {\r
-            supportFormatNum = OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;\r
-            if (index > supportFormatNum) {\r
-                ret = OMX_ErrorNoMore;\r
-                goto EXIT;\r
-            }\r
-\r
-            pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
-            portDefinition = &pExynosPort->portDefinition;\r
-\r
-            portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat;\r
-            portFormat->eColorFormat       = portDefinition->format.video.eColorFormat;\r
-            portFormat->xFramerate         = portDefinition->format.video.xFramerate;\r
-        }\r
-        ret = OMX_ErrorNone;\r
-    }\r
-        break;\r
-    case OMX_IndexParamVideoBitrate:\r
-    {\r
-        OMX_VIDEO_PARAM_BITRATETYPE     *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;\r
-        OMX_U32                          portIndex = videoRateControl->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;\r
-        EXYNOS_OMX_VIDEOENC_COMPONENT   *pVideoEnc = NULL;\r
-        OMX_PARAM_PORTDEFINITIONTYPE    *portDefinition = NULL;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            portDefinition = &pExynosPort->portDefinition;\r
-\r
-            videoRateControl->eControlRate = pVideoEnc->eControlRate[portIndex];\r
-            videoRateControl->nTargetBitrate = portDefinition->format.video.nBitrate;\r
-        }\r
-        ret = OMX_ErrorNone;\r
-    }\r
-        break;\r
-    case OMX_IndexParamVideoQuantization:\r
-    {\r
-        OMX_VIDEO_PARAM_QUANTIZATIONTYPE  *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;\r
-        OMX_U32                            portIndex = videoQuantizationControl->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT               *pExynosPort = NULL;\r
-        EXYNOS_OMX_VIDEOENC_COMPONENT     *pVideoEnc = NULL;\r
-        OMX_PARAM_PORTDEFINITIONTYPE      *portDefinition = NULL;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            portDefinition = &pExynosPort->portDefinition;\r
-\r
-            videoQuantizationControl->nQpI = pVideoEnc->quantization.nQpI;\r
-            videoQuantizationControl->nQpP = pVideoEnc->quantization.nQpP;\r
-            videoQuantizationControl->nQpB = pVideoEnc->quantization.nQpB;\r
-        }\r
-        ret = OMX_ErrorNone;\r
-\r
-    }\r
-        break;\r
-    case OMX_IndexParamPortDefinition:\r
-    {\r
-        OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;\r
-        OMX_U32                       portIndex = portDefinition->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT          *pExynosPort;\r
-\r
-        if (portIndex >= pExynosComponent->portParam.nPorts) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        }\r
-        ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));\r
-        if (ret != OMX_ErrorNone) {\r
-            goto EXIT;\r
-        }\r
-\r
-        pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-        Exynos_OSAL_Memcpy(portDefinition, &pExynosPort->portDefinition, portDefinition->nSize);\r
-\r
-#ifdef USE_STOREMETADATA\r
-        if ((portIndex == 0) && (pExynosPort->bStoreMetaData == OMX_TRUE)) {\r
-            portDefinition->nBufferSize = MAX_INPUT_METADATA_BUFFER_SIZE;\r
-        }\r
-#endif\r
-    }\r
-        break;\r
-    default:\r
-    {\r
-        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);\r
-    }\r
-        break;\r
-    }\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter(\r
-    OMX_IN OMX_HANDLETYPE hComponent,\r
-    OMX_IN OMX_INDEXTYPE  nIndex,\r
-    OMX_IN OMX_PTR        ComponentParameterStructure)\r
-{\r
-    OMX_ERRORTYPE             ret = OMX_ErrorNone;\r
-    OMX_COMPONENTTYPE        *pOMXComponent = NULL;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    if (hComponent == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-\r
-    if (pExynosComponent->currentState == OMX_StateInvalid ) {\r
-        ret = OMX_ErrorInvalidState;\r
-        goto EXIT;\r
-    }\r
-\r
-    if (ComponentParameterStructure == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-\r
-    switch (nIndex) {\r
-    case OMX_IndexParamVideoPortFormat:\r
-    {\r
-        OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;\r
-        OMX_U32                         portIndex = portFormat->nPortIndex;\r
-        OMX_U32                         index    = portFormat->nIndex;\r
-        EXYNOS_OMX_BASEPORT            *pExynosPort = NULL;\r
-        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;\r
-        OMX_U32                         supportFormatNum = 0;\r
-\r
-        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));\r
-        if (ret != OMX_ErrorNone) {\r
-            goto EXIT;\r
-        }\r
-\r
-        if ((portIndex >= pExynosComponent->portParam.nPorts)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            portDefinition = &pExynosPort->portDefinition;\r
-\r
-            portDefinition->format.video.eColorFormat       = portFormat->eColorFormat;\r
-            portDefinition->format.video.eCompressionFormat = portFormat->eCompressionFormat;\r
-            portDefinition->format.video.xFramerate         = portFormat->xFramerate;\r
-        }\r
-    }\r
-        break;\r
-    case OMX_IndexParamVideoBitrate:\r
-    {\r
-        OMX_VIDEO_PARAM_BITRATETYPE     *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;\r
-        OMX_U32                          portIndex = videoRateControl->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;\r
-        EXYNOS_OMX_VIDEOENC_COMPONENT   *pVideoEnc = NULL;\r
-        OMX_PARAM_PORTDEFINITIONTYPE    *portDefinition = NULL;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            portDefinition = &pExynosPort->portDefinition;\r
-\r
-            pVideoEnc->eControlRate[portIndex] = videoRateControl->eControlRate;\r
-            portDefinition->format.video.nBitrate = videoRateControl->nTargetBitrate;\r
-        }\r
-        ret = OMX_ErrorNone;\r
-    }\r
-        break;\r
-    case OMX_IndexParamVideoQuantization:\r
-    {\r
-        OMX_VIDEO_PARAM_QUANTIZATIONTYPE *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;\r
-        OMX_U32                           portIndex = videoQuantizationControl->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT              *pExynosPort = NULL;\r
-        EXYNOS_OMX_VIDEOENC_COMPONENT    *pVideoEnc = NULL;\r
-        OMX_PARAM_PORTDEFINITIONTYPE     *portDefinition = NULL;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            portDefinition = &pExynosPort->portDefinition;\r
-\r
-            pVideoEnc->quantization.nQpI = videoQuantizationControl->nQpI;\r
-            pVideoEnc->quantization.nQpP = videoQuantizationControl->nQpP;\r
-            pVideoEnc->quantization.nQpB = videoQuantizationControl->nQpB;\r
-        }\r
-        ret = OMX_ErrorNone;\r
-    }\r
-        break;\r
-    case OMX_IndexParamPortDefinition:\r
-    {\r
-        OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;\r
-        OMX_U32                       portIndex = pPortDefinition->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT          *pExynosPort;\r
-        OMX_U32 width, height, size;\r
-\r
-        if (portIndex >= pExynosComponent->portParam.nPorts) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        }\r
-        ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));\r
-        if (ret != OMX_ErrorNone) {\r
-            goto EXIT;\r
-        }\r
-\r
-        pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-\r
-        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {\r
-            if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {\r
-                ret = OMX_ErrorIncorrectStateOperation;\r
-                goto EXIT;\r
-            }\r
-        }\r
-        if(pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {\r
-            ret = OMX_ErrorBadParameter;\r
-            goto EXIT;\r
-        }\r
-\r
-        Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);\r
-        if (portIndex == INPUT_PORT_INDEX) {\r
-            EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];\r
-            Exynos_UpdateFrameSize(pOMXComponent);\r
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosOutputPort->portDefinition.nBufferSize: %d",\r
-                            pExynosOutputPort->portDefinition.nBufferSize);\r
-        }\r
-        ret = OMX_ErrorNone;\r
-    }\r
-        break;\r
-#ifdef USE_STOREMETADATA\r
-    case OMX_IndexParamStoreMetaDataBuffer:\r
-    {\r
-        ret = Exynos_OSAL_SetANBParameter(hComponent, nIndex, ComponentParameterStructure);\r
-    }\r
-        break;\r
-#endif\r
-    default:\r
-    {\r
-        ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);\r
-    }\r
-        break;\r
-    }\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetConfig(\r
-    OMX_HANDLETYPE hComponent,\r
-    OMX_INDEXTYPE nIndex,\r
-    OMX_PTR pComponentConfigStructure)\r
-{\r
-    OMX_ERRORTYPE             ret = OMX_ErrorNone;\r
-    OMX_COMPONENTTYPE        *pOMXComponent = NULL;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    if (hComponent == NULL || pComponentConfigStructure == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    if (pExynosComponent->currentState == OMX_StateInvalid) {\r
-        ret = OMX_ErrorInvalidState;\r
-        goto EXIT;\r
-    }\r
-\r
-    switch (nIndex) {\r
-    case OMX_IndexConfigVideoBitrate:\r
-    {\r
-        OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;\r
-        OMX_U32                       portIndex = pEncodeBitrate->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT          *pExynosPort = NULL;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            pEncodeBitrate->nEncodeBitrate = pExynosPort->portDefinition.format.video.nBitrate;\r
-        }\r
-    }\r
-        break;\r
-    case OMX_IndexConfigVideoFramerate:\r
-    {\r
-        OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;\r
-        OMX_U32                   portIndex = pFramerate->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            pFramerate->xEncodeFramerate = pExynosPort->portDefinition.format.video.xFramerate;\r
-        }\r
-    }\r
-        break;\r
-    default:\r
-        ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);\r
-        break;\r
-    }\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetConfig(\r
-    OMX_HANDLETYPE hComponent,\r
-    OMX_INDEXTYPE nIndex,\r
-    OMX_PTR pComponentConfigStructure)\r
-    {\r
-    OMX_ERRORTYPE             ret = OMX_ErrorNone;\r
-    OMX_COMPONENTTYPE        *pOMXComponent = NULL;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    if (hComponent == NULL || pComponentConfigStructure == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-    if (pExynosComponent->currentState == OMX_StateInvalid) {\r
-        ret = OMX_ErrorInvalidState;\r
-        goto EXIT;\r
-    }\r
-\r
-    switch (nIndex) {\r
-    case OMX_IndexConfigVideoBitrate:\r
-    {\r
-        OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;\r
-        OMX_U32                       portIndex = pEncodeBitrate->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT          *pExynosPort = NULL;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            pExynosPort->portDefinition.format.video.nBitrate = pEncodeBitrate->nEncodeBitrate;\r
-        }\r
-    }\r
-        break;\r
-    case OMX_IndexConfigVideoFramerate:\r
-    {\r
-        OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;\r
-        OMX_U32                   portIndex = pFramerate->nPortIndex;\r
-        EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pExynosPort = &pExynosComponent->pExynosPort[portIndex];\r
-            pExynosPort->portDefinition.format.video.xFramerate = pFramerate->xEncodeFramerate;\r
-        }\r
-    }\r
-        break;\r
-    case OMX_IndexConfigVideoIntraVOPRefresh:\r
-    {\r
-        OMX_CONFIG_INTRAREFRESHVOPTYPE *pIntraRefreshVOP = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)pComponentConfigStructure;\r
-        EXYNOS_OMX_VIDEOENC_COMPONENT *pVEncBase = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);\r
-        OMX_U32 portIndex = pIntraRefreshVOP->nPortIndex;\r
-\r
-        if ((portIndex != OUTPUT_PORT_INDEX)) {\r
-            ret = OMX_ErrorBadPortIndex;\r
-            goto EXIT;\r
-        } else {\r
-            pVEncBase->IntraRefreshVOP = pIntraRefreshVOP->IntraRefreshVOP;\r
-        }\r
-    }\r
-        break;\r
-    default:\r
-        ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);\r
-        break;\r
-    }\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
-\r
-OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetExtensionIndex(\r
-    OMX_IN OMX_HANDLETYPE  hComponent,\r
-    OMX_IN OMX_STRING      cParameterName,\r
-    OMX_OUT OMX_INDEXTYPE *pIndexType)\r
-{\r
-    OMX_ERRORTYPE             ret = OMX_ErrorNone;\r
-    OMX_COMPONENTTYPE        *pOMXComponent = NULL;\r
-    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;\r
-\r
-    FunctionIn();\r
-\r
-    if (hComponent == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;\r
-    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));\r
-    if (ret != OMX_ErrorNone) {\r
-        goto EXIT;\r
-    }\r
-\r
-    if (pOMXComponent->pComponentPrivate == NULL) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;\r
-\r
-    if ((cParameterName == NULL) || (pIndexType == NULL)) {\r
-        ret = OMX_ErrorBadParameter;\r
-        goto EXIT;\r
-    }\r
-    if (pExynosComponent->currentState == OMX_StateInvalid) {\r
-        ret = OMX_ErrorInvalidState;\r
-        goto EXIT;\r
-    }\r
-\r
-#ifdef USE_STOREMETADATA\r
-    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {\r
-        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamStoreMetaDataBuffer;\r
-    } else {\r
-        ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);\r
-    }\r
-#else\r
-    ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);\r
-#endif\r
-\r
-EXIT:\r
-    FunctionOut();\r
-\r
-    return ret;\r
-}\r
+/*
+ *
+ * Copyright 2012 Samsung Electronics S.LSI Co. LTD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * @file        Exynos_OMX_VencControl.c
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "Exynos_OMX_Macros.h"
+#include "Exynos_OSAL_Event.h"
+#include "Exynos_OMX_Venc.h"
+#include "Exynos_OMX_VencControl.h"
+#include "Exynos_OMX_Basecomponent.h"
+#include "Exynos_OSAL_Thread.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Mutex.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_SharedMemory.h"
+
+#ifdef USE_ANB
+#include "Exynos_OSAL_Android.h"
+#endif
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_VIDEO_ENCCONTROL"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+
+OMX_ERRORTYPE Exynos_OMX_UseBuffer(
+    OMX_IN OMX_HANDLETYPE            hComponent,
+    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
+    OMX_IN OMX_U32                   nPortIndex,
+    OMX_IN OMX_PTR                   pAppPrivate,
+    OMX_IN OMX_U32                   nSizeBytes,
+    OMX_IN OMX_U8                   *pBuffer)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
+    OMX_U32                i = 0;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+    if (pExynosPort->portState != OMX_StateIdle) {
+        ret = OMX_ErrorIncorrectStateOperation;
+        goto EXIT;
+    }
+
+    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+
+    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
+    if (temp_bufferHeader == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
+
+    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
+        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
+            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
+            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ASSIGNED | HEADER_STATE_ALLOCATED);
+            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
+            temp_bufferHeader->pBuffer        = pBuffer;
+            temp_bufferHeader->nAllocLen      = nSizeBytes;
+            temp_bufferHeader->pAppPrivate    = pAppPrivate;
+            if (nPortIndex == INPUT_PORT_INDEX)
+                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
+            else
+                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
+
+            pExynosPort->assignedBufferNum++;
+            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
+                pExynosPort->portDefinition.bPopulated = OMX_TRUE;
+                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
+                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
+                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
+            }
+            *ppBufferHdr = temp_bufferHeader;
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+    }
+
+    Exynos_OSAL_Free(temp_bufferHeader);
+    ret = OMX_ErrorInsufficientResources;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
+    OMX_IN OMX_HANDLETYPE            hComponent,
+    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBuffer,
+    OMX_IN OMX_U32                   nPortIndex,
+    OMX_IN OMX_PTR                   pAppPrivate,
+    OMX_IN OMX_U32                   nSizeBytes)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
+    OMX_U8                *temp_buffer = NULL;
+    OMX_U32                i = 0;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pVideoDec = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+    if (nPortIndex >= pExynosComponent->portParam.nPorts) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+/*
+    if (pExynosPort->portState != OMX_StateIdle ) {
+        ret = OMX_ErrorIncorrectStateOperation;
+        goto EXIT;
+    }
+*/
+    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+
+    if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+         temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nSizeBytes, NORMAL_MEMORY);
+        if (temp_buffer == NULL) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    } else {
+        temp_buffer = Exynos_OSAL_Malloc(sizeof(OMX_U8) * nSizeBytes);
+        if (temp_buffer == NULL) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
+    if (temp_bufferHeader == NULL) {
+        if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+            Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
+        } else {
+            Exynos_OSAL_Free(temp_buffer);
+        }
+
+        temp_buffer = NULL;
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(temp_bufferHeader, 0, sizeof(OMX_BUFFERHEADERTYPE));
+
+    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
+        if (pExynosPort->bufferStateAllocate[i] == BUFFER_STATE_FREE) {
+            pExynosPort->extendBufferHeader[i].OMXBufferHeader = temp_bufferHeader;
+            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
+            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
+            temp_bufferHeader->pBuffer        = temp_buffer;
+            temp_bufferHeader->nAllocLen      = nSizeBytes;
+            temp_bufferHeader->pAppPrivate    = pAppPrivate;
+            if (nPortIndex == INPUT_PORT_INDEX)
+                temp_bufferHeader->nInputPortIndex = INPUT_PORT_INDEX;
+            else
+                temp_bufferHeader->nOutputPortIndex = OUTPUT_PORT_INDEX;
+            pExynosPort->assignedBufferNum++;
+            if (pExynosPort->assignedBufferNum == pExynosPort->portDefinition.nBufferCountActual) {
+                pExynosPort->portDefinition.bPopulated = OMX_TRUE;
+                /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
+                Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
+                /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
+            }
+            *ppBuffer = temp_bufferHeader;
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+    }
+
+    Exynos_OSAL_Free(temp_bufferHeader);
+    if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
+    } else {
+        Exynos_OSAL_Free(temp_buffer);
+    }
+
+    ret = OMX_ErrorInsufficientResources;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_FreeBuffer(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_U32        nPortIndex,
+    OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
+    OMX_U8                *temp_buffer = NULL;
+    OMX_U32                i = 0;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pVideoDec = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+
+    if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+
+    if ((pExynosPort->portState != OMX_StateLoaded) && (pExynosPort->portState != OMX_StateInvalid)) {
+        (*(pExynosComponent->pCallbacks->EventHandler)) (pOMXComponent,
+                        pExynosComponent->callbackData,
+                        (OMX_U32)OMX_EventError,
+                        (OMX_U32)OMX_ErrorPortUnpopulated,
+                        nPortIndex, NULL);
+    }
+
+    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) { // JH Chang for test
+//    for (i = 0; i < /*pExynosPort->portDefinition.nBufferCountActual*/MAX_BUFFER_NUM; i++) {
+        if (((pExynosPort->bufferStateAllocate[i] | BUFFER_STATE_FREE) != 0) && (pExynosPort->extendBufferHeader[i].OMXBufferHeader != NULL)) {
+            if (pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer == pBufferHdr->pBuffer) {
+                if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ALLOCATED) {
+                    if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+                    } else {
+                        Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+                    }
+                    pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer = NULL;
+                    pBufferHdr->pBuffer = NULL;
+                } else if (pExynosPort->bufferStateAllocate[i] & BUFFER_STATE_ASSIGNED) {
+                    ; /* None*/
+                }
+                pExynosPort->assignedBufferNum--;
+                if (pExynosPort->bufferStateAllocate[i] & HEADER_STATE_ALLOCATED) {
+                    Exynos_OSAL_Free(pExynosPort->extendBufferHeader[i].OMXBufferHeader);
+                    pExynosPort->extendBufferHeader[i].OMXBufferHeader = NULL;
+                    pBufferHdr = NULL;
+                }
+                pExynosPort->bufferStateAllocate[i] = BUFFER_STATE_FREE;
+                ret = OMX_ErrorNone;
+                goto EXIT;
+            }
+        }
+    }
+
+EXIT:
+    if (ret == OMX_ErrorNone) {
+        if (pExynosPort->assignedBufferNum == 0) {
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosPort->unloadedResource signal set");
+            /* Exynos_OSAL_MutexLock(pExynosComponent->compMutex); */
+            Exynos_OSAL_SemaphorePost(pExynosPort->unloadedResource);
+            /* Exynos_OSAL_MutexUnlock(pExynosComponent->compMutex); */
+            pExynosPort->portDefinition.bPopulated = OMX_FALSE;
+        }
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE                 ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;
+    OMX_BUFFERHEADERTYPE         *temp_bufferHeader = NULL;
+    OMX_U8                       *temp_buffer = NULL;
+    OMX_U32                       bufferSize = 0;
+    OMX_PARAM_PORTDEFINITIONTYPE  portDefinition;
+
+    ret = OMX_ErrorTunnelingUnsupported;
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT* pExynosPort = NULL;
+    OMX_BUFFERHEADERTYPE* temp_bufferHeader = NULL;
+    OMX_U8 *temp_buffer = NULL;
+    OMX_U32 bufferSize = 0;
+
+    ret = OMX_ErrorTunnelingUnsupported;
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentTunnelRequest(
+    OMX_IN OMX_HANDLETYPE hComp,
+    OMX_IN OMX_U32        nPort,
+    OMX_IN OMX_HANDLETYPE hTunneledComp,
+    OMX_IN OMX_U32        nTunneledPort,
+    OMX_INOUT OMX_TUNNELSETUPTYPE *pTunnelSetup)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    ret = OMX_ErrorTunnelingUnsupported;
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER *pDataBuffer[])
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    FunctionIn();
+
+    *pDataBuffer = NULL;
+
+    if (pExynosPort->portWayType == WAY1_PORT) {
+        *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
+    } else if (pExynosPort->portWayType == WAY2_PORT) {
+            pDataBuffer[0] = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
+            pDataBuffer[1] = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 portIndex)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
+    EXYNOS_OMX_DATABUFFER    *pDataPortBuffer[2] = {NULL, NULL};
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+    OMX_U32                flushNum = 0;
+    OMX_S32                semValue = 0;
+    int i = 0, maxBufferNum = 0;
+    FunctionIn();
+
+    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+
+    while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
+        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &semValue);
+        if (semValue == 0)
+            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[portIndex].bufferSemID);
+
+        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
+        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+        if ((message != NULL) && (message->messageType != EXYNOS_OMX_CommandFakeBuffer)) {
+            bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;
+            bufferHeader->nFilledLen = 0;
+
+            if (portIndex == OUTPUT_PORT_INDEX) {
+                Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
+            } else if (portIndex == INPUT_PORT_INDEX) {
+                Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
+            }
+        }
+        Exynos_OSAL_Free(message);
+        message = NULL;
+    }
+
+    Exynos_OMX_GetFlushBuffer(pExynosPort, pDataPortBuffer);
+    if (portIndex == INPUT_PORT_INDEX) {
+        if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
+            Exynos_FlushInputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
+        if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
+            Exynos_FlushInputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
+    } else if (portIndex == OUTPUT_PORT_INDEX) {
+        if (pDataPortBuffer[0]->dataValid == OMX_TRUE)
+            Exynos_FlushOutputBufferReturn(pOMXComponent, pDataPortBuffer[0]);
+        if (pDataPortBuffer[1]->dataValid == OMX_TRUE)
+            Exynos_FlushOutputBufferReturn(pOMXComponent, pDataPortBuffer[1]);
+    }
+
+    if (pExynosComponent->bMultiThreadProcess == OMX_TRUE) {
+        if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+            if (pExynosPort->processData.bufferHeader != NULL) {
+                if (portIndex == INPUT_PORT_INDEX) {
+                    Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
+                } else if (portIndex == OUTPUT_PORT_INDEX) {
+                    Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->processData.bufferHeader);
+                }
+            }
+            Exynos_ResetCodecData(&pExynosPort->processData);
+
+            maxBufferNum = pExynosPort->portDefinition.nBufferCountActual;
+            for (i = 0; i < maxBufferNum; i++) {
+                if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) {
+                    if (portIndex == OUTPUT_PORT_INDEX) {
+                        Exynos_OMX_OutputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
+                    } else if (portIndex == INPUT_PORT_INDEX) {
+                        Exynos_OMX_InputBufferReturn(pOMXComponent, pExynosPort->extendBufferHeader[i].OMXBufferHeader);
+                    }
+                }
+            }
+        }
+    } else {
+        Exynos_ResetCodecData(&pExynosPort->processData);
+    }
+
+    while(1) {
+        OMX_S32 cnt = 0;
+        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[portIndex].bufferSemID, &cnt);
+        if (cnt <= 0)
+            break;
+        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[portIndex].bufferSemID);
+    }
+    Exynos_OSAL_ResetQueue(&pExynosPort->bufferQ);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
+    OMX_U32                   i = 0, cnt = 0;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush start, port:%d", nPortIndex);
+
+    pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_TRUE;
+
+    if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
+        Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
+    } else {
+        Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
+    }
+
+    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+    Exynos_OMX_GetFlushBuffer(pExynosPort, flushPortBuffer);
+
+    if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
+        Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
+    Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
+
+    pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);
+    Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);
+    pVideoEnc->exynos_codec_stop(pOMXComponent, nPortIndex);
+    Exynos_OSAL_MutexLock(flushPortBuffer[1]->bufferMutex);
+    ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
+    if ((pExynosComponent->pExynosPort[nPortIndex].bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
+        pVideoEnc->exynos_codec_enqueueAllBuffer(pOMXComponent, nPortIndex);
+    Exynos_ResetCodecData(&pExynosPort->processData);
+
+    if (ret == OMX_ErrorNone) {
+        if (nPortIndex == INPUT_PORT_INDEX) {
+            pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_TRUE;
+            pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
+            Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
+            Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
+            pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+            pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+            pExynosComponent->reInputData = OMX_FALSE;
+        }
+
+        pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"OMX_CommandFlush EventCmdComplete, port:%d", pOMXComponent, nPortIndex);
+        if (bEvent == OMX_TRUE)
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                            pExynosComponent->callbackData,
+                            OMX_EventCmdComplete,
+                            OMX_CommandFlush, nPortIndex, NULL);
+    }
+    Exynos_OSAL_MutexUnlock(flushPortBuffer[1]->bufferMutex);
+    Exynos_OSAL_MutexUnlock(flushPortBuffer[0]->bufferMutex);
+
+EXIT:
+    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR,"%s : %d", __FUNCTION__, __LINE__);
+        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                        pExynosComponent->callbackData,
+                        OMX_EventError,
+                        ret, 0, NULL);
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *dataBuffer = NULL;
+    OMX_BUFFERHEADERTYPE  *bufferHeader = NULL;
+
+    FunctionIn();
+
+    if ((exynosOMXInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        dataBuffer = &(exynosOMXInputPort->way.port2WayDataBuffer.inputDataBuffer);
+    } else if (exynosOMXInputPort->bufferProcessType == BUFFER_SHARE) {
+        dataBuffer = &(exynosOMXInputPort->way.port2WayDataBuffer.outputDataBuffer);
+    }
+
+    bufferHeader = dataBuffer->bufferHeader;
+
+    if (bufferHeader != NULL) {
+        if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
+            bufferHeader->hMarkTargetComponent      = exynosOMXInputPort->markType.hMarkTargetComponent;
+            bufferHeader->pMarkData                 = exynosOMXInputPort->markType.pMarkData;
+            exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
+            exynosOMXInputPort->markType.pMarkData = NULL;
+        }
+
+        if (bufferHeader->hMarkTargetComponent != NULL) {
+            if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
+                pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                                pExynosComponent->callbackData,
+                                OMX_EventMark,
+                                0, 0, bufferHeader->pMarkData);
+            } else {
+                pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
+                pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
+            }
+        }
+
+        bufferHeader->nFilledLen = 0;
+        bufferHeader->nOffset = 0;
+        Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
+    }
+
+    /* reset dataBuffer */
+    Exynos_ResetDataBuffer(dataBuffer);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_FlushInputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
+
+    FunctionIn();
+
+    bufferHeader = dataBuffer->bufferHeader;
+
+    if (bufferHeader != NULL) {
+        if (exynosOMXInputPort->markType.hMarkTargetComponent != NULL ) {
+            bufferHeader->hMarkTargetComponent      = exynosOMXInputPort->markType.hMarkTargetComponent;
+            bufferHeader->pMarkData                 = exynosOMXInputPort->markType.pMarkData;
+            exynosOMXInputPort->markType.hMarkTargetComponent = NULL;
+            exynosOMXInputPort->markType.pMarkData = NULL;
+        }
+
+        if (bufferHeader->hMarkTargetComponent != NULL) {
+            if (bufferHeader->hMarkTargetComponent == pOMXComponent) {
+                pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                                pExynosComponent->callbackData,
+                                OMX_EventMark,
+                                0, 0, bufferHeader->pMarkData);
+            } else {
+                pExynosComponent->propagateMarkType.hMarkTargetComponent = bufferHeader->hMarkTargetComponent;
+                pExynosComponent->propagateMarkType.pMarkData = bufferHeader->pMarkData;
+            }
+        }
+
+        bufferHeader->nFilledLen = 0;
+        bufferHeader->nOffset = 0;
+        Exynos_OMX_InputBufferReturn(pOMXComponent, bufferHeader);
+    }
+
+    /* reset dataBuffer */
+    Exynos_ResetDataBuffer(dataBuffer);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_MESSAGE    *message = NULL;
+    EXYNOS_OMX_DATABUFFER *inputUseBuffer = NULL;
+
+    FunctionIn();
+
+    inputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
+
+    if (pExynosComponent->currentState != OMX_StateExecuting) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))) {
+        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+        if (inputUseBuffer->dataValid != OMX_TRUE) {
+            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+            if (message == NULL) {
+                ret = OMX_ErrorUndefined;
+                goto EXIT;
+            }
+
+            if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+                ret = OMX_ErrorCodecFlush;
+                goto EXIT;
+            }
+
+            inputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+            inputUseBuffer->allocSize     = inputUseBuffer->bufferHeader->nAllocLen;
+            inputUseBuffer->dataLen       = inputUseBuffer->bufferHeader->nFilledLen;
+            inputUseBuffer->remainDataLen = inputUseBuffer->dataLen;
+            inputUseBuffer->usedDataLen   = 0;
+            inputUseBuffer->dataValid     = OMX_TRUE;
+            inputUseBuffer->nFlags        = inputUseBuffer->bufferHeader->nFlags;
+            inputUseBuffer->timeStamp     = inputUseBuffer->bufferHeader->nTimeStamp;
+
+            Exynos_OSAL_Free(message);
+
+            if (inputUseBuffer->allocSize <= inputUseBuffer->dataLen)
+                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", inputUseBuffer->allocSize, inputUseBuffer->dataLen);
+        }
+        ret = OMX_ErrorNone;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *dataBuffer = NULL;
+    OMX_BUFFERHEADERTYPE  *bufferHeader = NULL;
+
+    FunctionIn();
+
+    dataBuffer = &(exynosOMXOutputPort->way.port2WayDataBuffer.outputDataBuffer);
+    bufferHeader = dataBuffer->bufferHeader;
+
+    if (bufferHeader != NULL) {
+        bufferHeader->nFilledLen = dataBuffer->remainDataLen;
+        bufferHeader->nOffset    = 0;
+        bufferHeader->nFlags     = dataBuffer->nFlags;
+        bufferHeader->nTimeStamp = dataBuffer->timeStamp;
+
+        if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
+            bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
+            bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
+            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
+            pExynosComponent->propagateMarkType.pMarkData = NULL;
+        }
+
+        if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
+            bufferHeader->nFilledLen = 0;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");
+            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                            pExynosComponent->callbackData,
+                            OMX_EventBufferFlag,
+                            OUTPUT_PORT_INDEX,
+                            bufferHeader->nFlags, NULL);
+        }
+
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
+    }
+
+    /* reset dataBuffer */
+    Exynos_ResetDataBuffer(dataBuffer);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
+
+    FunctionIn();
+
+    bufferHeader = dataBuffer->bufferHeader;
+
+    if (bufferHeader != NULL) {
+        bufferHeader->nFilledLen = dataBuffer->remainDataLen;
+        bufferHeader->nOffset    = 0;
+        bufferHeader->nFlags     = dataBuffer->nFlags;
+        bufferHeader->nTimeStamp = dataBuffer->timeStamp;
+
+        if (pExynosComponent->propagateMarkType.hMarkTargetComponent != NULL) {
+            bufferHeader->hMarkTargetComponent = pExynosComponent->propagateMarkType.hMarkTargetComponent;
+            bufferHeader->pMarkData = pExynosComponent->propagateMarkType.pMarkData;
+            pExynosComponent->propagateMarkType.hMarkTargetComponent = NULL;
+            pExynosComponent->propagateMarkType.pMarkData = NULL;
+        }
+
+        if ((bufferHeader->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
+            bufferHeader->nFilledLen = 0;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"event OMX_BUFFERFLAG_EOS!!!");
+            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                            pExynosComponent->callbackData,
+                            OMX_EventBufferFlag,
+                            OUTPUT_PORT_INDEX,
+                            bufferHeader->nFlags, NULL);
+        }
+
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, bufferHeader);
+    }
+
+    /* reset dataBuffer */
+    Exynos_ResetDataBuffer(dataBuffer);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_MESSAGE    *message = NULL;
+    EXYNOS_OMX_DATABUFFER *outputUseBuffer = NULL;
+
+    FunctionIn();
+
+    if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.outputDataBuffer);
+    } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+        outputUseBuffer = &(pExynosPort->way.port2WayDataBuffer.inputDataBuffer);
+    }
+
+    if (pExynosComponent->currentState != OMX_StateExecuting) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
+        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+        if (outputUseBuffer->dataValid != OMX_TRUE) {
+            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+            if (message == NULL) {
+                ret = OMX_ErrorUndefined;
+                goto EXIT;
+            }
+            if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+                ret = OMX_ErrorCodecFlush;
+                goto EXIT;
+            }
+
+            outputUseBuffer->bufferHeader  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+            outputUseBuffer->allocSize     = outputUseBuffer->bufferHeader->nAllocLen;
+            outputUseBuffer->dataLen       = 0; //dataBuffer->bufferHeader->nFilledLen;
+            outputUseBuffer->remainDataLen = outputUseBuffer->dataLen;
+            outputUseBuffer->usedDataLen   = 0; //dataBuffer->bufferHeader->nOffset;
+            outputUseBuffer->dataValid     = OMX_TRUE;
+            /* dataBuffer->nFlags             = dataBuffer->bufferHeader->nFlags; */
+            /* dataBuffer->nTimeStamp         = dataBuffer->bufferHeader->nTimeStamp; */
+/*
+            if (pExynosPort->bufferProcessType == BUFFER_SHARE)
+                outputUseBuffer->pPrivate      = outputUseBuffer->bufferHeader->pOutputPortPrivate;
+            else if ((pExynosPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                pExynosPort->processData.dataBuffer = outputUseBuffer->bufferHeader->pBuffer;
+                pExynosPort->processData.allocSize  = outputUseBuffer->bufferHeader->nAllocLen;
+            }
+*/
+
+            Exynos_OSAL_Free(message);
+        }
+        ret = OMX_ErrorNone;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+
+}
+
+OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
+
+    FunctionIn();
+
+    pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
+
+    if (data == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ret = Exynos_OSAL_Queue(&pExynosPort->codecBufferQ, (void *)data);
+    if (ret != 0) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+    Exynos_OSAL_SemaphorePost(pExynosPort->codecSemID);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_CodecBufferDeQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR *data)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
+    OMX_U32 tempData;
+
+    FunctionIn();
+
+    pExynosPort = &pExynosComponent->pExynosPort[PortIndex];
+    Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
+    tempData = (OMX_U32)Exynos_OSAL_Dequeue(&pExynosPort->codecBufferQ);
+    if (tempData == NULL) {
+        *data = NULL;
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+    *data = (OMX_PTR)tempData;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_CodecBufferReset(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
+
+    FunctionIn();
+
+    pExynosPort= &pExynosComponent->pExynosPort[PortIndex];
+
+    ret = Exynos_OSAL_ResetQueue(&pExynosPort->codecBufferQ);
+    if (ret != 0) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+    while (1) {
+        int cnt = 0;
+        Exynos_OSAL_Get_SemaphoreCount(pExynosPort->codecSemID, &cnt);
+        if (cnt > 0)
+            Exynos_OSAL_SemaphoreWait(pExynosPort->codecSemID);
+        else
+            break;
+    }
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR     ComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    if (pExynosComponent->currentState == OMX_StateInvalid ) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    if (ComponentParameterStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    switch (nParamIndex) {
+    case OMX_IndexParamVideoInit:
+    {
+        OMX_PORT_PARAM_TYPE *portParam = (OMX_PORT_PARAM_TYPE *)ComponentParameterStructure;
+        ret = Exynos_OMX_Check_SizeVersion(portParam, sizeof(OMX_PORT_PARAM_TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        portParam->nPorts           = pExynosComponent->portParam.nPorts;
+        portParam->nStartPortNumber = pExynosComponent->portParam.nStartPortNumber;
+        ret = OMX_ErrorNone;
+    }
+        break;
+    case OMX_IndexParamVideoPortFormat:
+    {
+        OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
+        OMX_U32                         portIndex = portFormat->nPortIndex;
+        OMX_U32                         index    = portFormat->nIndex;
+        EXYNOS_OMX_BASEPORT            *pExynosPort = NULL;
+        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
+        OMX_U32                         supportFormatNum = 0;
+
+        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+
+        if (portIndex == INPUT_PORT_INDEX) {
+            pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+            portDefinition = &pExynosPort->portDefinition;
+
+            switch (index) {
+            case supportFormat_0:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat       = OMX_COLOR_FormatYUV420Planar;
+                portFormat->xFramerate           = portDefinition->format.video.xFramerate;
+                break;
+            case supportFormat_1:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat       = OMX_COLOR_FormatYUV420SemiPlanar;
+                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
+                break;
+            case supportFormat_2:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12Tiled;
+                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
+                break;
+            case supportFormat_3:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV21Linear;
+                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
+                break;
+            case supportFormat_4:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat       = OMX_COLOR_FormatAndroidOpaque;
+                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
+                break;
+            default:
+                if (index > supportFormat_0) {
+                    ret = OMX_ErrorNoMore;
+                    goto EXIT;
+                }
+                break;
+            }
+        } else if (portIndex == OUTPUT_PORT_INDEX) {
+            supportFormatNum = OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
+            if (index > supportFormatNum) {
+                ret = OMX_ErrorNoMore;
+                goto EXIT;
+            }
+
+            pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+            portDefinition = &pExynosPort->portDefinition;
+
+            portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat;
+            portFormat->eColorFormat       = portDefinition->format.video.eColorFormat;
+            portFormat->xFramerate         = portDefinition->format.video.xFramerate;
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
+    case OMX_IndexParamVideoBitrate:
+    {
+        OMX_VIDEO_PARAM_BITRATETYPE     *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;
+        OMX_U32                          portIndex = videoRateControl->nPortIndex;
+        EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;
+        EXYNOS_OMX_VIDEOENC_COMPONENT   *pVideoEnc = NULL;
+        OMX_PARAM_PORTDEFINITIONTYPE    *portDefinition = NULL;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            portDefinition = &pExynosPort->portDefinition;
+
+            videoRateControl->eControlRate = pVideoEnc->eControlRate[portIndex];
+            videoRateControl->nTargetBitrate = portDefinition->format.video.nBitrate;
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
+    case OMX_IndexParamVideoQuantization:
+    {
+        OMX_VIDEO_PARAM_QUANTIZATIONTYPE  *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;
+        OMX_U32                            portIndex = videoQuantizationControl->nPortIndex;
+        EXYNOS_OMX_BASEPORT               *pExynosPort = NULL;
+        EXYNOS_OMX_VIDEOENC_COMPONENT     *pVideoEnc = NULL;
+        OMX_PARAM_PORTDEFINITIONTYPE      *portDefinition = NULL;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            portDefinition = &pExynosPort->portDefinition;
+
+            videoQuantizationControl->nQpI = pVideoEnc->quantization.nQpI;
+            videoQuantizationControl->nQpP = pVideoEnc->quantization.nQpP;
+            videoQuantizationControl->nQpB = pVideoEnc->quantization.nQpB;
+        }
+        ret = OMX_ErrorNone;
+
+    }
+        break;
+    case OMX_IndexParamPortDefinition:
+    {
+        OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
+        OMX_U32                       portIndex = portDefinition->nPortIndex;
+        EXYNOS_OMX_BASEPORT          *pExynosPort;
+
+        if (portIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+        ret = Exynos_OMX_Check_SizeVersion(portDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+        Exynos_OSAL_Memcpy(portDefinition, &pExynosPort->portDefinition, portDefinition->nSize);
+
+#ifdef USE_STOREMETADATA
+        if ((portIndex == 0) && (pExynosPort->bStoreMetaData == OMX_TRUE)) {
+            portDefinition->nBufferSize = MAX_INPUT_METADATA_BUFFER_SIZE;
+        }
+#endif
+    }
+        break;
+    default:
+    {
+        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
+    }
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        ComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    if (pExynosComponent->currentState == OMX_StateInvalid ) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    if (ComponentParameterStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    case OMX_IndexParamVideoPortFormat:
+    {
+        OMX_VIDEO_PARAM_PORTFORMATTYPE *portFormat = (OMX_VIDEO_PARAM_PORTFORMATTYPE *)ComponentParameterStructure;
+        OMX_U32                         portIndex = portFormat->nPortIndex;
+        OMX_U32                         index    = portFormat->nIndex;
+        EXYNOS_OMX_BASEPORT            *pExynosPort = NULL;
+        OMX_PARAM_PORTDEFINITIONTYPE   *portDefinition = NULL;
+        OMX_U32                         supportFormatNum = 0;
+
+        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_VIDEO_PARAM_PORTFORMATTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            portDefinition = &pExynosPort->portDefinition;
+
+            portDefinition->format.video.eColorFormat       = portFormat->eColorFormat;
+            portDefinition->format.video.eCompressionFormat = portFormat->eCompressionFormat;
+            portDefinition->format.video.xFramerate         = portFormat->xFramerate;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoBitrate:
+    {
+        OMX_VIDEO_PARAM_BITRATETYPE     *videoRateControl = (OMX_VIDEO_PARAM_BITRATETYPE *)ComponentParameterStructure;
+        OMX_U32                          portIndex = videoRateControl->nPortIndex;
+        EXYNOS_OMX_BASEPORT             *pExynosPort = NULL;
+        EXYNOS_OMX_VIDEOENC_COMPONENT   *pVideoEnc = NULL;
+        OMX_PARAM_PORTDEFINITIONTYPE    *portDefinition = NULL;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            portDefinition = &pExynosPort->portDefinition;
+
+            pVideoEnc->eControlRate[portIndex] = videoRateControl->eControlRate;
+            portDefinition->format.video.nBitrate = videoRateControl->nTargetBitrate;
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
+    case OMX_IndexParamVideoQuantization:
+    {
+        OMX_VIDEO_PARAM_QUANTIZATIONTYPE *videoQuantizationControl = (OMX_VIDEO_PARAM_QUANTIZATIONTYPE *)ComponentParameterStructure;
+        OMX_U32                           portIndex = videoQuantizationControl->nPortIndex;
+        EXYNOS_OMX_BASEPORT              *pExynosPort = NULL;
+        EXYNOS_OMX_VIDEOENC_COMPONENT    *pVideoEnc = NULL;
+        OMX_PARAM_PORTDEFINITIONTYPE     *portDefinition = NULL;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            portDefinition = &pExynosPort->portDefinition;
+
+            pVideoEnc->quantization.nQpI = videoQuantizationControl->nQpI;
+            pVideoEnc->quantization.nQpP = videoQuantizationControl->nQpP;
+            pVideoEnc->quantization.nQpB = videoQuantizationControl->nQpB;
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
+    case OMX_IndexParamPortDefinition:
+    {
+        OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
+        OMX_U32                       portIndex = pPortDefinition->nPortIndex;
+        EXYNOS_OMX_BASEPORT          *pExynosPort;
+        OMX_U32 width, height, size;
+
+        if (portIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+        ret = Exynos_OMX_Check_SizeVersion(pPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
+                ret = OMX_ErrorIncorrectStateOperation;
+                goto EXIT;
+            }
+        }
+        if(pPortDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, pPortDefinition, pPortDefinition->nSize);
+        if (portIndex == INPUT_PORT_INDEX) {
+            EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+            Exynos_UpdateFrameSize(pOMXComponent);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pExynosOutputPort->portDefinition.nBufferSize: %d",
+                            pExynosOutputPort->portDefinition.nBufferSize);
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
+#ifdef USE_STOREMETADATA
+    case OMX_IndexParamStoreMetaDataBuffer:
+    {
+        ret = Exynos_OSAL_SetANBParameter(hComponent, nIndex, ComponentParameterStructure);
+    }
+        break;
+#endif
+    default:
+    {
+        ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
+    }
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetConfig(
+    OMX_HANDLETYPE hComponent,
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    case OMX_IndexConfigVideoBitrate:
+    {
+        OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;
+        OMX_U32                       portIndex = pEncodeBitrate->nPortIndex;
+        EXYNOS_OMX_BASEPORT          *pExynosPort = NULL;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            pEncodeBitrate->nEncodeBitrate = pExynosPort->portDefinition.format.video.nBitrate;
+        }
+    }
+        break;
+    case OMX_IndexConfigVideoFramerate:
+    {
+        OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;
+        OMX_U32                   portIndex = pFramerate->nPortIndex;
+        EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            pFramerate->xEncodeFramerate = pExynosPort->portDefinition.format.video.xFramerate;
+        }
+    }
+        break;
+    default:
+        ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetConfig(
+    OMX_HANDLETYPE hComponent,
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure)
+    {
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    case OMX_IndexConfigVideoBitrate:
+    {
+        OMX_VIDEO_CONFIG_BITRATETYPE *pEncodeBitrate = (OMX_VIDEO_CONFIG_BITRATETYPE *)pComponentConfigStructure;
+        OMX_U32                       portIndex = pEncodeBitrate->nPortIndex;
+        EXYNOS_OMX_BASEPORT          *pExynosPort = NULL;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            pExynosPort->portDefinition.format.video.nBitrate = pEncodeBitrate->nEncodeBitrate;
+        }
+    }
+        break;
+    case OMX_IndexConfigVideoFramerate:
+    {
+        OMX_CONFIG_FRAMERATETYPE *pFramerate = (OMX_CONFIG_FRAMERATETYPE *)pComponentConfigStructure;
+        OMX_U32                   portIndex = pFramerate->nPortIndex;
+        EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+            pExynosPort->portDefinition.format.video.xFramerate = pFramerate->xEncodeFramerate;
+        }
+    }
+        break;
+    case OMX_IndexConfigVideoIntraVOPRefresh:
+    {
+        OMX_CONFIG_INTRAREFRESHVOPTYPE *pIntraRefreshVOP = (OMX_CONFIG_INTRAREFRESHVOPTYPE *)pComponentConfigStructure;
+        EXYNOS_OMX_VIDEOENC_COMPONENT *pVEncBase = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);
+        OMX_U32 portIndex = pIntraRefreshVOP->nPortIndex;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pVEncBase->IntraRefreshVOP = pIntraRefreshVOP->IntraRefreshVOP;
+        }
+    }
+        break;
+    default:
+        ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetExtensionIndex(
+    OMX_IN OMX_HANDLETYPE  hComponent,
+    OMX_IN OMX_STRING      cParameterName,
+    OMX_OUT OMX_INDEXTYPE *pIndexType)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if (pOMXComponent->pComponentPrivate == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    if ((cParameterName == NULL) || (pIndexType == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+#ifdef USE_STOREMETADATA
+    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER) == 0) {
+        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamStoreMetaDataBuffer;
+    } else {
+        ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
+    }
+#else
+    ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
+#endif
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}