exynos_omx has moved from hardware/samsung_slsi/exynos5
authorYunji Kim <yunji.kim@samsung.com>
Thu, 11 Oct 2012 06:32:10 +0000 (06:32 +0000)
committerHuisung Kang <hs1218.kang@samsung.com>
Mon, 29 Oct 2012 04:44:58 +0000 (13:44 +0900)
Change-Id: I16f3ebed97ae8921436a09d9e2e653bb7172b3d2
Signed-off-by: Yunji Kim <yunji.kim@samsung.com>
Signed-off-by: Huisung Kang <hs1218.kang@samsung.com>
91 files changed:
Android.mk [new file with mode: 0644]
component/audio/dec/Android.mk [new file with mode: 0644]
component/audio/dec/Exynos_OMX_Adec.c [new file with mode: 0644]
component/audio/dec/Exynos_OMX_Adec.h [new file with mode: 0644]
component/audio/dec/mp3/Android.mk [new file with mode: 0644]
component/audio/dec/mp3/Exynos_OMX_Mp3dec.c [new file with mode: 0644]
component/audio/dec/mp3/Exynos_OMX_Mp3dec.h [new file with mode: 0644]
component/audio/dec/mp3/library_register.c [new file with mode: 0644]
component/audio/dec/mp3/library_register.h [new file with mode: 0644]
component/common/Android.mk [new file with mode: 0644]
component/common/Exynos_OMX_Basecomponent.c [new file with mode: 0644]
component/common/Exynos_OMX_Basecomponent.h [new file with mode: 0644]
component/common/Exynos_OMX_Baseport.c [new file with mode: 0644]
component/common/Exynos_OMX_Baseport.h [new file with mode: 0644]
component/common/Exynos_OMX_Resourcemanager.c [new file with mode: 0644]
component/common/Exynos_OMX_Resourcemanager.h [new file with mode: 0644]
component/video/dec/Android.mk [new file with mode: 0644]
component/video/dec/Exynos_OMX_Vdec.c [new file with mode: 0644]
component/video/dec/Exynos_OMX_Vdec.h [new file with mode: 0644]
component/video/dec/Exynos_OMX_VdecControl.c [new file with mode: 0644]
component/video/dec/Exynos_OMX_VdecControl.h [new file with mode: 0644]
component/video/dec/h264/Android.mk [new file with mode: 0644]
component/video/dec/h264/Exynos_OMX_H264dec.c [new file with mode: 0644]
component/video/dec/h264/Exynos_OMX_H264dec.h [new file with mode: 0644]
component/video/dec/h264/library_register.c [new file with mode: 0644]
component/video/dec/h264/library_register.h [new file with mode: 0644]
component/video/dec/mpeg4/Android.mk [new file with mode: 0644]
component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c [new file with mode: 0644]
component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.h [new file with mode: 0644]
component/video/dec/mpeg4/library_register.c [new file with mode: 0644]
component/video/dec/mpeg4/library_register.h [new file with mode: 0644]
component/video/dec/vp8/Android.mk [new file with mode: 0644]
component/video/dec/vp8/Exynos_OMX_Vp8dec.c [new file with mode: 0644]
component/video/dec/vp8/Exynos_OMX_Vp8dec.h [new file with mode: 0644]
component/video/dec/vp8/library_register.c [new file with mode: 0644]
component/video/dec/vp8/library_register.h [new file with mode: 0644]
component/video/enc/Android.mk [new file with mode: 0644]
component/video/enc/Exynos_OMX_Venc.c [new file with mode: 0644]
component/video/enc/Exynos_OMX_Venc.h [new file with mode: 0644]
component/video/enc/Exynos_OMX_VencControl.c [new file with mode: 0644]
component/video/enc/Exynos_OMX_VencControl.h [new file with mode: 0644]
component/video/enc/h264/Android.mk [new file with mode: 0644]
component/video/enc/h264/Exynos_OMX_H264enc.c [new file with mode: 0644]
component/video/enc/h264/Exynos_OMX_H264enc.h [new file with mode: 0644]
component/video/enc/h264/library_register.c [new file with mode: 0644]
component/video/enc/h264/library_register.h [new file with mode: 0644]
component/video/enc/mpeg4/Android.mk [new file with mode: 0644]
component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c [new file with mode: 0644]
component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.h [new file with mode: 0644]
component/video/enc/mpeg4/library_register.c [new file with mode: 0644]
component/video/enc/mpeg4/library_register.h [new file with mode: 0644]
core/Android.mk [new file with mode: 0644]
core/Exynos_OMX_Component_Register.c [new file with mode: 0644]
core/Exynos_OMX_Component_Register.h [new file with mode: 0644]
core/Exynos_OMX_Core.c [new file with mode: 0644]
core/Exynos_OMX_Core.h [new file with mode: 0644]
include/exynos/Exynos_OMX_Def.h [new file with mode: 0644]
include/exynos/Exynos_OMX_Macros.h [new file with mode: 0644]
include/khronos/OMX_Audio.h [new file with mode: 0644]
include/khronos/OMX_Component.h [new file with mode: 0644]
include/khronos/OMX_ContentPipe.h [new file with mode: 0644]
include/khronos/OMX_Core.h [new file with mode: 0644]
include/khronos/OMX_IVCommon.h [new file with mode: 0644]
include/khronos/OMX_Image.h [new file with mode: 0644]
include/khronos/OMX_Index.h [new file with mode: 0644]
include/khronos/OMX_Other.h [new file with mode: 0644]
include/khronos/OMX_Types.h [new file with mode: 0644]
include/khronos/OMX_Video.h [new file with mode: 0644]
osal/Android.mk [new file with mode: 0644]
osal/Exynos_OSAL_Android.cpp [new file with mode: 0644]
osal/Exynos_OSAL_Android.h [new file with mode: 0644]
osal/Exynos_OSAL_ETC.c [new file with mode: 0644]
osal/Exynos_OSAL_ETC.h [new file with mode: 0644]
osal/Exynos_OSAL_Event.c [new file with mode: 0644]
osal/Exynos_OSAL_Event.h [new file with mode: 0644]
osal/Exynos_OSAL_Library.c [new file with mode: 0644]
osal/Exynos_OSAL_Library.h [new file with mode: 0644]
osal/Exynos_OSAL_Log.c [new file with mode: 0644]
osal/Exynos_OSAL_Log.h [new file with mode: 0644]
osal/Exynos_OSAL_Memory.c [new file with mode: 0644]
osal/Exynos_OSAL_Memory.h [new file with mode: 0644]
osal/Exynos_OSAL_Mutex.c [new file with mode: 0644]
osal/Exynos_OSAL_Mutex.h [new file with mode: 0644]
osal/Exynos_OSAL_Queue.c [new file with mode: 0644]
osal/Exynos_OSAL_Queue.h [new file with mode: 0644]
osal/Exynos_OSAL_Semaphore.c [new file with mode: 0644]
osal/Exynos_OSAL_Semaphore.h [new file with mode: 0644]
osal/Exynos_OSAL_SharedMemory.c [new file with mode: 0644]
osal/Exynos_OSAL_SharedMemory.h [new file with mode: 0644]
osal/Exynos_OSAL_Thread.c [new file with mode: 0644]
osal/Exynos_OSAL_Thread.h [new file with mode: 0644]

diff --git a/Android.mk b/Android.mk
new file mode 100644 (file)
index 0000000..9874df8
--- /dev/null
@@ -0,0 +1,27 @@
+LOCAL_PATH := $(call my-dir)
+BOARD_USE_ANB := true
+
+include $(CLEAR_VARS)
+
+EXYNOS_OMX_TOP := $(LOCAL_PATH)
+
+EXYNOS_OMX_INC := $(EXYNOS_OMX_TOP)/include/
+EXYNOS_OMX_COMPONENT := $(EXYNOS_OMX_TOP)/component
+
+include $(EXYNOS_OMX_TOP)/osal/Android.mk
+include $(EXYNOS_OMX_TOP)/core/Android.mk
+
+include $(EXYNOS_OMX_COMPONENT)/common/Android.mk
+include $(EXYNOS_OMX_COMPONENT)/video/dec/Android.mk
+include $(EXYNOS_OMX_COMPONENT)/video/dec/h264/Android.mk
+include $(EXYNOS_OMX_COMPONENT)/video/dec/mpeg4/Android.mk
+include $(EXYNOS_OMX_COMPONENT)/video/dec/vp8/Android.mk
+
+include $(EXYNOS_OMX_COMPONENT)/video/enc/Android.mk
+include $(EXYNOS_OMX_COMPONENT)/video/enc/h264/Android.mk
+include $(EXYNOS_OMX_COMPONENT)/video/enc/mpeg4/Android.mk
+
+ifeq ($(BOARD_USE_ALP_AUDIO), true)
+include $(EXYNOS_OMX_COMPONENT)/audio/dec/Android.mk
+include $(EXYNOS_OMX_COMPONENT)/audio/dec/mp3/Android.mk
+endif
diff --git a/component/audio/dec/Android.mk b/component/audio/dec/Android.mk
new file mode 100644 (file)
index 0000000..af50721
--- /dev/null
@@ -0,0 +1,19 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_Adec.c
+
+LOCAL_MODULE := libExynosOMX_Adec
+LOCAL_ARM_MODE := arm
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/audio/dec \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/audio/exynos5/srp/alp/include
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/component/audio/dec/Exynos_OMX_Adec.c b/component/audio/dec/Exynos_OMX_Adec.c
new file mode 100644 (file)
index 0000000..9b5e727
--- /dev/null
@@ -0,0 +1,1556 @@
+/*
+ *
+ * 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_Adec.c
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ *
+ * @version     1.1.0
+ * @history
+ *   2012.02.28 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "Exynos_OMX_Macros.h"
+#include "Exynos_OSAL_Event.h"
+#include "Exynos_OMX_Adec.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 "srp_api.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_AUDIO_DEC"
+#define EXYNOS_LOG_OFF
+#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_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;
+
+    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_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) {
+        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);
+    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_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;
+    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++) {
+        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) {
+                    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_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    if ((pExynosComponent->currentState == OMX_StateExecuting) &&
+        (pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portState == OMX_StateIdle) &&
+        (pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portState == OMX_StateIdle) &&
+        (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+        (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) {
+        return OMX_TRUE;
+    } else {
+        return OMX_FALSE;
+    }
+}
+
+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_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *dataBuffer = &exynosOMXInputPort->way.port1WayDataBuffer.dataBuffer;
+    OMX_BUFFERHEADERTYPE     *bufferHeader = dataBuffer->bufferHeader;
+
+    FunctionIn();
+
+    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;
+        pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
+    }
+
+    if ((pExynosComponent->currentState == OMX_StatePause) &&
+        ((!CHECK_PORT_BEING_FLUSHED(exynosOMXInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOMXOutputPort)))) {
+        Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
+    }
+
+    dataBuffer->dataValid     = OMX_FALSE;
+    dataBuffer->dataLen       = 0;
+    dataBuffer->remainDataLen = 0;
+    dataBuffer->usedDataLen   = 0;
+    dataBuffer->bufferHeader  = NULL;
+    dataBuffer->nFlags        = 0;
+    dataBuffer->timeStamp     = 0;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_InputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
+    EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;
+    EXYNOS_OMX_MESSAGE    *message = NULL;
+
+    FunctionIn();
+
+    pExynosPort= &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    dataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
+
+    if (pExynosComponent->currentState != OMX_StateExecuting) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    } else {
+        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+        Exynos_OSAL_MutexLock(dataBuffer->bufferMutex);
+        if (dataBuffer->dataValid != OMX_TRUE) {
+            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+            if (message == NULL) {
+                ret = OMX_ErrorUndefined;
+                Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
+                goto EXIT;
+            }
+
+            dataBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+            dataBuffer->allocSize = dataBuffer->bufferHeader->nAllocLen;
+            dataBuffer->dataLen = dataBuffer->bufferHeader->nFilledLen;
+            dataBuffer->remainDataLen = dataBuffer->dataLen;
+            dataBuffer->usedDataLen = 0;
+            dataBuffer->dataValid = OMX_TRUE;
+            dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags;
+            dataBuffer->timeStamp = dataBuffer->bufferHeader->nTimeStamp;
+
+            Exynos_OSAL_Free(message);
+
+            if (dataBuffer->allocSize <= dataBuffer->dataLen)
+                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Input Buffer Full, Check input buffer size! allocSize:%d, dataLen:%d", dataBuffer->allocSize, dataBuffer->dataLen);
+        }
+        Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
+        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      *exynosOMXInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *dataBuffer = &exynosOMXOutputPort->way.port1WayDataBuffer.dataBuffer;
+    OMX_BUFFERHEADERTYPE     *bufferHeader = dataBuffer->bufferHeader;
+
+    FunctionIn();
+
+    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) {
+            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                            pExynosComponent->callbackData,
+                            OMX_EventBufferFlag,
+                            OUTPUT_PORT_INDEX,
+                            bufferHeader->nFlags, NULL);
+        }
+
+        pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
+    }
+
+    if ((pExynosComponent->currentState == OMX_StatePause) &&
+        ((!CHECK_PORT_BEING_FLUSHED(exynosOMXInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOMXOutputPort)))) {
+        Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
+    }
+
+    /* reset dataBuffer */
+    dataBuffer->dataValid     = OMX_FALSE;
+    dataBuffer->dataLen       = 0;
+    dataBuffer->remainDataLen = 0;
+    dataBuffer->usedDataLen   = 0;
+    dataBuffer->bufferHeader  = NULL;
+    dataBuffer->nFlags        = 0;
+    dataBuffer->timeStamp     = 0;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OutputBufferGetQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = NULL;
+    EXYNOS_OMX_DATABUFFER *dataBuffer = NULL;
+    EXYNOS_OMX_MESSAGE    *message = NULL;
+
+    FunctionIn();
+
+    pExynosPort= &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    dataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
+
+    if (pExynosComponent->currentState != OMX_StateExecuting) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    } else {
+        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+        Exynos_OSAL_MutexLock(dataBuffer->bufferMutex);
+        if (dataBuffer->dataValid != OMX_TRUE) {
+            message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+            if (message == NULL) {
+                ret = OMX_ErrorUndefined;
+                Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
+                goto EXIT;
+            }
+
+            dataBuffer->bufferHeader = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+            dataBuffer->allocSize = dataBuffer->bufferHeader->nAllocLen;
+            dataBuffer->dataLen = 0; //dataBuffer->bufferHeader->nFilledLen;
+            dataBuffer->remainDataLen = dataBuffer->dataLen;
+            dataBuffer->usedDataLen = 0; //dataBuffer->bufferHeader->nOffset;
+            dataBuffer->dataValid = OMX_TRUE;
+            /* dataBuffer->nFlags = dataBuffer->bufferHeader->nFlags; */
+            /* dataBuffer->nTimeStamp = dataBuffer->bufferHeader->nTimeStamp; */
+            pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = dataBuffer->bufferHeader->pBuffer;
+            pExynosPort->processData.allocSize = dataBuffer->bufferHeader->nAllocLen;
+
+            Exynos_OSAL_Free(message);
+        }
+        Exynos_OSAL_MutexUnlock(dataBuffer->bufferMutex);
+        ret = OMX_ErrorNone;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+
+}
+
+OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_BOOL                  ret = OMX_FALSE;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *inputUseBuffer = &exynosInputPort->way.port1WayDataBuffer.dataBuffer;
+    EXYNOS_OMX_DATA          *inputData = &exynosInputPort->processData;
+    OMX_U32                   copySize = 0;
+    OMX_BYTE                  checkInputStream = NULL;
+    OMX_U32                   checkInputStreamLen = 0;
+    OMX_U32                   checkedSize = 0;
+    OMX_BOOL                  flagEOF = OMX_FALSE;
+    OMX_BOOL                  previousFrameEOF = OMX_FALSE;
+
+    FunctionIn();
+
+    if (inputUseBuffer->dataValid == OMX_TRUE) {
+        checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
+        checkInputStreamLen = inputUseBuffer->remainDataLen;
+
+        if (inputData->dataLen == 0) {
+            previousFrameEOF = OMX_TRUE;
+        } else {
+            previousFrameEOF = OMX_FALSE;
+        }
+
+        /* Audio extractor should parse into frame units. */
+        flagEOF = OMX_TRUE;
+        checkedSize = checkInputStreamLen;
+        copySize = checkedSize;
+
+        if (inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS)
+            pExynosComponent->bSaveFlagEOS = OMX_TRUE;
+
+        if (((inputData->allocSize) - (inputData->dataLen)) >= copySize) {
+            if (copySize > 0)
+                Exynos_OSAL_Memcpy(inputData->buffer.singlePlaneBuffer.dataBuffer + inputData->dataLen, checkInputStream, copySize);
+
+            inputUseBuffer->dataLen -= copySize;
+            inputUseBuffer->remainDataLen -= copySize;
+            inputUseBuffer->usedDataLen += copySize;
+
+            inputData->dataLen += copySize;
+            inputData->remainDataLen += copySize;
+
+            if (previousFrameEOF == OMX_TRUE) {
+                inputData->timeStamp = inputUseBuffer->timeStamp;
+                inputData->nFlags = inputUseBuffer->nFlags;
+            }
+
+            if (pExynosComponent->bUseFlagEOF == OMX_TRUE) {
+                if (pExynosComponent->bSaveFlagEOS == OMX_TRUE) {
+                    inputData->nFlags |= OMX_BUFFERFLAG_EOS;
+                    flagEOF = OMX_TRUE;
+                    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+                } else {
+                    inputData->nFlags = (inputData->nFlags & (~OMX_BUFFERFLAG_EOS));
+                }
+            } else {
+                if ((checkedSize == checkInputStreamLen) && (pExynosComponent->bSaveFlagEOS == OMX_TRUE)) {
+                    if ((inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) &&
+                        ((inputData->nFlags & OMX_BUFFERFLAG_CODECCONFIG) ||
+                        (inputData->dataLen == 0))) {
+                        inputData->nFlags |= OMX_BUFFERFLAG_EOS;
+                        flagEOF = OMX_TRUE;
+                        pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+                    } else if ((inputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) &&
+                               (!(inputData->nFlags & OMX_BUFFERFLAG_CODECCONFIG)) &&
+                               (inputData->dataLen != 0)) {
+                        inputData->nFlags = (inputData->nFlags & (~OMX_BUFFERFLAG_EOS));
+                        flagEOF = OMX_TRUE;
+                        pExynosComponent->bSaveFlagEOS = OMX_TRUE;
+                    }
+                } else {
+                    inputData->nFlags = (inputUseBuffer->nFlags & (~OMX_BUFFERFLAG_EOS));
+                }
+            }
+        } else {
+            /*????????????????????????????????? Error ?????????????????????????????????*/
+            Exynos_ResetCodecData(inputData);
+            flagEOF = OMX_FALSE;
+        }
+
+        if ((inputUseBuffer->remainDataLen == 0) ||
+            (CHECK_PORT_BEING_FLUSHED(exynosInputPort)))
+            Exynos_InputBufferReturn(pOMXComponent);
+        else
+            inputUseBuffer->dataValid = OMX_TRUE;
+    }
+
+    if (flagEOF == OMX_TRUE) {
+        if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
+            /* Flush SRP buffers */
+            SRP_Flush();
+
+            pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
+            pExynosComponent->checkTimeStamp.startTimeStamp = inputData->timeStamp;
+            pExynosComponent->checkTimeStamp.nStartFlags = inputData->nFlags;
+            pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
+                inputData->timeStamp, inputData->timeStamp / 1E6);
+        }
+
+        ret = OMX_TRUE;
+    } else {
+        ret = OMX_FALSE;
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_BOOL                  ret = OMX_FALSE;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *outputUseBuffer = &exynosOutputPort->way.port1WayDataBuffer.dataBuffer;
+    EXYNOS_OMX_DATA          *outputData = &exynosOutputPort->processData;
+    OMX_U32                   copySize = 0;
+
+    FunctionIn();
+
+    if (outputUseBuffer->dataValid == OMX_TRUE) {
+        if (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) {
+            if (pExynosComponent->checkTimeStamp.startTimeStamp == outputData->timeStamp) {
+                pExynosComponent->checkTimeStamp.startTimeStamp = -19761123;
+                pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
+                pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+                pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
+            } else {
+                Exynos_ResetCodecData(outputData);
+                ret = OMX_TRUE;
+                goto EXIT;
+            }
+        } else if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
+            Exynos_ResetCodecData(outputData);
+            ret = OMX_TRUE;
+            goto EXIT;
+        }
+
+        if (outputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) {
+            copySize = outputData->remainDataLen;
+
+            outputUseBuffer->dataLen += copySize;
+            outputUseBuffer->remainDataLen += copySize;
+            outputUseBuffer->nFlags = outputData->nFlags;
+            outputUseBuffer->timeStamp = outputData->timeStamp;
+
+            ret = OMX_TRUE;
+
+            /* reset outputData */
+            Exynos_ResetCodecData(outputData);
+
+            if ((outputUseBuffer->remainDataLen > 0) ||
+                (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) ||
+                (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
+                Exynos_OutputBufferReturn(pOMXComponent);
+        } else {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than decoded data size Out Length");
+
+            ret = OMX_FALSE;
+
+            /* reset outputData */
+            Exynos_ResetCodecData(outputData);
+        }
+    } else {
+        ret = OMX_FALSE;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *inputUseBuffer = &exynosInputPort->way.port1WayDataBuffer.dataBuffer;
+    EXYNOS_OMX_DATABUFFER    *outputUseBuffer = &exynosOutputPort->way.port1WayDataBuffer.dataBuffer;
+    EXYNOS_OMX_DATA          *inputData = &exynosInputPort->processData;
+    EXYNOS_OMX_DATA          *outputData = &exynosOutputPort->processData;
+    OMX_U32                   copySize = 0;
+
+    pExynosComponent->reInputData = OMX_FALSE;
+
+    FunctionIn();
+
+    while (!pAudioDec->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+
+        if (((pExynosComponent->currentState == OMX_StatePause) ||
+            (pExynosComponent->currentState == OMX_StateIdle) ||
+            (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) ||
+            (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) &&
+            (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded)&&
+            ((!CHECK_PORT_BEING_FLUSHED(exynosInputPort) && !CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))) {
+            Exynos_OSAL_SignalWait(pExynosComponent->pauseEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pExynosComponent->pauseEvent);
+        }
+
+        while ((Exynos_Check_BufferProcess_State(pExynosComponent)) && (!pAudioDec->bExitBufferProcessThread)) {
+            Exynos_OSAL_SleepMillisec(0);
+
+            Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
+            if ((outputUseBuffer->dataValid != OMX_TRUE) &&
+                (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
+                Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
+                ret = Exynos_OutputBufferGetQueue(pExynosComponent);
+                if ((ret == OMX_ErrorUndefined) ||
+                    (exynosInputPort->portState != OMX_StateIdle) ||
+                    (exynosOutputPort->portState != OMX_StateIdle)) {
+                    break;
+                }
+            } else {
+                Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
+            }
+
+            if (pExynosComponent->reInputData == OMX_FALSE) {
+                Exynos_OSAL_MutexLock(inputUseBuffer->bufferMutex);
+                if ((Exynos_Preprocessor_InputData(pOMXComponent) == OMX_FALSE) &&
+                    (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
+                        Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
+                        ret = Exynos_InputBufferGetQueue(pExynosComponent);
+                        break;
+                }
+
+                Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
+            }
+
+            Exynos_OSAL_MutexLock(inputUseBuffer->bufferMutex);
+            Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
+            ret = pAudioDec->exynos_codec_bufferProcess(pOMXComponent, inputData, outputData);
+            Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
+            Exynos_OSAL_MutexUnlock(inputUseBuffer->bufferMutex);
+
+            if (ret == OMX_ErrorInputDataDecodeYet)
+                pExynosComponent->reInputData = OMX_TRUE;
+            else
+                pExynosComponent->reInputData = OMX_FALSE;
+
+            Exynos_OSAL_MutexLock(outputUseBuffer->bufferMutex);
+            Exynos_Postprocess_OutputData(pOMXComponent);
+            Exynos_OSAL_MutexUnlock(outputUseBuffer->bufferMutex);
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_GetFlushBuffer(EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_DATABUFFER **pDataBuffer)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    FunctionIn();
+
+    if (pExynosPort->portWayType == WAY2_PORT) {
+        *pDataBuffer = NULL;
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    *pDataBuffer = &pExynosPort->way.port1WayDataBuffer.dataBuffer;
+
+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;
+    EXYNOS_OMX_DATABUFFER    *flushPortBuffer = NULL;
+    OMX_BUFFERHEADERTYPE     *bufferHeader = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+    OMX_U32                   flushNum = 0;
+    OMX_S32                   semValue = 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) {
+            bufferHeader = (OMX_BUFFERHEADERTYPE *)message->pCmdData;
+            bufferHeader->nFilledLen = 0;
+
+            if (portIndex == OUTPUT_PORT_INDEX) {
+                pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
+            } else {
+                pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
+            }
+
+            Exynos_OSAL_Free(message);
+            message = NULL;
+        }
+    }
+
+    Exynos_OMX_GetFlushBuffer(pExynosPort, &flushPortBuffer);
+    if (flushPortBuffer != NULL) {
+        if (flushPortBuffer->dataValid == OMX_TRUE) {
+            if (portIndex == INPUT_PORT_INDEX)
+                Exynos_InputBufferReturn(pOMXComponent);
+            else if (portIndex == OUTPUT_PORT_INDEX)
+                Exynos_OutputBufferReturn(pOMXComponent);
+        }
+    }
+
+    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_SetElemNum(&pExynosPort->bufferQ, 0);
+
+    pExynosPort->processData.dataLen       = 0;
+    pExynosPort->processData.nFlags        = 0;
+    pExynosPort->processData.remainDataLen = 0;
+    pExynosPort->processData.timeStamp     = 0;
+    pExynosPort->processData.usedDataLen   = 0;
+
+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_AUDIODEC_COMPONENT *pAudioDec = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
+    EXYNOS_OMX_DATABUFFER         *flushPortBuffer = 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;
+    pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
+
+    pExynosPort = &pExynosComponent->pExynosPort[nPortIndex];
+    Exynos_OMX_GetFlushBuffer(pExynosPort, &flushPortBuffer);
+
+    Exynos_OSAL_MutexLock(flushPortBuffer->bufferMutex);
+    ret = Exynos_OMX_FlushPort(pOMXComponent, nPortIndex);
+    Exynos_OSAL_MutexUnlock(flushPortBuffer->bufferMutex);
+
+    pExynosComponent->pExynosPort[nPortIndex].bIsPortFlushed = OMX_FALSE;
+
+    if (bEvent == OMX_TRUE && ret == OMX_ErrorNone) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                            pExynosComponent->callbackData,
+                            OMX_EventCmdComplete,
+                            OMX_CommandFlush, nPortIndex, NULL);
+    }
+
+    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;
+    }
+
+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_OMX_AudioDecodeGetParameter(
+    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_IndexParamAudioInit:
+    {
+        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_IndexParamAudioPortFormat:
+    {
+        OMX_AUDIO_PARAM_PORTFORMATTYPE *portFormat = (OMX_AUDIO_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; /* supportFormatNum = N-1 */
+
+        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+
+        if (portIndex == INPUT_PORT_INDEX) {
+            supportFormatNum = INPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
+            if (index > supportFormatNum) {
+                ret = OMX_ErrorNoMore;
+                goto EXIT;
+            }
+
+            pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+            portDefinition = &pExynosPort->portDefinition;
+
+            portFormat->eEncoding = portDefinition->format.audio.eEncoding;
+        } 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->eEncoding = portDefinition->format.audio.eEncoding;
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
+    default:
+    {
+        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
+    }
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeSetParameter(
+    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_IndexParamAudioPortFormat:
+    {
+        OMX_AUDIO_PARAM_PORTFORMATTYPE *portFormat = (OMX_AUDIO_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; /* supportFormatNum = N-1 */
+
+        ret = Exynos_OMX_Check_SizeVersion(portFormat, sizeof(OMX_AUDIO_PARAM_PORTFORMATTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((portIndex >= pExynosComponent->portParam.nPorts)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+        portDefinition = &pExynosPort->portDefinition;
+
+        portDefinition->format.audio.eEncoding = portFormat->eEncoding;
+        ret = OMX_ErrorNone;
+    }
+        break;
+    default:
+    {
+        ret = Exynos_OMX_SetParameter(hComponent, nIndex, ComponentParameterStructure);
+    }
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeGetConfig(
+    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) {
+        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 (pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    default:
+        ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeSetConfig(
+    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) {
+        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 (pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    case OMX_IndexConfigAudioMute:
+    {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_IndexConfigAudioMute");
+        ret = OMX_ErrorUnsupportedIndex;
+    }
+        break;
+    case OMX_IndexConfigAudioVolume:
+    {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_IndexConfigAudioVolume");
+        ret = OMX_ErrorUnsupportedIndex;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeGetExtensionIndex(
+    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;
+    }
+
+    ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_BufferProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pSECComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pSECComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_BufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    FunctionIn();
+
+    pAudioDec->bExitBufferProcessThread = OMX_FALSE;
+
+    ret = Exynos_OSAL_ThreadCreate(&pAudioDec->hBufferProcessThread,
+                 Exynos_OMX_BufferProcessThread,
+                 pOMXComponent);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    OMX_S32                countValue = 0;
+    unsigned int           i = 0;
+
+    FunctionIn();
+
+    pAudioDec->bExitBufferProcessThread = OMX_TRUE;
+
+    for (i = 0; i < ALL_PORT_NUM; i++) {
+        Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[i].bufferSemID, &countValue);
+        if (countValue == 0)
+            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
+    }
+
+    Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pAudioDec->hBufferProcessThread);
+    pAudioDec->hBufferProcessThread = NULL;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
+    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = 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) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    ret = Exynos_OMX_Port_Constructor(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    pAudioDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_AUDIODEC_COMPONENT));
+    if (pAudioDec == NULL) {
+        Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Memset(pAudioDec, 0, sizeof(EXYNOS_OMX_AUDIODEC_COMPONENT));
+    pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pAudioDec;
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+    pExynosComponent->bMultiThreadProcess = OMX_FALSE;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.nBufferCountActual = MAX_AUDIO_INPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferCountMin = MAX_AUDIO_INPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_AUDIO_INPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.eDomain = OMX_PortDomainAudio;
+
+    pExynosPort->portDefinition.format.audio.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
+    pExynosPort->portDefinition.format.audio.pNativeRender = 0;
+    pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingUnused;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.nBufferCountActual = MAX_AUDIO_OUTPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferCountMin = MAX_AUDIO_OUTPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_AUDIO_OUTPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.eDomain = OMX_PortDomainAudio;
+
+    pExynosPort->portDefinition.format.audio.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
+    pExynosPort->portDefinition.format.audio.pNativeRender = 0;
+    pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingUnused;
+
+
+    pOMXComponent->UseBuffer              = &Exynos_OMX_UseBuffer;
+    pOMXComponent->AllocateBuffer         = &Exynos_OMX_AllocateBuffer;
+    pOMXComponent->FreeBuffer             = &Exynos_OMX_FreeBuffer;
+    pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest;
+
+    pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer;
+    pExynosComponent->exynos_FreeTunnelBuffer     = &Exynos_OMX_FreeTunnelBuffer;
+    pExynosComponent->exynos_BufferProcessCreate    = &Exynos_OMX_BufferProcess_Create;
+    pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate;
+    pExynosComponent->exynos_BufferFlush          = &Exynos_OMX_BufferFlush;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
+    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
+    int                            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;
+
+    pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    Exynos_OSAL_Free(pAudioDec);
+    pExynosComponent->hComponentHandle = pAudioDec = NULL;
+
+    for(i = 0; i < ALL_PORT_NUM; i++) {
+        pExynosPort = &pExynosComponent->pExynosPort[i];
+        Exynos_OSAL_Free(pExynosPort->portDefinition.format.audio.cMIMEType);
+        pExynosPort->portDefinition.format.audio.cMIMEType = NULL;
+    }
+
+    ret = Exynos_OMX_Port_Destructor(pOMXComponent);
+
+    ret = Exynos_OMX_BaseComponent_Destructor(hComponent);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/audio/dec/Exynos_OMX_Adec.h b/component/audio/dec/Exynos_OMX_Adec.h
new file mode 100644 (file)
index 0000000..fe20109
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ *
+ * 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_Adec.h
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ *
+ * @version     1.1.0
+ * @history
+ *   2012.02.28 : Create
+ */
+
+#ifndef EXYNOS_OMX_AUDIO_DECODE
+#define EXYNOS_OMX_AUDIO_DECODE
+
+#include "OMX_Component.h"
+#include "Exynos_OMX_Def.h"
+#include "Exynos_OSAL_Queue.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Basecomponent.h"
+
+#define MAX_AUDIO_INPUTBUFFER_NUM    2
+#define MAX_AUDIO_OUTPUTBUFFER_NUM   2
+
+#define DEFAULT_AUDIO_INPUT_BUFFER_SIZE     (16 * 1024)
+#define DEFAULT_AUDIO_OUTPUT_BUFFER_SIZE    (32 * 1024)
+
+#define DEFAULT_AUDIO_SAMPLING_FREQ  44100
+#define DEFAULT_AUDIO_CHANNELS_NUM   2
+#define DEFAULT_AUDIO_BIT_PER_SAMPLE 16
+
+#define INPUT_PORT_SUPPORTFORMAT_NUM_MAX    1
+#define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX   1
+
+typedef struct _SRP_DEC_INPUT_BUFFER
+{
+    void *PhyAddr;      // physical address
+    void *VirAddr;      // virtual address
+    int   bufferSize;   // input buffer alloc size
+    int   dataSize;     // Data length
+} SRP_DEC_INPUT_BUFFER;
+
+typedef struct _EXYNOS_OMX_AUDIODEC_COMPONENT
+{
+    OMX_HANDLETYPE hCodecHandle;
+
+    OMX_BOOL bFirstFrame;
+    OMX_PTR pInputBuffer;
+    SRP_DEC_INPUT_BUFFER SRPDecInputBuffer[MAX_AUDIO_INPUTBUFFER_NUM];
+    OMX_U32  indexInputBuffer;
+
+    /* Buffer Process */
+    OMX_BOOL       bExitBufferProcessThread;
+    OMX_HANDLETYPE hBufferProcessThread;
+
+    OMX_ERRORTYPE (*exynos_codec_bufferProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData, EXYNOS_OMX_DATA *pOutputData);
+
+    int (*exynos_checkInputFrame)(OMX_U8 *pInputStream, OMX_U32 buffSize, OMX_U32 flag, OMX_BOOL bPreviousFrameEOF, OMX_BOOL *pbEndOfFrame);
+} EXYNOS_OMX_AUDIODEC_COMPONENT;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+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 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 Exynos_OMX_FreeBuffer(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_U32        nPortIndex,
+    OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr);
+OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(
+    EXYNOS_OMX_BASEPORT *pOMXBasePort,
+    OMX_U32              nPortIndex);
+OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(
+    EXYNOS_OMX_BASEPORT *pOMXBasePort,
+    OMX_U32              nPortIndex);
+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 Exynos_OMX_BufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeGetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR     ComponentParameterStructure);
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeSetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        ComponentParameterStructure);
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeGetConfig(
+    OMX_HANDLETYPE hComponent,
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure);
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeSetConfig(
+    OMX_HANDLETYPE hComponent,
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure);
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeGetExtensionIndex(
+    OMX_IN OMX_HANDLETYPE  hComponent,
+    OMX_IN OMX_STRING      cParameterName,
+    OMX_OUT OMX_INDEXTYPE *pIndexType);
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_AudioDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent);
+OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* EXYNOS_OMX_AUDIO_DECODE */
diff --git a/component/audio/dec/mp3/Android.mk b/component/audio/dec/mp3/Android.mk
new file mode 100644 (file)
index 0000000..57fd44e
--- /dev/null
@@ -0,0 +1,31 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_Mp3dec.c \
+       library_register.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libOMX.Exynos.MP3.Decoder
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/omx
+
+LOCAL_CFLAGS :=
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_Adec libExynosOMX_OSAL libExynosOMX_Basecomponent \
+       libsrpapi
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libui \
+       libExynosOMX_Resourcemanager
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/audio/dec \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/audio/exynos5/srp/alp/include
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/component/audio/dec/mp3/Exynos_OMX_Mp3dec.c b/component/audio/dec/mp3/Exynos_OMX_Mp3dec.c
new file mode 100644 (file)
index 0000000..754c17c
--- /dev/null
@@ -0,0 +1,930 @@
+/*
+ *
+ * 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_Mp3dec.c
+ * @brief
+ * @author    Yunji Kim (yunji.kim@samsung.com)
+ * @version   1.1.0
+ * @history
+ *   2012.02.28 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "Exynos_OMX_Macros.h"
+#include "Exynos_OMX_Basecomponent.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Adec.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Thread.h"
+#include "library_register.h"
+#include "Exynos_OMX_Mp3dec.h"
+#include "srp_api.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_MP3_DEC"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+//#define SRP_DUMP_TO_FILE
+#ifdef SRP_DUMP_TO_FILE
+#include "stdio.h"
+
+FILE *inFile;
+FILE *outFile;
+#endif
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetParameter(
+    OMX_IN    OMX_HANDLETYPE hComponent,
+    OMX_IN    OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR        pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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 (nParamIndex) {
+    case OMX_IndexParamAudioMp3:
+    {
+        OMX_AUDIO_PARAM_MP3TYPE *pDstMp3Param = (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
+        OMX_AUDIO_PARAM_MP3TYPE *pSrcMp3Param = NULL;
+        EXYNOS_MP3_HANDLE       *pMp3Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstMp3Param->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcMp3Param = &pMp3Dec->mp3Param;
+
+        Exynos_OSAL_Memcpy(pDstMp3Param, pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
+    }
+        break;
+    case OMX_IndexParamAudioPcm:
+    {
+        OMX_AUDIO_PARAM_PCMMODETYPE *pDstPcmParam = (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
+        OMX_AUDIO_PARAM_PCMMODETYPE *pSrcPcmParam = NULL;
+        EXYNOS_MP3_HANDLE           *pMp3Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstPcmParam->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcPcmParam = &pMp3Dec->pcmParam;
+
+        Exynos_OSAL_Memcpy(pDstPcmParam, pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_S32 codecType;
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE);
+    }
+        break;
+    default:
+        ret = Exynos_OMX_AudioDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_SetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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_IndexParamAudioMp3:
+    {
+        OMX_AUDIO_PARAM_MP3TYPE *pDstMp3Param = NULL;
+        OMX_AUDIO_PARAM_MP3TYPE *pSrcMp3Param = (OMX_AUDIO_PARAM_MP3TYPE *)pComponentParameterStructure;
+        EXYNOS_MP3_HANDLE       *pMp3Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcMp3Param->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstMp3Param = &pMp3Dec->mp3Param;
+
+        Exynos_OSAL_Memcpy(pDstMp3Param, pSrcMp3Param, sizeof(OMX_AUDIO_PARAM_MP3TYPE));
+    }
+        break;
+    case OMX_IndexParamAudioPcm:
+    {
+        OMX_AUDIO_PARAM_PCMMODETYPE *pDstPcmParam = NULL;
+        OMX_AUDIO_PARAM_PCMMODETYPE *pSrcPcmParam = (OMX_AUDIO_PARAM_PCMMODETYPE *)pComponentParameterStructure;
+        EXYNOS_MP3_HANDLE           *pMp3Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcPcmParam->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstPcmParam = &pMp3Dec->pcmParam;
+
+        Exynos_OSAL_Memcpy(pDstPcmParam, pSrcPcmParam, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+
+        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE)) {
+            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingMP3;
+        } else {
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+    }
+        break;
+    default:
+        ret = Exynos_OMX_AudioDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN 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) {
+    default:
+        ret = Exynos_OMX_AudioDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_SetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN 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) {
+    default:
+        ret = Exynos_OMX_AudioDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_GetExtensionIndex(
+    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;
+    }
+
+    ret = Exynos_OMX_AudioDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_ComponentRoleEnum(
+    OMX_IN  OMX_HANDLETYPE hComponent,
+    OMX_OUT OMX_U8        *cRole,
+    OMX_IN  OMX_U32        nIndex)
+{
+    OMX_ERRORTYPE               ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE          *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
+    OMX_S32                     codecType;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (cRole == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) {
+        ret = OMX_ErrorNoMore;
+        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;
+    }
+
+    Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MP3_HANDLE             *pMp3Dec = (EXYNOS_MP3_HANDLE *)pAudioDec->hCodecHandle;
+
+    FunctionIn();
+
+    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
+    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
+    pExynosComponent->bUseFlagEOF = OMX_TRUE; /* Mp3 extractor should parse into frame unit. */
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+    pMp3Dec->hSRPMp3Handle.bConfiguredSRP = OMX_FALSE;
+    pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
+    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+
+#ifdef SRP_DUMP_TO_FILE
+    inFile = fopen("/data/InFile.mp3", "w+");
+    outFile = fopen("/data/OutFile.pcm", "w+");
+#endif
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    FunctionIn();
+
+#ifdef SRP_DUMP_TO_FILE
+    fclose(inFile);
+    fclose(outFile);
+#endif
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3_Decode_Block(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData, EXYNOS_OMX_DATA *pOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MP3_HANDLE             *pMp3Dec = (EXYNOS_MP3_HANDLE *)pAudioDec->hCodecHandle;
+    struct srp_dec_info            codecDecInfo;
+    OMX_S32                        returnCodec = 0;
+    unsigned long                  isSRPStopped = 0;
+    OMX_PTR                        dataBuffer = NULL;
+    unsigned int                   dataLen = 0;
+    OMX_BOOL                       isSRPIbufOverflow = OMX_FALSE;
+
+    FunctionIn();
+
+#ifdef SRP_DUMP_TO_FILE
+    if (pExynosComponent->reInputData == OMX_FALSE) {
+        fwrite(pInputData->buffer.singlePlaneBuffer.dataBuffer, pInputData->dataLen, 1, inFile);
+    }
+#endif
+
+    /* Save timestamp and flags of input data */
+    pOutputData->timeStamp = pInputData->timeStamp;
+    pOutputData->nFlags = pInputData->nFlags & (~OMX_BUFFERFLAG_EOS);
+
+    /* Decoding mp3 frames by SRP */
+    if (pExynosComponent->getAllDelayBuffer == OMX_FALSE) {
+        returnCodec = SRP_Decode(pInputData->buffer.singlePlaneBuffer.dataBuffer, pInputData->dataLen);
+
+        if (returnCodec >= 0) {
+            if (pInputData->nFlags & OMX_BUFFERFLAG_EOS) {
+                SRP_Send_EOS();
+                pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_TRUE;
+            }
+        } else if (returnCodec == SRP_ERROR_IBUF_OVERFLOW) {
+            isSRPIbufOverflow = OMX_TRUE;
+            ret = OMX_ErrorInputDataDecodeYet;
+        }
+    }
+
+    if (pMp3Dec->hSRPMp3Handle.bConfiguredSRP == OMX_FALSE) {
+        if ((pInputData->dataLen <= 0) && (pInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
+            pOutputData->nFlags |= OMX_BUFFERFLAG_EOS;
+            pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+
+        returnCodec = SRP_Get_Dec_Info(&codecDecInfo);
+        if (returnCodec < 0) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Dec_Info failed: %d", returnCodec);
+            ret = OMX_ErrorHardware;
+            goto EXIT;
+        }
+
+        if (!codecDecInfo.sample_rate || !codecDecInfo.channels) {
+            if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
+                pOutputData->dataLen = 0;
+                pExynosComponent->getAllDelayBuffer = OMX_TRUE;
+                ret = OMX_ErrorInputDataDecodeYet;
+            } else {
+                pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+                if (isSRPIbufOverflow)
+                    ret = OMX_ErrorInputDataDecodeYet;
+                else
+                    ret = OMX_ErrorNone;
+            }
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "numChannels(%d), samplingRate(%d)",
+            codecDecInfo.channels, codecDecInfo.sample_rate);
+
+        if (pMp3Dec->pcmParam.nChannels != codecDecInfo.channels ||
+            pMp3Dec->pcmParam.nSamplingRate != codecDecInfo.sample_rate) {
+            /* Change channel count and sampling rate information */
+            pMp3Dec->pcmParam.nChannels = codecDecInfo.channels;
+            pMp3Dec->pcmParam.nSamplingRate = codecDecInfo.sample_rate;
+
+            /* Send Port Settings changed call back */
+            (*(pExynosComponent->pCallbacks->EventHandler))
+                  (pOMXComponent,
+                   pExynosComponent->callbackData,
+                   OMX_EventPortSettingsChanged, /* The command was completed */
+                   OMX_DirOutput, /* This is the port index */
+                   0,
+                   NULL);
+        }
+
+        pMp3Dec->hSRPMp3Handle.bConfiguredSRP = OMX_TRUE;
+
+        if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
+            pOutputData->dataLen = 0;
+            pExynosComponent->getAllDelayBuffer = OMX_TRUE;
+            ret = OMX_ErrorInputDataDecodeYet;
+        } else {
+            pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+            if (isSRPIbufOverflow)
+                ret = OMX_ErrorInputDataDecodeYet;
+            else
+                ret = OMX_ErrorNone;
+        }
+        goto EXIT;
+    }
+
+    /* Get decoded data from SRP */
+    returnCodec = SRP_Get_PCM(&dataBuffer, &dataLen);
+    if (dataLen > 0) {
+        pOutputData->dataLen = dataLen;
+        Exynos_OSAL_Memcpy(pOutputData->buffer.singlePlaneBuffer.dataBuffer, dataBuffer, dataLen);
+    } else {
+        pOutputData->dataLen = 0;
+    }
+
+#ifdef SRP_DUMP_TO_FILE
+    if (pOutputData->dataLen > 0)
+        fwrite(pOutputData->buffer.singlePlaneBuffer.dataBuffer, pOutputData->dataLen, 1, outFile);
+#endif
+
+    /* Delay EOS signal until all the PCM is returned from the SRP driver. */
+    if (pMp3Dec->hSRPMp3Handle.bSRPSendEOS == OMX_TRUE) {
+        if (pInputData->nFlags & OMX_BUFFERFLAG_EOS) {
+            returnCodec = SRP_GetParams(SRP_STOP_EOS_STATE, &isSRPStopped);
+            if (returnCodec != 0)
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail SRP_STOP_EOS_STATE");
+            if (isSRPStopped == 1) {
+                pOutputData->nFlags |= OMX_BUFFERFLAG_EOS;
+                pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+                pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE; /* for repeating one song */
+                ret = OMX_ErrorNone;
+            } else {
+                pExynosComponent->getAllDelayBuffer = OMX_TRUE;
+                ret = OMX_ErrorInputDataDecodeYet;
+            }
+        } else { /* Flush after EOS */
+            pMp3Dec->hSRPMp3Handle.bSRPSendEOS = OMX_FALSE;
+        }
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_SRP_Mp3Dec_bufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData, EXYNOS_OMX_DATA *pOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *pInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *pOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pInputPort)) || (!CHECK_PORT_ENABLED(pOutputPort)) ||
+            (!CHECK_PORT_POPULATED(pInputPort)) || (!CHECK_PORT_POPULATED(pOutputPort))) {
+        if (pInputData->nFlags & OMX_BUFFERFLAG_EOS)
+            ret = OMX_ErrorInputDataDecodeYet;
+        else
+            ret = OMX_ErrorNone;
+
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent)) {
+        if (pInputData->nFlags & OMX_BUFFERFLAG_EOS)
+            ret = OMX_ErrorInputDataDecodeYet;
+        else
+            ret = OMX_ErrorNone;
+
+        goto EXIT;
+    }
+
+    ret = Exynos_SRP_Mp3_Decode_Block(pOMXComponent, pInputData, pOutputData);
+
+    if (ret != OMX_ErrorNone) {
+        if (ret == OMX_ErrorInputDataDecodeYet) {
+            pOutputData->usedDataLen = 0;
+            pOutputData->remainDataLen = pOutputData->dataLen;
+        } else {
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                    pExynosComponent->callbackData,
+                                                    OMX_EventError, ret, 0, NULL);
+        }
+    } else {
+        pInputData->usedDataLen += pInputData->dataLen;
+        pInputData->remainDataLen = pInputData->dataLen - pInputData->usedDataLen;
+        pInputData->dataLen -= pInputData->usedDataLen;
+        pInputData->usedDataLen = 0;
+
+        pOutputData->usedDataLen = 0;
+        pOutputData->remainDataLen = pOutputData->dataLen;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
+    EXYNOS_OMX_AUDIODEC_COMPONENT *pAudioDec = NULL;
+    EXYNOS_MP3_HANDLE             *pMp3Dec = NULL;
+    OMX_PTR                        pInputBuffer = NULL;
+    OMX_PTR                        pOutputBuffer = NULL;
+    unsigned int                   inputBufferSize = 0;
+    unsigned int                   inputBufferNum = 0;
+    unsigned int                   outputBufferSize = 0;
+    unsigned int                   outputBufferNum = 0;
+    OMX_S32                        returnCodec;
+    int i = 0;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (componentName == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: parameters are null, ret: %X", __FUNCTION__, ret);
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MP3_DEC, componentName) != 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName(%s) error, ret: %X", __FUNCTION__, componentName, ret);
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_AudioDecodeComponentInit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_AudioDecodeComponentInit error, ret: %X", __FUNCTION__, ret);
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pExynosComponent->codecType = HW_AUDIO_DEC_CODEC;
+
+    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
+    if (pExynosComponent->componentName == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName alloc error, ret: %X", __FUNCTION__, ret);
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT_ERROR_1;
+    }
+    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
+    Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MP3_DEC);
+
+    pMp3Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MP3_HANDLE));
+    if (pMp3Dec == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: EXYNOS_MP3_HANDLE alloc error, ret: %X", __FUNCTION__, ret);
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT_ERROR_2;
+    }
+    Exynos_OSAL_Memset(pMp3Dec, 0, sizeof(EXYNOS_MP3_HANDLE));
+    pAudioDec = (EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pAudioDec->hCodecHandle = (OMX_HANDLETYPE)pMp3Dec;
+
+    /* Create and Init SRP */
+    pMp3Dec->hSRPMp3Handle.bSRPLoaded = OMX_FALSE;
+    returnCodec = SRP_Create(SRP_INIT_BLOCK_MODE);
+    if (returnCodec < 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Create failed: %d", returnCodec);
+        ret = OMX_ErrorHardware;
+        goto EXIT_ERROR_3;
+    }
+    pMp3Dec->hSRPMp3Handle.hSRPHandle = (OMX_HANDLETYPE)returnCodec; /* SRP's fd */
+    returnCodec = SRP_Init();
+    if (returnCodec < 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Init failed: %d", returnCodec);
+        ret = OMX_ErrorHardware;
+        goto EXIT_ERROR_4;
+    }
+    pMp3Dec->hSRPMp3Handle.bSRPLoaded = OMX_TRUE;
+
+    /* Get input buffer info from SRP */
+    returnCodec = SRP_Get_Ibuf_Info(&pInputBuffer, &inputBufferSize, &inputBufferNum);
+    if (returnCodec < 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Ibuf_Info failed: %d", returnCodec);
+        ret = OMX_ErrorHardware;
+        goto EXIT_ERROR_5;
+    }
+
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->processData.allocSize = inputBufferSize;
+    pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = Exynos_OSAL_Malloc(inputBufferSize);
+    if (pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Input data buffer alloc failed");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT_ERROR_5;
+    }
+
+    /* Get output buffer info from SRP */
+    returnCodec = SRP_Get_Obuf_Info(&pOutputBuffer, &outputBufferSize, &outputBufferNum);
+    if (returnCodec < 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "SRP_Get_Obuf_Info failed: %d", returnCodec);
+        ret = OMX_ErrorHardware;
+        goto EXIT_ERROR_6;
+    }
+
+    /* Set componentVersion */
+    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
+
+    /* Set specVersion */
+    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.nBufferCountActual = inputBufferNum;
+    pExynosPort->portDefinition.nBufferCountMin = inputBufferNum;
+    pExynosPort->portDefinition.nBufferSize = inputBufferSize;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.audio.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/mpeg");
+    pExynosPort->portDefinition.format.audio.pNativeRender = 0;
+    pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingMP3;
+    pExynosPort->portWayType = WAY1_PORT;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.nBufferCountActual = outputBufferNum;
+    pExynosPort->portDefinition.nBufferCountMin = outputBufferNum;
+    pExynosPort->portDefinition.nBufferSize = outputBufferSize;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.audio.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.audio.cMIMEType, "audio/raw");
+    pExynosPort->portDefinition.format.audio.pNativeRender = 0;
+    pExynosPort->portDefinition.format.audio.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.audio.eEncoding = OMX_AUDIO_CodingPCM;
+    pExynosPort->portWayType = WAY1_PORT;
+
+    /* Default values for Mp3 audio param */
+    INIT_SET_SIZE_VERSION(&pMp3Dec->mp3Param, OMX_AUDIO_PARAM_MP3TYPE);
+    pMp3Dec->mp3Param.nPortIndex      = INPUT_PORT_INDEX;
+    pMp3Dec->mp3Param.nChannels       = DEFAULT_AUDIO_CHANNELS_NUM;
+    pMp3Dec->mp3Param.nBitRate        = 0;
+    pMp3Dec->mp3Param.nSampleRate     = DEFAULT_AUDIO_SAMPLING_FREQ;
+    pMp3Dec->mp3Param.nAudioBandWidth = 0;
+    pMp3Dec->mp3Param.eChannelMode    = OMX_AUDIO_ChannelModeStereo;
+    pMp3Dec->mp3Param.eFormat         = OMX_AUDIO_MP3StreamFormatMP1Layer3;
+
+    /* Default values for PCM audio param */
+    INIT_SET_SIZE_VERSION(&pMp3Dec->pcmParam, OMX_AUDIO_PARAM_PCMMODETYPE);
+    pMp3Dec->pcmParam.nPortIndex         = OUTPUT_PORT_INDEX;
+    pMp3Dec->pcmParam.nChannels          = DEFAULT_AUDIO_CHANNELS_NUM;
+    pMp3Dec->pcmParam.eNumData           = OMX_NumericalDataSigned;
+    pMp3Dec->pcmParam.eEndian            = OMX_EndianLittle;
+    pMp3Dec->pcmParam.bInterleaved       = OMX_TRUE;
+    pMp3Dec->pcmParam.nBitPerSample      = DEFAULT_AUDIO_BIT_PER_SAMPLE;
+    pMp3Dec->pcmParam.nSamplingRate      = DEFAULT_AUDIO_SAMPLING_FREQ;
+    pMp3Dec->pcmParam.ePCMMode           = OMX_AUDIO_PCMModeLinear;
+    pMp3Dec->pcmParam.eChannelMapping[0] = OMX_AUDIO_ChannelLF;
+    pMp3Dec->pcmParam.eChannelMapping[1] = OMX_AUDIO_ChannelRF;
+
+    pOMXComponent->GetParameter      = &Exynos_SRP_Mp3Dec_GetParameter;
+    pOMXComponent->SetParameter      = &Exynos_SRP_Mp3Dec_SetParameter;
+    pOMXComponent->GetConfig         = &Exynos_SRP_Mp3Dec_GetConfig;
+    pOMXComponent->SetConfig         = &Exynos_SRP_Mp3Dec_SetConfig;
+    pOMXComponent->GetExtensionIndex = &Exynos_SRP_Mp3Dec_GetExtensionIndex;
+    pOMXComponent->ComponentRoleEnum = &Exynos_SRP_Mp3Dec_ComponentRoleEnum;
+    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
+
+    /* ToDo: Change the function name associated with a specific codec */
+    pExynosComponent->exynos_codec_componentInit      = &Exynos_SRP_Mp3Dec_Init;
+    pExynosComponent->exynos_codec_componentTerminate = &Exynos_SRP_Mp3Dec_Terminate;
+    pAudioDec->exynos_codec_bufferProcess = &Exynos_SRP_Mp3Dec_bufferProcess;
+    pAudioDec->exynos_checkInputFrame = NULL;
+
+    pExynosComponent->currentState = OMX_StateLoaded;
+
+    ret = OMX_ErrorNone;
+    goto EXIT; /* This function is performed successfully. */
+
+EXIT_ERROR_6:
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    Exynos_OSAL_Free(pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer);
+    pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = NULL;
+    pExynosPort->processData.allocSize = 0;
+EXIT_ERROR_5:
+    SRP_Deinit();
+EXIT_ERROR_4:
+    SRP_Terminate();
+EXIT_ERROR_3:
+    Exynos_OSAL_Free(pMp3Dec);
+    pAudioDec->hCodecHandle = NULL;
+EXIT_ERROR_2:
+    Exynos_OSAL_Free(pExynosComponent->componentName);
+    pExynosComponent->componentName = NULL;
+EXIT_ERROR_1:
+    Exynos_OMX_AudioDecodeComponentDeinit(pOMXComponent);
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_MP3_HANDLE        *pMp3Dec = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    Exynos_OSAL_Free(pExynosComponent->componentName);
+    pExynosComponent->componentName = NULL;
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    if (pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer) {
+        Exynos_OSAL_Free(pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer);
+        pExynosPort->processData.buffer.singlePlaneBuffer.dataBuffer = NULL;
+        pExynosPort->processData.allocSize = 0;
+    }
+
+    pMp3Dec = (EXYNOS_MP3_HANDLE *)((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    if (pMp3Dec != NULL) {
+        if (pMp3Dec->hSRPMp3Handle.bSRPLoaded == OMX_TRUE) {
+            SRP_Deinit();
+            SRP_Terminate();
+        }
+        Exynos_OSAL_Free(pMp3Dec);
+        ((EXYNOS_OMX_AUDIODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
+    }
+
+    ret = Exynos_OMX_AudioDecodeComponentDeinit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/audio/dec/mp3/Exynos_OMX_Mp3dec.h b/component/audio/dec/mp3/Exynos_OMX_Mp3dec.h
new file mode 100644 (file)
index 0000000..f1ac53d
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ *
+ * 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_Mp3dec.h
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     1.1.0
+ * @history
+ *   2012.02.28 : Create
+ */
+
+#ifndef EXYNOS_OMX_MP3_DEC_COMPONENT
+#define EXYNOS_OMX_MP3_DEC_COMPONENT
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+
+typedef struct _EXYNOS_SRP_MP3_HANDLE
+{
+    OMX_HANDLETYPE hSRPHandle;
+    OMX_BOOL       bConfiguredSRP;
+    OMX_BOOL       bSRPLoaded;
+    OMX_BOOL       bSRPSendEOS;
+    OMX_S32        returnCodec;
+} EXYNOS_SRP_MP3_HANDLE;
+
+typedef struct _EXYNOS_MP3_HANDLE
+{
+    /* OMX Codec specific */
+    OMX_AUDIO_PARAM_MP3TYPE     mp3Param;
+    OMX_AUDIO_PARAM_PCMMODETYPE pcmParam;
+
+    /* SEC SRP Codec specific */
+    EXYNOS_SRP_MP3_HANDLE      hSRPMp3Handle;
+} EXYNOS_MP3_HANDLE;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName);
+                OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* EXYNOS_OMX_MP3_DEC_COMPONENT */
diff --git a/component/audio/dec/mp3/library_register.c b/component/audio/dec/mp3/library_register.c
new file mode 100644 (file)
index 0000000..f0775cc
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *
+ * 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        library_register.c
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     1.1.0
+ * @history
+ *   2012.02.28 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_ETC.h"
+#include "library_register.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_MP3_DEC"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(ExynosRegisterComponentType **ppExynosComponent)
+{
+    FunctionIn();
+
+    if (ppExynosComponent == NULL)
+        goto EXIT;
+
+    /* component 1 - audio decoder MP3 */
+    Exynos_OSAL_Strcpy(ppExynosComponent[0]->componentName, EXYNOS_OMX_COMPONENT_MP3_DEC);
+    Exynos_OSAL_Strcpy(ppExynosComponent[0]->roles[0], EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE);
+    ppExynosComponent[0]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+EXIT:
+    FunctionOut();
+    return MAX_COMPONENT_NUM;
+}
+
diff --git a/component/audio/dec/mp3/library_register.h b/component/audio/dec/mp3/library_register.h
new file mode 100644 (file)
index 0000000..7b9c34a
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ *
+ * 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        library_register.h
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     1.1.0
+ * @history
+ *   2012.02.28 : Create
+ */
+
+#ifndef EXYNOS_OMX_MP3_DEC_REG
+#define EXYNOS_OMX_MP3_DEC_REG
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "Exynos_OMX_Component_Register.h"
+
+
+#define OSCL_EXPORT_REF __attribute__((visibility("default")))
+#define MAX_COMPONENT_NUM         1
+#define MAX_COMPONENT_ROLE_NUM    1
+
+/* MP3 */
+#define EXYNOS_OMX_COMPONENT_MP3_DEC         "OMX.Exynos.MP3.Decoder"
+#define EXYNOS_OMX_COMPONENT_MP3_DEC_ROLE    "audio_decoder.mp3"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(ExynosRegisterComponentType **ppExynosComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif /* EXYNOS_OMX_MP3_DEC_REG */
+
diff --git a/component/common/Android.mk b/component/common/Android.mk
new file mode 100644 (file)
index 0000000..c1e6124
--- /dev/null
@@ -0,0 +1,42 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_Basecomponent.c \
+       Exynos_OMX_Baseport.c
+
+LOCAL_MODULE := libExynosOMX_Basecomponent
+
+LOCAL_CFLAGS :=
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_OSAL
+LOCAL_SHARED_LIBRARIES := libcutils libutils
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal
+
+include $(BUILD_STATIC_LIBRARY)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_Resourcemanager.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libExynosOMX_Resourcemanager
+
+LOCAL_CFLAGS :=
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_OSAL
+LOCAL_SHARED_LIBRARIES := libcutils libutils
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/component/common/Exynos_OMX_Basecomponent.c b/component/common/Exynos_OMX_Basecomponent.c
new file mode 100644 (file)
index 0000000..f9769ef
--- /dev/null
@@ -0,0 +1,1587 @@
+/*
+ *
+ * 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_Basecomponent.c
+ * @brief
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ *             Yunji Kim (yunji.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *    2012.02.20 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "Exynos_OSAL_Event.h"
+#include "Exynos_OSAL_Thread.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Mutex.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Basecomponent.h"
+#include "Exynos_OMX_Resourcemanager.h"
+#include "Exynos_OMX_Macros.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_BASE_COMP"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+
+/* Change CHECK_SIZE_VERSION Macro */
+OMX_ERRORTYPE Exynos_OMX_Check_SizeVersion(OMX_PTR header, OMX_U32 size)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    OMX_VERSIONTYPE* version = NULL;
+    if (header == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    version = (OMX_VERSIONTYPE*)((char*)header + sizeof(OMX_U32));
+    if (*((OMX_U32*)header) != size) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (version->s.nVersionMajor != VERSIONMAJOR_NUMBER ||
+        version->s.nVersionMinor != VERSIONMINOR_NUMBER) {
+        ret = OMX_ErrorVersionMismatch;
+        goto EXIT;
+    }
+    ret = OMX_ErrorNone;
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_GetComponentVersion(
+    OMX_IN  OMX_HANDLETYPE   hComponent,
+    OMX_OUT OMX_STRING       pComponentName,
+    OMX_OUT OMX_VERSIONTYPE *pComponentVersion,
+    OMX_OUT OMX_VERSIONTYPE *pSpecVersion,
+    OMX_OUT OMX_UUIDTYPE    *pComponentUUID)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    OMX_U32                   compUUID[3];
+
+    FunctionIn();
+
+    /* check parameters */
+    if (hComponent     == NULL ||
+        pComponentName == NULL || pComponentVersion == NULL ||
+        pSpecVersion   == NULL || pComponentUUID    == 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;
+    }
+
+    Exynos_OSAL_Strcpy(pComponentName, pExynosComponent->componentName);
+    Exynos_OSAL_Memcpy(pComponentVersion, &(pExynosComponent->componentVersion), sizeof(OMX_VERSIONTYPE));
+    Exynos_OSAL_Memcpy(pSpecVersion, &(pExynosComponent->specVersion), sizeof(OMX_VERSIONTYPE));
+
+    /* Fill UUID with handle address, PID and UID.
+     * This should guarantee uiniqness */
+    compUUID[0] = (OMX_U32)pOMXComponent;
+    compUUID[1] = getpid();
+    compUUID[2] = getuid();
+    Exynos_OSAL_Memcpy(*pComponentUUID, compUUID, 3 * sizeof(*compUUID));
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_GetState (
+    OMX_IN OMX_HANDLETYPE  hComponent,
+    OMX_OUT OMX_STATETYPE *pState)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pState == 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;
+
+    *pState = pExynosComponent->currentState;
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentStateSet(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 messageParam)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_MESSAGE       *message;
+    OMX_STATETYPE             destState = messageParam;
+    OMX_STATETYPE             currentState = pExynosComponent->currentState;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_S32                   countValue = 0;
+    unsigned int              i = 0, j = 0;
+    int                       k = 0;
+
+    FunctionIn();
+
+    /* check parameters */
+    if (currentState == destState) {
+         ret = OMX_ErrorSameState;
+            goto EXIT;
+    }
+    if (currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    if ((currentState == OMX_StateLoaded) && (destState == OMX_StateIdle)) {
+        ret = Exynos_OMX_Get_Resource(pOMXComponent);
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+    }
+    if (((currentState == OMX_StateIdle) && (destState == OMX_StateLoaded))       ||
+        ((currentState == OMX_StateIdle) && (destState == OMX_StateInvalid))      ||
+        ((currentState == OMX_StateExecuting) && (destState == OMX_StateInvalid)) ||
+        ((currentState == OMX_StatePause) && (destState == OMX_StateInvalid))) {
+        Exynos_OMX_Release_Resource(pOMXComponent);
+    }
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "destState: %d", destState);
+    switch (destState) {
+    case OMX_StateInvalid:
+        switch (currentState) {
+        case OMX_StateWaitForResources:
+            Exynos_OMX_Out_WaitForResource(pOMXComponent);
+        case OMX_StateIdle:
+        case OMX_StateExecuting:
+        case OMX_StatePause:
+        case OMX_StateLoaded:
+            pExynosComponent->currentState = OMX_StateInvalid;
+            ret = pExynosComponent->exynos_BufferProcessTerminate(pOMXComponent);
+
+            for (i = 0; i < ALL_PORT_NUM; i++) {
+                if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
+                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
+                    pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
+                } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
+                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
+                    pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
+                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
+                    pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
+                }
+                Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
+                pExynosComponent->pExynosPort[i].hPortMutex = NULL;
+            }
+
+            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
+                Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
+                pExynosComponent->pauseEvent = NULL;
+            } else {
+                for (i = 0; i < ALL_PORT_NUM; i++) {
+                    Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
+                    pExynosComponent->pExynosPort[i].pauseEvent = NULL;
+                    if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) {
+                        Exynos_OSAL_SignalTerminate(&pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
+                        pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
+                    }
+                }
+            }
+            for (i = 0; i < ALL_PORT_NUM; i++) {
+                Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
+                pExynosComponent->pExynosPort[i].bufferSemID = NULL;
+            }
+            if (pExynosComponent->exynos_codec_componentTerminate != NULL)
+                pExynosComponent->exynos_codec_componentTerminate(pOMXComponent);
+
+            ret = OMX_ErrorInvalidState;
+            break;
+        default:
+            ret = OMX_ErrorInvalidState;
+            break;
+        }
+        break;
+    case OMX_StateLoaded:
+        switch (currentState) {
+        case OMX_StateIdle:
+            ret = pExynosComponent->exynos_BufferProcessTerminate(pOMXComponent);
+
+            for (i = 0; i < ALL_PORT_NUM; i++) {
+                if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
+                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
+                    pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
+                } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
+                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
+                    pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
+                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
+                    pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
+                }
+                Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
+                pExynosComponent->pExynosPort[i].hPortMutex = NULL;
+            }
+            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
+                Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
+                pExynosComponent->pauseEvent = NULL;
+            } else {
+                for (i = 0; i < ALL_PORT_NUM; i++) {
+                    Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
+                    pExynosComponent->pExynosPort[i].pauseEvent = NULL;
+                    if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) {
+                        Exynos_OSAL_SignalTerminate(&pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
+                        pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
+                    }
+                }
+            }
+            for (i = 0; i < ALL_PORT_NUM; i++) {
+                Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
+                pExynosComponent->pExynosPort[i].bufferSemID = NULL;
+            }
+
+            pExynosComponent->exynos_codec_componentTerminate(pOMXComponent);
+
+            for (i = 0; i < (pExynosComponent->portParam.nPorts); i++) {
+                pExynosPort = (pExynosComponent->pExynosPort + i);
+                if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+                    while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
+                        message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+                        if (message != NULL)
+                            Exynos_OSAL_Free(message);
+                    }
+                    ret = pExynosComponent->exynos_FreeTunnelBuffer(pExynosPort, i);
+                    if (OMX_ErrorNone != ret) {
+                        goto EXIT;
+                    }
+                } else {
+                    if (CHECK_PORT_ENABLED(pExynosPort)) {
+                        Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource);
+                        pExynosPort->portDefinition.bPopulated = OMX_FALSE;
+                    }
+                }
+            }
+            pExynosComponent->currentState = OMX_StateLoaded;
+            break;
+        case OMX_StateWaitForResources:
+            ret = Exynos_OMX_Out_WaitForResource(pOMXComponent);
+            pExynosComponent->currentState = OMX_StateLoaded;
+            break;
+        case OMX_StateExecuting:
+        case OMX_StatePause:
+        default:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        }
+        break;
+    case OMX_StateIdle:
+        switch (currentState) {
+        case OMX_StateLoaded:
+            for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
+                pExynosPort = (pExynosComponent->pExynosPort + i);
+                if (pExynosPort == NULL) {
+                    ret = OMX_ErrorBadParameter;
+                    goto EXIT;
+                }
+                if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+                    if (CHECK_PORT_ENABLED(pExynosPort)) {
+                        ret = pExynosComponent->exynos_AllocateTunnelBuffer(pExynosPort, i);
+                        if (ret!=OMX_ErrorNone)
+                            goto EXIT;
+                    }
+                } else {
+                    if (CHECK_PORT_ENABLED(pExynosPort)) {
+                        Exynos_OSAL_SemaphoreWait(pExynosComponent->pExynosPort[i].loadedResource);
+                        if (pExynosComponent->abendState == OMX_TRUE) {
+                            Exynos_OSAL_SignalSet(pExynosComponent->abendStateEvent);
+                            ret = Exynos_OMX_Release_Resource(pOMXComponent);
+                            goto EXIT;
+                        }
+                        pExynosPort->portDefinition.bPopulated = OMX_TRUE;
+                    }
+                }
+            }
+            ret = pExynosComponent->exynos_codec_componentInit(pOMXComponent);
+            if (ret != OMX_ErrorNone) {
+                /*
+                 * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free
+                 */
+                goto EXIT;
+            }
+            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
+                Exynos_OSAL_SignalCreate(&pExynosComponent->pauseEvent);
+            } else {
+                for (i = 0; i < ALL_PORT_NUM; i++) {
+                    Exynos_OSAL_SignalCreate(&pExynosComponent->pExynosPort[i].pauseEvent);
+                    if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE)
+                        Exynos_OSAL_SignalCreate(&pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
+                }
+            }
+            for (i = 0; i < ALL_PORT_NUM; i++) {
+                ret = Exynos_OSAL_SemaphoreCreate(&pExynosComponent->pExynosPort[i].bufferSemID);
+                if (ret != OMX_ErrorNone) {
+                    ret = OMX_ErrorInsufficientResources;
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+                    goto EXIT;
+                }
+            }
+            for (i = 0; i < ALL_PORT_NUM; i++) {
+                if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
+                    ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
+                    if (ret != OMX_ErrorNone) {
+                        ret = OMX_ErrorInsufficientResources;
+                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+                        goto EXIT;
+                    }
+                } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
+                    ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
+                    if (ret != OMX_ErrorNone) {
+                        ret = OMX_ErrorInsufficientResources;
+                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+                        goto EXIT;
+                    }
+                    ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
+                    if (ret != OMX_ErrorNone) {
+                        ret = OMX_ErrorInsufficientResources;
+                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+                        goto EXIT;
+                    }
+                }
+                ret = Exynos_OSAL_MutexCreate(&pExynosComponent->pExynosPort[i].hPortMutex);
+                if (ret != OMX_ErrorNone) {
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+            }
+
+            ret = pExynosComponent->exynos_BufferProcessCreate(pOMXComponent);
+            if (ret != OMX_ErrorNone) {
+                /*
+                 * if (CHECK_PORT_TUNNELED == OMX_TRUE) thenTunnel Buffer Free
+                 */
+                if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
+                    Exynos_OSAL_SignalTerminate(pExynosComponent->pauseEvent);
+                    pExynosComponent->pauseEvent = NULL;
+                } else {
+                    for (i = 0; i < ALL_PORT_NUM; i++) {
+                        Exynos_OSAL_SignalTerminate(pExynosComponent->pExynosPort[i].pauseEvent);
+                        pExynosComponent->pExynosPort[i].pauseEvent = NULL;
+                        if (pExynosComponent->pExynosPort[i].bufferProcessType == BUFFER_SHARE) {
+                            Exynos_OSAL_SignalTerminate(&pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent);
+                            pExynosComponent->pExynosPort[i].hAllCodecBufferReturnEvent = NULL;
+                        }
+                    }
+                }
+                for (i = 0; i < ALL_PORT_NUM; i++) {
+                    if (pExynosComponent->pExynosPort[i].portWayType == WAY1_PORT) {
+                        Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex);
+                        pExynosComponent->pExynosPort[i].way.port1WayDataBuffer.dataBuffer.bufferMutex = NULL;
+                    } else if (pExynosComponent->pExynosPort[i].portWayType == WAY2_PORT) {
+                        Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex);
+                        pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.inputDataBuffer.bufferMutex = NULL;
+                        Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex);
+                        pExynosComponent->pExynosPort[i].way.port2WayDataBuffer.outputDataBuffer.bufferMutex = NULL;
+                    }
+                    Exynos_OSAL_MutexTerminate(pExynosComponent->pExynosPort[i].hPortMutex);
+                    pExynosComponent->pExynosPort[i].hPortMutex = NULL;
+                }
+                for (i = 0; i < ALL_PORT_NUM; i++) {
+                    Exynos_OSAL_SemaphoreTerminate(pExynosComponent->pExynosPort[i].bufferSemID);
+                    pExynosComponent->pExynosPort[i].bufferSemID = NULL;
+                }
+
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pExynosComponent->currentState = OMX_StateIdle;
+            break;
+        case OMX_StateExecuting:
+        case OMX_StatePause:
+            Exynos_OMX_BufferFlushProcess(pOMXComponent, ALL_PORT_INDEX, OMX_FALSE);
+            pExynosComponent->currentState = OMX_StateIdle;
+            break;
+        case OMX_StateWaitForResources:
+            pExynosComponent->currentState = OMX_StateIdle;
+            break;
+        default:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        }
+        break;
+    case OMX_StateExecuting:
+        switch (currentState) {
+        case OMX_StateLoaded:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        case OMX_StateIdle:
+            for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
+                pExynosPort = &pExynosComponent->pExynosPort[i];
+                if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort) && CHECK_PORT_ENABLED(pExynosPort)) {
+                    for (j = 0; j < pExynosPort->tunnelBufferNum; j++) {
+                        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
+                    }
+                }
+            }
+
+            pExynosComponent->transientState = EXYNOS_OMX_TransStateMax;
+            pExynosComponent->currentState = OMX_StateExecuting;
+            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
+                Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
+            } else {
+                for (i = 0; i < ALL_PORT_NUM; i++) {
+                    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[i].pauseEvent);
+                }
+            }
+            break;
+        case OMX_StatePause:
+            for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
+                pExynosPort = &pExynosComponent->pExynosPort[i];
+                if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort) && CHECK_PORT_ENABLED(pExynosPort)) {
+                    OMX_S32 semaValue = 0, cnt = 0;
+                    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[i].bufferSemID, &semaValue);
+                    if (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > semaValue) {
+                        cnt = Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) - semaValue;
+                        for (k = 0; k < cnt; k++) {
+                            Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[i].bufferSemID);
+                        }
+                    }
+                }
+            }
+
+            pExynosComponent->currentState = OMX_StateExecuting;
+            if (pExynosComponent->bMultiThreadProcess == OMX_FALSE) {
+                Exynos_OSAL_SignalSet(pExynosComponent->pauseEvent);
+            } else {
+                for (i = 0; i < ALL_PORT_NUM; i++) {
+                    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[i].pauseEvent);
+                }
+            }
+            break;
+        case OMX_StateWaitForResources:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        default:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        }
+        break;
+    case OMX_StatePause:
+        switch (currentState) {
+        case OMX_StateLoaded:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        case OMX_StateIdle:
+            pExynosComponent->currentState = OMX_StatePause;
+            break;
+        case OMX_StateExecuting:
+            pExynosComponent->currentState = OMX_StatePause;
+            break;
+        case OMX_StateWaitForResources:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        default:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        }
+        break;
+    case OMX_StateWaitForResources:
+        switch (currentState) {
+        case OMX_StateLoaded:
+            ret = Exynos_OMX_In_WaitForResource(pOMXComponent);
+            pExynosComponent->currentState = OMX_StateWaitForResources;
+            break;
+        case OMX_StateIdle:
+        case OMX_StateExecuting:
+        case OMX_StatePause:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        default:
+            ret = OMX_ErrorIncorrectStateTransition;
+            break;
+        }
+        break;
+    default:
+        ret = OMX_ErrorIncorrectStateTransition;
+        break;
+    }
+
+EXIT:
+    if (ret == OMX_ErrorNone) {
+        if (pExynosComponent->pCallbacks != NULL) {
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+            pExynosComponent->callbackData,
+            OMX_EventCmdComplete, OMX_CommandStateSet,
+            destState, NULL);
+        }
+    } else {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s:%d", __FUNCTION__, __LINE__);
+        if (pExynosComponent->pCallbacks != NULL) {
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+            pExynosComponent->callbackData,
+            OMX_EventError, ret, 0, NULL);
+        }
+    }
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_MessageHandlerThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+    OMX_U32                   messageType = 0, portIndex = 0;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    while (pExynosComponent->bExitMessageHandlerThread == OMX_FALSE) {
+        Exynos_OSAL_SemaphoreWait(pExynosComponent->msgSemaphoreHandle);
+        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosComponent->messageQ);
+        if (message != NULL) {
+            messageType = message->messageType;
+            switch (messageType) {
+            case OMX_CommandStateSet:
+                ret = Exynos_OMX_ComponentStateSet(pOMXComponent, message->messageParam);
+                break;
+            case OMX_CommandFlush:
+                ret = Exynos_OMX_BufferFlushProcess(pOMXComponent, message->messageParam, OMX_TRUE);
+                break;
+            case OMX_CommandPortDisable:
+                ret = Exynos_OMX_PortDisableProcess(pOMXComponent, message->messageParam);
+                break;
+            case OMX_CommandPortEnable:
+                ret = Exynos_OMX_PortEnableProcess(pOMXComponent, message->messageParam);
+                break;
+            case OMX_CommandMarkBuffer:
+                portIndex = message->messageParam;
+                pExynosComponent->pExynosPort[portIndex].markType.hMarkTargetComponent = ((OMX_MARKTYPE *)message->pCmdData)->hMarkTargetComponent;
+                pExynosComponent->pExynosPort[portIndex].markType.pMarkData            = ((OMX_MARKTYPE *)message->pCmdData)->pMarkData;
+                break;
+            case (OMX_COMMANDTYPE)EXYNOS_OMX_CommandComponentDeInit:
+                pExynosComponent->bExitMessageHandlerThread = OMX_TRUE;
+                break;
+            default:
+                break;
+            }
+            Exynos_OSAL_Free(message);
+            message = NULL;
+        }
+    }
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_StateSet(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
+{
+    OMX_U32 destState = nParam;
+    OMX_U32 i = 0;
+
+    if ((destState == OMX_StateIdle) && (pExynosComponent->currentState == OMX_StateLoaded)) {
+        pExynosComponent->transientState = EXYNOS_OMX_TransStateLoadedToIdle;
+        for(i = 0; i < pExynosComponent->portParam.nPorts; i++) {
+            pExynosComponent->pExynosPort[i].portState = OMX_StateIdle;
+        }
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateIdle");
+    } else if ((destState == OMX_StateLoaded) && (pExynosComponent->currentState == OMX_StateIdle)) {
+        pExynosComponent->transientState = EXYNOS_OMX_TransStateIdleToLoaded;
+        for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
+            pExynosComponent->pExynosPort[i].portState = OMX_StateLoaded;
+        }
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateLoaded");
+    } else if ((destState == OMX_StateIdle) && (pExynosComponent->currentState == OMX_StateExecuting)) {
+        pExynosComponent->transientState = EXYNOS_OMX_TransStateExecutingToIdle;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateIdle");
+    } else if ((destState == OMX_StateExecuting) && (pExynosComponent->currentState == OMX_StateIdle)) {
+        pExynosComponent->transientState = EXYNOS_OMX_TransStateIdleToExecuting;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "to OMX_StateExecuting");
+    } else if (destState == OMX_StateInvalid) {
+        for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
+            pExynosComponent->pExynosPort[i].portState = OMX_StateInvalid;
+        }
+    }
+
+    return OMX_ErrorNone;
+}
+
+static OMX_ERRORTYPE Exynos_SetPortFlush(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
+{
+    OMX_ERRORTYPE        ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+    OMX_S32              portIndex = nParam;
+    OMX_U16              i = 0, cnt = 0, index = 0;
+
+
+    if ((pExynosComponent->currentState == OMX_StateExecuting) ||
+        (pExynosComponent->currentState == OMX_StatePause)) {
+        if ((portIndex != ALL_PORT_INDEX) &&
+           ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        /*********************
+        *    need flush event set ?????
+        **********************/
+        cnt = (portIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
+        for (i = 0; i < cnt; i++) {
+            if (portIndex == ALL_PORT_INDEX)
+                index = i;
+            else
+                index = portIndex;
+            pExynosComponent->pExynosPort[index].bIsPortFlushed = OMX_TRUE;
+        }
+    } else {
+        ret = OMX_ErrorIncorrectStateOperation;
+        goto EXIT;
+    }
+    ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_SetPortEnable(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
+{
+    OMX_ERRORTYPE        ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+    OMX_S32              portIndex = nParam;
+    OMX_U16              i = 0, cnt = 0;
+
+    FunctionIn();
+
+    if ((portIndex != ALL_PORT_INDEX) &&
+        ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+
+    if (portIndex == ALL_PORT_INDEX) {
+        for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
+            pExynosPort = &pExynosComponent->pExynosPort[i];
+            if (CHECK_PORT_ENABLED(pExynosPort)) {
+                ret = OMX_ErrorIncorrectStateOperation;
+                goto EXIT;
+            } else {
+                pExynosPort->portState = OMX_StateIdle;
+            }
+        }
+    } else {
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+        if (CHECK_PORT_ENABLED(pExynosPort)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        } else {
+            pExynosPort->portState = OMX_StateIdle;
+        }
+    }
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+
+}
+
+static OMX_ERRORTYPE Exynos_SetPortDisable(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
+{
+    OMX_ERRORTYPE        ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+    OMX_S32              portIndex = nParam;
+    OMX_U16              i = 0, cnt = 0;
+
+    FunctionIn();
+
+    if ((portIndex != ALL_PORT_INDEX) &&
+        ((OMX_S32)portIndex >= (OMX_S32)pExynosComponent->portParam.nPorts)) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+
+    if (portIndex == ALL_PORT_INDEX) {
+        for (i = 0; i < pExynosComponent->portParam.nPorts; i++) {
+            pExynosPort = &pExynosComponent->pExynosPort[i];
+            if (!CHECK_PORT_ENABLED(pExynosPort)) {
+                ret = OMX_ErrorIncorrectStateOperation;
+                goto EXIT;
+            }
+            pExynosPort->portState = OMX_StateLoaded;
+            pExynosPort->bIsPortDisabled = OMX_TRUE;
+        }
+    } else {
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+        pExynosPort->portState = OMX_StateLoaded;
+        pExynosPort->bIsPortDisabled = OMX_TRUE;
+    }
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_SetMarkBuffer(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nParam)
+{
+    OMX_ERRORTYPE        ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+    OMX_U32              portIndex = nParam;
+    OMX_U16              i = 0, cnt = 0;
+
+
+    if (nParam >= pExynosComponent->portParam.nPorts) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+
+    if ((pExynosComponent->currentState == OMX_StateExecuting) ||
+        (pExynosComponent->currentState == OMX_StatePause)) {
+        ret = OMX_ErrorNone;
+    } else {
+        ret = OMX_ErrorIncorrectStateOperation;
+    }
+
+EXIT:
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_CommandQueue(
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent,
+    OMX_COMMANDTYPE        Cmd,
+    OMX_U32                nParam,
+    OMX_PTR                pCmdData)
+{
+    OMX_ERRORTYPE    ret = OMX_ErrorNone;
+    EXYNOS_OMX_MESSAGE *command = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
+
+    if (command == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    command->messageType  = (OMX_U32)Cmd;
+    command->messageParam = nParam;
+    command->pCmdData     = pCmdData;
+
+    ret = Exynos_OSAL_Queue(&pExynosComponent->messageQ, (void *)command);
+    if (ret != 0) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+    ret = Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_SendCommand(
+    OMX_IN OMX_HANDLETYPE  hComponent,
+    OMX_IN OMX_COMMANDTYPE Cmd,
+    OMX_IN OMX_U32         nParam,
+    OMX_IN OMX_PTR         pCmdData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = 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;
+    }
+
+    switch (Cmd) {
+    case OMX_CommandStateSet :
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandStateSet");
+        Exynos_StateSet(pExynosComponent, nParam);
+        break;
+    case OMX_CommandFlush :
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandFlush");
+        ret = Exynos_SetPortFlush(pExynosComponent, nParam);
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+        break;
+    case OMX_CommandPortDisable :
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandPortDisable");
+        ret = Exynos_SetPortDisable(pExynosComponent, nParam);
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+        break;
+    case OMX_CommandPortEnable :
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandPortEnable");
+        ret = Exynos_SetPortEnable(pExynosComponent, nParam);
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+        break;
+    case OMX_CommandMarkBuffer :
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Command: OMX_CommandMarkBuffer");
+        ret = Exynos_SetMarkBuffer(pExynosComponent, nParam);
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+        break;
+    default:
+        break;
+    }
+
+    ret = Exynos_OMX_CommandQueue(pExynosComponent, Cmd, nParam, pCmdData);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_GetParameter(
+    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;
+
+    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 (ComponentParameterStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nParamIndex) {
+    case OMX_IndexParamAudioInit:
+    case OMX_IndexParamVideoInit:
+    case OMX_IndexParamImageInit:
+    case OMX_IndexParamOtherInit:
+    {
+        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         = 0;
+        portParam->nStartPortNumber     = 0;
+    }
+        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);
+    }
+        break;
+    case OMX_IndexParamPriorityMgmt:
+    {
+        OMX_PRIORITYMGMTTYPE *compPriority = (OMX_PRIORITYMGMTTYPE *)ComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(compPriority, sizeof(OMX_PRIORITYMGMTTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        compPriority->nGroupID       = pExynosComponent->compPriority.nGroupID;
+        compPriority->nGroupPriority = pExynosComponent->compPriority.nGroupPriority;
+    }
+        break;
+
+    case OMX_IndexParamCompBufferSupplier:
+    {
+        OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
+        OMX_U32                       portIndex = bufferSupplier->nPortIndex;
+        EXYNOS_OMX_BASEPORT          *pExynosPort;
+
+        if ((pExynosComponent->currentState == OMX_StateLoaded) ||
+            (pExynosComponent->currentState == OMX_StateWaitForResources)) {
+            if (portIndex >= pExynosComponent->portParam.nPorts) {
+                ret = OMX_ErrorBadPortIndex;
+                goto EXIT;
+            }
+            ret = Exynos_OMX_Check_SizeVersion(bufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
+            if (ret != OMX_ErrorNone) {
+                goto EXIT;
+            }
+
+            pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+
+
+            if (pExynosPort->portDefinition.eDir == OMX_DirInput) {
+                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyInput;
+                } else if (CHECK_PORT_TUNNELED(pExynosPort)) {
+                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput;
+                } else {
+                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
+                }
+            } else {
+                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput;
+                } else if (CHECK_PORT_TUNNELED(pExynosPort)) {
+                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyInput;
+                } else {
+                    bufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
+                }
+            }
+        }
+        else
+        {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+    }
+        break;
+    default:
+    {
+        ret = OMX_ErrorUnsupportedIndex;
+        goto EXIT;
+    }
+        break;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_SetParameter(
+    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;
+
+    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 (ComponentParameterStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    case OMX_IndexParamAudioInit:
+    case OMX_IndexParamVideoInit:
+    case OMX_IndexParamImageInit:
+    case OMX_IndexParamOtherInit:
+    {
+        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;
+        }
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) &&
+            (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+        ret = OMX_ErrorUndefined;
+        /* Exynos_OSAL_Memcpy(&pExynosComponent->portParam, portParam, sizeof(OMX_PORT_PARAM_TYPE)); */
+    }
+        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];
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            if (pExynosPort->portDefinition.bEnabled == OMX_TRUE) {
+                ret = OMX_ErrorIncorrectStateOperation;
+                goto EXIT;
+            }
+        }
+        if (portDefinition->nBufferCountActual < pExynosPort->portDefinition.nBufferCountMin) {
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Memcpy(&pExynosPort->portDefinition, portDefinition, portDefinition->nSize);
+    }
+        break;
+    case OMX_IndexParamPriorityMgmt:
+    {
+        OMX_PRIORITYMGMTTYPE *compPriority = (OMX_PRIORITYMGMTTYPE *)ComponentParameterStructure;
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) &&
+            (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+
+        ret = Exynos_OMX_Check_SizeVersion(compPriority, sizeof(OMX_PRIORITYMGMTTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        pExynosComponent->compPriority.nGroupID = compPriority->nGroupID;
+        pExynosComponent->compPriority.nGroupPriority = compPriority->nGroupPriority;
+    }
+        break;
+    case OMX_IndexParamCompBufferSupplier:
+    {
+        OMX_PARAM_BUFFERSUPPLIERTYPE *bufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE *)ComponentParameterStructure;
+        OMX_U32           portIndex = bufferSupplier->nPortIndex;
+        EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+
+        if (portIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+        ret = Exynos_OMX_Check_SizeVersion(bufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
+        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 (bufferSupplier->eBufferSupplier == OMX_BufferSupplyUnspecified) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+        if (CHECK_PORT_TUNNELED(pExynosPort) == 0) {
+            ret = OMX_ErrorNone; /*OMX_ErrorNone ?????*/
+            goto EXIT;
+        }
+
+        if (pExynosPort->portDefinition.eDir == OMX_DirInput) {
+            if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) {
+                /*
+                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+                    ret = OMX_ErrorNone;
+                }
+                */
+                pExynosPort->tunnelFlags |= EXYNOS_TUNNEL_IS_SUPPLIER;
+                bufferSupplier->nPortIndex = pExynosPort->tunneledPort;
+                ret = OMX_SetParameter(pExynosPort->tunneledComponent, OMX_IndexParamCompBufferSupplier, bufferSupplier);
+                goto EXIT;
+            } else if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) {
+                ret = OMX_ErrorNone;
+                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+                    pExynosPort->tunnelFlags &= ~EXYNOS_TUNNEL_IS_SUPPLIER;
+                    bufferSupplier->nPortIndex = pExynosPort->tunneledPort;
+                    ret = OMX_SetParameter(pExynosPort->tunneledComponent, OMX_IndexParamCompBufferSupplier, bufferSupplier);
+                }
+                goto EXIT;
+            }
+        } else if (pExynosPort->portDefinition.eDir == OMX_DirOutput) {
+            if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) {
+                ret = OMX_ErrorNone;
+                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+                    pExynosPort->tunnelFlags &= ~EXYNOS_TUNNEL_IS_SUPPLIER;
+                    ret = OMX_ErrorNone;
+                }
+                goto EXIT;
+            } else if (bufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) {
+                /*
+                if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+                    ret = OMX_ErrorNone;
+                }
+                */
+                pExynosPort->tunnelFlags |= EXYNOS_TUNNEL_IS_SUPPLIER;
+                ret = OMX_ErrorNone;
+                goto EXIT;
+            }
+        }
+    }
+        break;
+    default:
+    {
+        ret = OMX_ErrorUnsupportedIndex;
+        goto EXIT;
+    }
+        break;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_GetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_INOUT OMX_PTR     pComponentConfigStructure)
+{
+    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 (pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    default:
+        ret = OMX_ErrorUnsupportedIndex;
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_SetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentConfigStructure)
+{
+    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 (pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    default:
+        ret = OMX_ErrorUnsupportedIndex;
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_GetExtensionIndex(
+    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;
+    }
+
+    ret = OMX_ErrorBadParameter;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_SetCallbacks (
+    OMX_IN OMX_HANDLETYPE    hComponent,
+    OMX_IN OMX_CALLBACKTYPE* pCallbacks,
+    OMX_IN OMX_PTR           pAppData)
+{
+    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 (pCallbacks == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState != OMX_StateLoaded) {
+        ret = OMX_ErrorIncorrectStateOperation;
+        goto EXIT;
+    }
+
+    pExynosComponent->pCallbacks = pCallbacks;
+    pExynosComponent->callbackData = pAppData;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_UseEGLImage(
+    OMX_IN OMX_HANDLETYPE            hComponent,
+    OMX_INOUT OMX_BUFFERHEADERTYPE **ppBufferHdr,
+    OMX_IN OMX_U32                   nPortIndex,
+    OMX_IN OMX_PTR                   pAppPrivate,
+    OMX_IN void                     *eglImage)
+{
+    return OMX_ErrorNotImplemented;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BaseComponent_Constructor(
+    OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    pExynosComponent = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASECOMPONENT));
+    if (pExynosComponent == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosComponent, 0, sizeof(EXYNOS_OMX_BASECOMPONENT));
+    pOMXComponent->pComponentPrivate = (OMX_PTR)pExynosComponent;
+
+    ret = Exynos_OSAL_SemaphoreCreate(&pExynosComponent->msgSemaphoreHandle);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    ret = Exynos_OSAL_MutexCreate(&pExynosComponent->compMutex);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    ret = Exynos_OSAL_SignalCreate(&pExynosComponent->abendStateEvent);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    pExynosComponent->bExitMessageHandlerThread = OMX_FALSE;
+    Exynos_OSAL_QueueCreate(&pExynosComponent->messageQ, MAX_QUEUE_ELEMENTS);
+    ret = Exynos_OSAL_ThreadCreate(&pExynosComponent->hMessageHandler, Exynos_OMX_MessageHandlerThread, pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    pExynosComponent->bMultiThreadProcess = OMX_FALSE;
+
+    pOMXComponent->GetComponentVersion = &Exynos_OMX_GetComponentVersion;
+    pOMXComponent->SendCommand         = &Exynos_OMX_SendCommand;
+    pOMXComponent->GetState            = &Exynos_OMX_GetState;
+    pOMXComponent->SetCallbacks        = &Exynos_OMX_SetCallbacks;
+    pOMXComponent->UseEGLImage         = &Exynos_OMX_UseEGLImage;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BaseComponent_Destructor(
+    OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    OMX_S32                   semaValue = 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;
+
+    Exynos_OMX_CommandQueue(pExynosComponent, EXYNOS_OMX_CommandComponentDeInit, 0, NULL);
+    Exynos_OSAL_SleepMillisec(0);
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->msgSemaphoreHandle, &semaValue);
+    if (semaValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
+    Exynos_OSAL_SemaphorePost(pExynosComponent->msgSemaphoreHandle);
+
+    Exynos_OSAL_ThreadTerminate(pExynosComponent->hMessageHandler);
+    pExynosComponent->hMessageHandler = NULL;
+
+    Exynos_OSAL_SignalTerminate(pExynosComponent->abendStateEvent);
+    pExynosComponent->abendStateEvent = NULL;
+    Exynos_OSAL_MutexTerminate(pExynosComponent->compMutex);
+    pExynosComponent->compMutex = NULL;
+    Exynos_OSAL_SemaphoreTerminate(pExynosComponent->msgSemaphoreHandle);
+    pExynosComponent->msgSemaphoreHandle = NULL;
+    Exynos_OSAL_QueueTerminate(&pExynosComponent->messageQ);
+
+    Exynos_OSAL_Free(pExynosComponent);
+    pExynosComponent = NULL;
+
+    ret = OMX_ErrorNone;
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+
diff --git a/component/common/Exynos_OMX_Basecomponent.h b/component/common/Exynos_OMX_Basecomponent.h
new file mode 100644 (file)
index 0000000..9f9ed3d
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ *
+ * 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_Basecomponent.h
+ * @brief
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ *             Yunji Kim (yunji.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *    2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_BASECOMP
+#define EXYNOS_OMX_BASECOMP
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "Exynos_OSAL_Queue.h"
+#include "Exynos_OMX_Baseport.h"
+
+
+typedef struct _EXYNOS_OMX_MESSAGE
+{
+    OMX_U32 messageType;
+    OMX_U32 messageParam;
+    OMX_PTR pCmdData;
+} EXYNOS_OMX_MESSAGE;
+
+/* for Check TimeStamp after Seek */
+typedef struct _EXYNOS_OMX_TIMESTAMP
+{
+    OMX_BOOL  needSetStartTimeStamp;
+    OMX_BOOL  needCheckStartTimeStamp;
+    OMX_TICKS startTimeStamp;
+    OMX_U32   nStartFlags;
+} EXYNOS_OMX_TIMESTAMP;
+
+typedef struct _EXYNOS_OMX_BASECOMPONENT
+{
+    OMX_STRING                  componentName;
+    OMX_VERSIONTYPE             componentVersion;
+    OMX_VERSIONTYPE             specVersion;
+
+    OMX_STATETYPE               currentState;
+    EXYNOS_OMX_TRANS_STATETYPE  transientState;
+    OMX_BOOL                    abendState;
+    OMX_HANDLETYPE              abendStateEvent;
+
+    EXYNOS_CODEC_TYPE           codecType;
+    EXYNOS_OMX_PRIORITYMGMTTYPE compPriority;
+    OMX_MARKTYPE                propagateMarkType;
+    OMX_HANDLETYPE              compMutex;
+
+    OMX_HANDLETYPE              hComponentHandle;
+
+    /* Message Handler */
+    OMX_BOOL                    bExitMessageHandlerThread;
+    OMX_HANDLETYPE              hMessageHandler;
+    OMX_HANDLETYPE              msgSemaphoreHandle;
+    EXYNOS_QUEUE                messageQ;
+
+    /* Port */
+    OMX_PORT_PARAM_TYPE         portParam;
+    EXYNOS_OMX_BASEPORT        *pExynosPort;
+
+    OMX_HANDLETYPE              pauseEvent;
+
+    /* Callback function */
+    OMX_CALLBACKTYPE           *pCallbacks;
+    OMX_PTR                     callbackData;
+
+    /* Save Timestamp */
+    OMX_TICKS                   timeStamp[MAX_TIMESTAMP];
+    EXYNOS_OMX_TIMESTAMP        checkTimeStamp;
+
+    /* Save Flags */
+    OMX_U32                     nFlags[MAX_FLAGS];
+
+    OMX_BOOL                    getAllDelayBuffer;
+    OMX_BOOL                    reInputData;
+
+    OMX_BOOL bUseFlagEOF;
+    OMX_BOOL bSaveFlagEOS;
+
+    /* Check for Old & New OMX Process type switch */
+    OMX_BOOL bMultiThreadProcess;
+
+    OMX_ERRORTYPE (*exynos_codec_componentInit)(OMX_COMPONENTTYPE *pOMXComponent);
+    OMX_ERRORTYPE (*exynos_codec_componentTerminate)(OMX_COMPONENTTYPE *pOMXComponent);
+
+    OMX_ERRORTYPE (*exynos_AllocateTunnelBuffer)(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex);
+    OMX_ERRORTYPE (*exynos_FreeTunnelBuffer)(EXYNOS_OMX_BASEPORT *pOMXBasePort, OMX_U32 nPortIndex);
+    OMX_ERRORTYPE (*exynos_BufferProcessCreate)(OMX_COMPONENTTYPE *pOMXComponent);
+    OMX_ERRORTYPE (*exynos_BufferProcessTerminate)(OMX_COMPONENTTYPE *pOMXComponent);
+    OMX_ERRORTYPE (*exynos_BufferFlush)(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent);
+} EXYNOS_OMX_BASECOMPONENT;
+
+OMX_ERRORTYPE Exynos_OMX_GetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR     ComponentParameterStructure);
+
+OMX_ERRORTYPE Exynos_OMX_SetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        ComponentParameterStructure);
+
+OMX_ERRORTYPE Exynos_OMX_GetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_INOUT OMX_PTR     pComponentConfigStructure);
+
+OMX_ERRORTYPE Exynos_OMX_SetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentConfigStructure);
+
+OMX_ERRORTYPE Exynos_OMX_GetExtensionIndex(
+    OMX_IN OMX_HANDLETYPE  hComponent,
+    OMX_IN OMX_STRING      cParameterName,
+    OMX_OUT OMX_INDEXTYPE *pIndexType);
+
+OMX_ERRORTYPE Exynos_OMX_BaseComponent_Constructor(OMX_IN OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_BaseComponent_Destructor(OMX_IN OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+    OMX_ERRORTYPE Exynos_OMX_Check_SizeVersion(OMX_PTR header, OMX_U32 size);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/common/Exynos_OMX_Baseport.c b/component/common/Exynos_OMX_Baseport.c
new file mode 100644 (file)
index 0000000..9c0c42d
--- /dev/null
@@ -0,0 +1,918 @@
+/*
+ *
+ * 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_Baseport.c
+ * @brief
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ *             HyeYeon Chung (hyeon.chung@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_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Mutex.h"
+
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Basecomponent.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_BASE_PORT"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+
+OMX_ERRORTYPE Exynos_OMX_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, OMX_BUFFERHEADERTYPE* bufferHeader)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    OMX_U32                   i = 0;
+
+    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
+    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
+        if (bufferHeader == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
+            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_FALSE;
+            break;
+        }
+    }
+
+    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+    pExynosComponent->pCallbacks->EmptyBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, OMX_BUFFERHEADERTYPE* bufferHeader)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32                   i = 0;
+
+    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
+    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
+        if (bufferHeader == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
+            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_FALSE;
+            break;
+        }
+    }
+
+    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+    pExynosComponent->pCallbacks->FillBufferDone(pOMXComponent, pExynosComponent->callbackData, bufferHeader);
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferFlushProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_S32                   portIndex = 0;
+    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;
+
+    cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
+
+    for (i = 0; i < cnt; i++) {
+        if (nPortIndex == ALL_PORT_INDEX)
+            portIndex = i;
+        else
+            portIndex = nPortIndex;
+
+        pExynosComponent->exynos_BufferFlush(pOMXComponent, portIndex, bEvent);
+    }
+
+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_OMX_EnablePort(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_U32                i = 0, cnt = 0;
+
+    FunctionIn();
+
+    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+
+    if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+        Exynos_OSAL_SemaphoreWait(pExynosPort->loadedResource);
+        pExynosPort->portDefinition.bPopulated = OMX_TRUE;
+    }
+    pExynosPort->exceptionFlag = GENERAL_STATE;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_PortEnableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    OMX_S32                portIndex = 0;
+    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;
+
+    cnt = (nPortIndex == ALL_PORT_INDEX) ? ALL_PORT_NUM : 1;
+
+    for (i = 0; i < cnt; i++) {
+        if (nPortIndex == ALL_PORT_INDEX)
+            portIndex = i;
+        else
+            portIndex = nPortIndex;
+
+        ret = Exynos_OMX_EnablePort(pOMXComponent, portIndex);
+        if (ret == OMX_ErrorNone) {
+            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                            pExynosComponent->callbackData,
+                            OMX_EventCmdComplete,
+                            OMX_CommandPortEnable, portIndex, NULL);
+        }
+    }
+
+EXIT:
+    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
+            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                            pExynosComponent->callbackData,
+                            OMX_EventError,
+                            ret, 0, NULL);
+        }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_DisablePort(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_U32                i = 0, elemNum = 0;
+    EXYNOS_OMX_MESSAGE       *message;
+
+    FunctionIn();
+
+    pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+
+    if (!CHECK_PORT_ENABLED(pExynosPort)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if (pExynosComponent->currentState != OMX_StateLoaded) {
+        if (CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+            while (Exynos_OSAL_GetElemNum(&pExynosPort->bufferQ) > 0) {
+                message = (EXYNOS_OMX_MESSAGE*)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+                Exynos_OSAL_Free(message);
+            }
+        }
+        pExynosPort->portDefinition.bPopulated = OMX_FALSE;
+        Exynos_OSAL_SemaphoreWait(pExynosPort->unloadedResource);
+    }
+    pExynosPort->portDefinition.bEnabled = OMX_FALSE;
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_PortDisableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_S32                portIndex = 0;
+    OMX_U32                i = 0, cnt = 0;
+    EXYNOS_OMX_DATABUFFER    *flushPortBuffer[2] = {NULL, NULL};
+
+    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;
+
+    cnt = (nPortIndex == ALL_PORT_INDEX ) ? ALL_PORT_NUM : 1;
+
+    /* port flush*/
+    for(i = 0; i < cnt; i++) {
+        if (nPortIndex == ALL_PORT_INDEX)
+            portIndex = i;
+        else
+            portIndex = nPortIndex;
+
+        Exynos_OMX_BufferFlushProcess(pOMXComponent, portIndex, OMX_FALSE);
+    }
+
+    for(i = 0; i < cnt; i++) {
+        if (nPortIndex == ALL_PORT_INDEX)
+            portIndex = i;
+        else
+            portIndex = nPortIndex;
+
+        ret = Exynos_OMX_DisablePort(pOMXComponent, portIndex);
+        pExynosComponent->pExynosPort[portIndex].bIsPortDisabled = OMX_FALSE;
+        if (ret == OMX_ErrorNone) {
+            pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                            pExynosComponent->callbackData,
+                            OMX_EventCmdComplete,
+                            OMX_CommandPortDisable, portIndex, NULL);
+        }
+    }
+
+EXIT:
+    if ((ret != OMX_ErrorNone) && (pOMXComponent != NULL) && (pExynosComponent != NULL)) {
+        pExynosComponent->pCallbacks->EventHandler(pOMXComponent,
+                        pExynosComponent->callbackData,
+                        OMX_EventError,
+                        ret, 0, NULL);
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_EmptyThisBuffer(
+    OMX_IN OMX_HANDLETYPE        hComponent,
+    OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
+{
+    OMX_ERRORTYPE           ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_BOOL               findBuffer = OMX_FALSE;
+    EXYNOS_OMX_MESSAGE       *message;
+    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;
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    if (pBuffer == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pBuffer->nInputPortIndex != INPUT_PORT_INDEX) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+
+    ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if ((pExynosComponent->currentState != OMX_StateIdle) &&
+        (pExynosComponent->currentState != OMX_StateExecuting) &&
+        (pExynosComponent->currentState != OMX_StatePause)) {
+        ret = OMX_ErrorIncorrectStateOperation;
+        goto EXIT;
+    }
+
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    if ((!CHECK_PORT_ENABLED(pExynosPort)) ||
+        ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) &&
+        (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) ||
+        ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) &&
+        (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) {
+        ret = OMX_ErrorIncorrectStateOperation;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
+    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
+        if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
+            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE;
+            findBuffer = OMX_TRUE;
+            break;
+        }
+    }
+
+    if (findBuffer == OMX_FALSE) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+        goto EXIT;
+    }
+
+    message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
+    if (message == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+        goto EXIT;
+    }
+    message->messageType = EXYNOS_OMX_CommandEmptyBuffer;
+    message->messageParam = (OMX_U32) i;
+    message->pCmdData = (OMX_PTR)pBuffer;
+
+    ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message);
+    if (ret != 0) {
+        ret = OMX_ErrorUndefined;
+        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+        goto EXIT;
+    }
+    ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
+    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_FillThisBuffer(
+    OMX_IN OMX_HANDLETYPE        hComponent,
+    OMX_IN OMX_BUFFERHEADERTYPE *pBuffer)
+{
+    OMX_ERRORTYPE           ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_BOOL               findBuffer = OMX_FALSE;
+    EXYNOS_OMX_MESSAGE       *message;
+    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;
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    if (pBuffer == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pBuffer->nOutputPortIndex != OUTPUT_PORT_INDEX) {
+        ret = OMX_ErrorBadPortIndex;
+        goto EXIT;
+    }
+
+    ret = Exynos_OMX_Check_SizeVersion(pBuffer, sizeof(OMX_BUFFERHEADERTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    if ((pExynosComponent->currentState != OMX_StateIdle) &&
+        (pExynosComponent->currentState != OMX_StateExecuting) &&
+        (pExynosComponent->currentState != OMX_StatePause)) {
+        ret = OMX_ErrorIncorrectStateOperation;
+        goto EXIT;
+    }
+
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    if ((!CHECK_PORT_ENABLED(pExynosPort)) ||
+        ((CHECK_PORT_BEING_FLUSHED(pExynosPort) || CHECK_PORT_BEING_DISABLED(pExynosPort)) &&
+        (!CHECK_PORT_TUNNELED(pExynosPort) || !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort))) ||
+        ((pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle) &&
+        (CHECK_PORT_TUNNELED(pExynosPort) && !CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)))) {
+        ret = OMX_ErrorIncorrectStateOperation;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_MutexLock(pExynosPort->hPortMutex);
+    for (i = 0; i < pExynosPort->portDefinition.nBufferCountActual; i++) {
+        if (pBuffer == pExynosPort->extendBufferHeader[i].OMXBufferHeader) {
+            pExynosPort->extendBufferHeader[i].bBufferInOMX = OMX_TRUE;
+            findBuffer = OMX_TRUE;
+            break;
+        }
+    }
+
+    if (findBuffer == OMX_FALSE) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+        goto EXIT;
+    }
+
+    message = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_MESSAGE));
+    if (message == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+        goto EXIT;
+    }
+    message->messageType = EXYNOS_OMX_CommandFillBuffer;
+    message->messageParam = (OMX_U32) i;
+    message->pCmdData = (OMX_PTR)pBuffer;
+
+    ret = Exynos_OSAL_Queue(&pExynosPort->bufferQ, (void *)message);
+    if (ret != 0) {
+        ret = OMX_ErrorUndefined;
+        Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+        goto EXIT;
+    }
+
+    ret = Exynos_OSAL_SemaphorePost(pExynosPort->bufferSemID);
+    Exynos_OSAL_MutexUnlock(pExynosPort->hPortMutex);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_Port_Constructor(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = NULL;
+    int i = 0;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        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;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    INIT_SET_SIZE_VERSION(&pExynosComponent->portParam, OMX_PORT_PARAM_TYPE);
+    pExynosComponent->portParam.nPorts = ALL_PORT_NUM;
+    pExynosComponent->portParam.nStartPortNumber = INPUT_PORT_INDEX;
+
+    pExynosPort = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM);
+    if (pExynosPort == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosPort, 0, sizeof(EXYNOS_OMX_BASEPORT) * ALL_PORT_NUM);
+    pExynosComponent->pExynosPort = pExynosPort;
+
+    /* Input Port */
+    pExynosInputPort = &pExynosPort[INPUT_PORT_INDEX];
+
+    Exynos_OSAL_QueueCreate(&pExynosInputPort->bufferQ, MAX_QUEUE_ELEMENTS);
+
+    pExynosInputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
+    if (pExynosInputPort->extendBufferHeader == NULL) {
+        Exynos_OSAL_Free(pExynosPort);
+        pExynosPort = NULL;
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosInputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
+
+    pExynosInputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM);
+    if (pExynosInputPort->bufferStateAllocate == NULL) {
+        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
+        pExynosInputPort->extendBufferHeader = NULL;
+        Exynos_OSAL_Free(pExynosPort);
+        pExynosPort = NULL;
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosInputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM);
+
+    pExynosInputPort->bufferSemID = NULL;
+    pExynosInputPort->assignedBufferNum = 0;
+    pExynosInputPort->portState = OMX_StateMax;
+    pExynosInputPort->bIsPortFlushed = OMX_FALSE;
+    pExynosInputPort->bIsPortDisabled = OMX_FALSE;
+    pExynosInputPort->tunneledComponent = NULL;
+    pExynosInputPort->tunneledPort = 0;
+    pExynosInputPort->tunnelBufferNum = 0;
+    pExynosInputPort->bufferSupplier = OMX_BufferSupplyUnspecified;
+    pExynosInputPort->tunnelFlags = 0;
+    ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->loadedResource);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
+        pExynosInputPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
+        pExynosInputPort->extendBufferHeader = NULL;
+        Exynos_OSAL_Free(pExynosPort);
+        pExynosPort = NULL;
+        goto EXIT;
+    }
+    ret = Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->unloadedResource);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
+        pExynosInputPort->loadedResource = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
+        pExynosInputPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
+        pExynosInputPort->extendBufferHeader = NULL;
+        Exynos_OSAL_Free(pExynosPort);
+        pExynosPort = NULL;
+        goto EXIT;
+    }
+
+    INIT_SET_SIZE_VERSION(&pExynosInputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
+    pExynosInputPort->portDefinition.nPortIndex = INPUT_PORT_INDEX;
+    pExynosInputPort->portDefinition.eDir = OMX_DirInput;
+    pExynosInputPort->portDefinition.nBufferCountActual = 0;
+    pExynosInputPort->portDefinition.nBufferCountMin = 0;
+    pExynosInputPort->portDefinition.nBufferSize = 0;
+    pExynosInputPort->portDefinition.bEnabled = OMX_FALSE;
+    pExynosInputPort->portDefinition.bPopulated = OMX_FALSE;
+    pExynosInputPort->portDefinition.eDomain = OMX_PortDomainMax;
+    pExynosInputPort->portDefinition.bBuffersContiguous = OMX_FALSE;
+    pExynosInputPort->portDefinition.nBufferAlignment = 0;
+    pExynosInputPort->markType.hMarkTargetComponent = NULL;
+    pExynosInputPort->markType.pMarkData = NULL;
+    pExynosInputPort->exceptionFlag = GENERAL_STATE;
+
+    /* Output Port */
+    pExynosOutputPort = &pExynosPort[OUTPUT_PORT_INDEX];
+
+    Exynos_OSAL_QueueCreate(&pExynosOutputPort->bufferQ, MAX_QUEUE_ELEMENTS); /* For in case of "Output Buffer Share", MAX ELEMENTS(DPB + EDPB) */ 
+
+    pExynosOutputPort->extendBufferHeader = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
+    if (pExynosOutputPort->extendBufferHeader == NULL) {
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
+        pExynosInputPort->unloadedResource = NULL;
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
+        pExynosInputPort->loadedResource = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
+        pExynosInputPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
+        pExynosInputPort->extendBufferHeader = NULL;
+        Exynos_OSAL_Free(pExynosPort);
+        pExynosPort = NULL;
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosOutputPort->extendBufferHeader, 0, sizeof(EXYNOS_OMX_BUFFERHEADERTYPE) * MAX_BUFFER_NUM);
+
+    pExynosOutputPort->bufferStateAllocate = Exynos_OSAL_Malloc(sizeof(OMX_U32) * MAX_BUFFER_NUM);
+    if (pExynosOutputPort->bufferStateAllocate == NULL) {
+        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
+        pExynosOutputPort->extendBufferHeader = NULL;
+
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
+        pExynosInputPort->unloadedResource = NULL;
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
+        pExynosInputPort->loadedResource = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
+        pExynosInputPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
+        pExynosInputPort->extendBufferHeader = NULL;
+        Exynos_OSAL_Free(pExynosPort);
+        pExynosPort = NULL;
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosOutputPort->bufferStateAllocate, 0, sizeof(OMX_U32) * MAX_BUFFER_NUM);
+
+    pExynosOutputPort->bufferSemID = NULL;
+    pExynosOutputPort->assignedBufferNum = 0;
+    pExynosOutputPort->portState = OMX_StateMax;
+    pExynosOutputPort->bIsPortFlushed = OMX_FALSE;
+    pExynosOutputPort->bIsPortDisabled = OMX_FALSE;
+    pExynosOutputPort->tunneledComponent = NULL;
+    pExynosOutputPort->tunneledPort = 0;
+    pExynosOutputPort->tunnelBufferNum = 0;
+    pExynosOutputPort->bufferSupplier = OMX_BufferSupplyUnspecified;
+    pExynosOutputPort->tunnelFlags = 0;
+    ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->loadedResource);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate);
+        pExynosOutputPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
+        pExynosOutputPort->extendBufferHeader = NULL;
+
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
+        pExynosInputPort->unloadedResource = NULL;
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
+        pExynosInputPort->loadedResource = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
+        pExynosInputPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
+        pExynosInputPort->extendBufferHeader = NULL;
+        Exynos_OSAL_Free(pExynosPort);
+        pExynosPort = NULL;
+        goto EXIT;
+    }
+    ret = Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->unloadedResource);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->loadedResource);
+        pExynosOutputPort->loadedResource = NULL;
+        Exynos_OSAL_Free(pExynosOutputPort->bufferStateAllocate);
+        pExynosOutputPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosOutputPort->extendBufferHeader);
+        pExynosOutputPort->extendBufferHeader = NULL;
+
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->unloadedResource);
+        pExynosInputPort->unloadedResource = NULL;
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->loadedResource);
+        pExynosInputPort->loadedResource = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->bufferStateAllocate);
+        pExynosInputPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosInputPort->extendBufferHeader);
+        pExynosInputPort->extendBufferHeader = NULL;
+        Exynos_OSAL_Free(pExynosPort);
+        pExynosPort = NULL;
+        goto EXIT;
+    }
+
+    INIT_SET_SIZE_VERSION(&pExynosOutputPort->portDefinition, OMX_PARAM_PORTDEFINITIONTYPE);
+    pExynosOutputPort->portDefinition.nPortIndex = OUTPUT_PORT_INDEX;
+    pExynosOutputPort->portDefinition.eDir = OMX_DirOutput;
+    pExynosOutputPort->portDefinition.nBufferCountActual = 0;
+    pExynosOutputPort->portDefinition.nBufferCountMin = 0;
+    pExynosOutputPort->portDefinition.nBufferSize = 0;
+    pExynosOutputPort->portDefinition.bEnabled = OMX_FALSE;
+    pExynosOutputPort->portDefinition.bPopulated = OMX_FALSE;
+    pExynosOutputPort->portDefinition.eDomain = OMX_PortDomainMax;
+    pExynosOutputPort->portDefinition.bBuffersContiguous = OMX_FALSE;
+    pExynosOutputPort->portDefinition.nBufferAlignment = 0;
+    pExynosOutputPort->markType.hMarkTargetComponent = NULL;
+    pExynosOutputPort->markType.pMarkData = NULL;
+    pExynosOutputPort->exceptionFlag = GENERAL_STATE;
+
+    pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+    pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
+    pExynosComponent->checkTimeStamp.startTimeStamp = 0;
+    pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
+
+    pOMXComponent->EmptyThisBuffer = &Exynos_OMX_EmptyThisBuffer;
+    pOMXComponent->FillThisBuffer  = &Exynos_OMX_FillThisBuffer;
+
+    ret = OMX_ErrorNone;
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_Port_Destructor(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+
+    OMX_S32 countValue = 0;
+    int 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;
+
+    if (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) {
+        pExynosComponent->abendState = OMX_TRUE;
+        for (i = 0; i < ALL_PORT_NUM; i++) {
+            pExynosPort = &pExynosComponent->pExynosPort[i];
+            Exynos_OSAL_SemaphorePost(pExynosPort->loadedResource);
+        }
+        Exynos_OSAL_SignalWait(pExynosComponent->abendStateEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pExynosComponent->abendStateEvent);
+    }
+
+    for (i = 0; i < ALL_PORT_NUM; i++) {
+        pExynosPort = &pExynosComponent->pExynosPort[i];
+
+        Exynos_OSAL_SemaphoreTerminate(pExynosPort->loadedResource);
+        pExynosPort->loadedResource = NULL;
+        Exynos_OSAL_SemaphoreTerminate(pExynosPort->unloadedResource);
+        pExynosPort->unloadedResource = NULL;
+        Exynos_OSAL_Free(pExynosPort->bufferStateAllocate);
+        pExynosPort->bufferStateAllocate = NULL;
+        Exynos_OSAL_Free(pExynosPort->extendBufferHeader);
+        pExynosPort->extendBufferHeader = NULL;
+
+        Exynos_OSAL_QueueTerminate(&pExynosPort->bufferQ);
+    }
+    Exynos_OSAL_Free(pExynosComponent->pExynosPort);
+    pExynosComponent->pExynosPort = NULL;
+    ret = OMX_ErrorNone;
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_ResetDataBuffer(EXYNOS_OMX_DATABUFFER *pDataBuffer)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if (pDataBuffer == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pDataBuffer->dataValid     = OMX_FALSE;
+    pDataBuffer->dataLen       = 0;
+    pDataBuffer->remainDataLen = 0;
+    pDataBuffer->usedDataLen   = 0;
+    pDataBuffer->bufferHeader  = NULL;
+    pDataBuffer->nFlags        = 0;
+    pDataBuffer->timeStamp     = 0;
+    pDataBuffer->pPrivate      = NULL;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_ResetCodecData(EXYNOS_OMX_DATA *pData)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if (pData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pData->dataLen       = 0;
+    pData->usedDataLen   = 0;
+    pData->remainDataLen = 0;
+    pData->nFlags        = 0;
+    pData->timeStamp     = 0;
+    pData->pPrivate      = NULL;
+    pData->bufferHeader  = NULL;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Shared_BufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_PLANE nPlane)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if (nPlane == ONE_PLANE) {
+        /* Case of Shared Buffer, Only support singlePlaneBuffer */
+        pData->buffer.singlePlaneBuffer.dataBuffer = pUseBuffer->bufferHeader->pBuffer;
+    } else {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane");
+        ret = OMX_ErrorNotImplemented;
+        goto EXIT;
+    }
+
+    pData->allocSize     = pUseBuffer->allocSize;
+    pData->dataLen       = pUseBuffer->dataLen;
+    pData->usedDataLen   = pUseBuffer->usedDataLen;
+    pData->remainDataLen = pUseBuffer->remainDataLen;
+    pData->timeStamp     = pUseBuffer->timeStamp;
+    pData->nFlags        = pUseBuffer->nFlags;
+    pData->pPrivate      = pUseBuffer->pPrivate;
+    pData->bufferHeader  = pUseBuffer->bufferHeader;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    pUseBuffer->bufferHeader          = pData->bufferHeader;
+    pUseBuffer->allocSize             = pData->allocSize;
+    pUseBuffer->dataLen               = pData->dataLen;
+    pUseBuffer->usedDataLen           = pData->usedDataLen;
+    pUseBuffer->remainDataLen         = pData->remainDataLen;
+    pUseBuffer->timeStamp             = pData->timeStamp;
+    pUseBuffer->nFlags                = pData->nFlags;
+    pUseBuffer->pPrivate              = pData->pPrivate;
+
+    return ret;
+}
diff --git a/component/common/Exynos_OMX_Baseport.h b/component/common/Exynos_OMX_Baseport.h
new file mode 100644 (file)
index 0000000..165bbf2
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ *
+ * 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_Baseport.h
+ * @brief
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ *             HyeYeon Chung (hyeon.chung@samsung.com)
+ * @version    2.0.0
+ * @history
+ *    2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_BASE_PORT
+#define EXYNOS_OMX_BASE_PORT
+
+
+#include "OMX_Component.h"
+#include "Exynos_OMX_Def.h"
+#include "Exynos_OSAL_Queue.h"
+#include "Exynos_OMX_Def.h"
+
+
+#define BUFFER_STATE_ALLOCATED  (1 << 0)
+#define BUFFER_STATE_ASSIGNED   (1 << 1)
+#define HEADER_STATE_ALLOCATED  (1 << 2)
+#define BUFFER_STATE_FREE        0
+
+#define MAX_BUFFER_NUM          40
+
+#define INPUT_PORT_INDEX    0
+#define OUTPUT_PORT_INDEX   1
+#define ALL_PORT_INDEX     -1
+#define ALL_PORT_NUM        2
+
+
+typedef struct _EXYNOS_OMX_BUFFERHEADERTYPE
+{
+    OMX_BUFFERHEADERTYPE *OMXBufferHeader;
+    OMX_BOOL              bBufferInOMX;
+    OMX_HANDLETYPE        ANBHandle;
+    void                 *pYUVBuf[MAX_BUFFER_PLANE];
+    int                   buf_fd[MAX_BUFFER_PLANE];
+} EXYNOS_OMX_BUFFERHEADERTYPE;
+
+typedef struct _EXYNOS_OMX_DATABUFFER
+{
+    OMX_HANDLETYPE        bufferMutex;
+    OMX_BUFFERHEADERTYPE* bufferHeader;
+    OMX_BOOL              dataValid;
+    OMX_U32               allocSize;
+    OMX_U32               dataLen;
+    OMX_U32               usedDataLen;
+    OMX_U32               remainDataLen;
+    OMX_U32               nFlags;
+    OMX_TICKS             timeStamp;
+    OMX_PTR               pPrivate;
+} EXYNOS_OMX_DATABUFFER;
+
+typedef void* CODEC_EXTRA_BUFFERINFO;
+
+typedef struct _EXYNOS_OMX_SINGLEPLANE_DATA
+{
+    OMX_PTR dataBuffer;
+    int fd;
+} EXYNOS_OMX_SINGLEPLANE_DATA;
+
+typedef struct _EXYNOS_OMX_MULTIPLANE_DATA
+{
+    OMX_U32 validPlaneNum;
+    OMX_PTR dataBuffer[MAX_BUFFER_PLANE];
+    int fd[MAX_BUFFER_PLANE];
+} EXYNOS_OMX_MULTIPLANE_DATA;
+
+typedef struct _EXYNOS_OMX_DATA
+{
+    union {
+        EXYNOS_OMX_SINGLEPLANE_DATA singlePlaneBuffer;
+        EXYNOS_OMX_MULTIPLANE_DATA multiPlaneBuffer;
+    } buffer;
+    OMX_U32   allocSize;
+    OMX_U32   dataLen;
+    OMX_U32   usedDataLen;
+    OMX_U32   remainDataLen;
+    OMX_U32   nFlags;
+    OMX_TICKS timeStamp;
+    OMX_PTR   pPrivate;
+    CODEC_EXTRA_BUFFERINFO extInfo;
+    
+    /* For Share Buffer */
+    OMX_BUFFERHEADERTYPE* bufferHeader;
+} EXYNOS_OMX_DATA;
+
+typedef struct _EXYNOS_OMX_WAY1_PORT_DATABUFFER
+{
+    EXYNOS_OMX_DATABUFFER dataBuffer;
+} EXYNOS_OMX_PORT_1WAY_DATABUFFER;
+
+typedef struct _EXYNOS_OMX_WAY2_PORT_DATABUFFER
+{
+    EXYNOS_OMX_DATABUFFER inputDataBuffer;
+    EXYNOS_OMX_DATABUFFER outputDataBuffer;
+} EXYNOS_OMX_PORT_2WAY_DATABUFFER;
+
+typedef enum _EXYNOS_OMX_PORT_WAY_TYPE
+{
+    WAY1_PORT = 0x00,
+    WAY2_PORT
+} EXYNOS_OMX_PORT_WAY_TYPE;
+
+typedef enum _EXYNOS_OMX_EXCEPTION_STATE
+{
+    GENERAL_STATE = 0x00,
+    NEED_PORT_FLUSH,
+    NEED_PORT_DISABLE,
+} EXYNOS_OMX_EXCEPTION_STATE;
+
+typedef enum _EXYNOS_OMX_PLANE
+{
+    ONE_PLANE       = 0x01,
+    TWO_PLANE       = 0x02,
+    THREE_PLANE     = 0x03,
+/*
+    ANB_START_PLANE = 0x10,
+    ANB_ONE_PLANE   = 0x11,
+    ANB_TWO_PLANE   = 0x12,
+    ANB_THREE_PLANE = 0x13,
+*/
+} EXYNOS_OMX_PLANE;
+
+typedef struct _EXYNOS_OMX_BASEPORT
+{
+    EXYNOS_OMX_BUFFERHEADERTYPE   *extendBufferHeader;
+    OMX_U32                       *bufferStateAllocate;
+    OMX_PARAM_PORTDEFINITIONTYPE   portDefinition;
+    OMX_HANDLETYPE                 bufferSemID;
+    EXYNOS_QUEUE                   bufferQ;
+    OMX_U32                        assignedBufferNum;
+    OMX_STATETYPE                  portState;
+    OMX_HANDLETYPE                 loadedResource;
+    OMX_HANDLETYPE                 unloadedResource;
+
+    OMX_BOOL                       bIsPortFlushed;
+    OMX_BOOL                       bIsPortDisabled;
+    OMX_MARKTYPE                   markType;
+
+    OMX_CONFIG_RECTTYPE            cropRectangle;
+
+    /* Tunnel Info */
+    OMX_HANDLETYPE                 tunneledComponent;
+    OMX_U32                        tunneledPort;
+    OMX_U32                        tunnelBufferNum;
+    OMX_BUFFERSUPPLIERTYPE         bufferSupplier;
+    OMX_U32                        tunnelFlags;
+
+    OMX_BOOL                       bIsANBEnabled;
+    OMX_BOOL                       bStoreMetaData;
+
+    EXYNOS_OMX_BUFFERPROCESS_TYPE  bufferProcessType;
+    EXYNOS_OMX_PORT_WAY_TYPE       portWayType;
+    OMX_HANDLETYPE                 codecSemID;
+    EXYNOS_QUEUE                   codecBufferQ;
+
+    OMX_HANDLETYPE                 pauseEvent;
+
+    /* Buffer */
+    union {
+        EXYNOS_OMX_PORT_1WAY_DATABUFFER port1WayDataBuffer;
+        EXYNOS_OMX_PORT_2WAY_DATABUFFER port2WayDataBuffer;
+    } way;
+
+    /* Data */
+    EXYNOS_OMX_DATA                processData;
+
+    /* for flush of Shared buffer scheme */
+    OMX_HANDLETYPE                 hAllCodecBufferReturnEvent;
+    OMX_HANDLETYPE                 hPortMutex;
+    EXYNOS_OMX_EXCEPTION_STATE     exceptionFlag;
+} EXYNOS_OMX_BASEPORT;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_ERRORTYPE Exynos_OMX_PortEnableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex);
+OMX_ERRORTYPE Exynos_OMX_PortDisableProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex);
+OMX_ERRORTYPE Exynos_OMX_BufferFlushProcess(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent);
+OMX_ERRORTYPE Exynos_OMX_Port_Constructor(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_Port_Destructor(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_ResetDataBuffer(EXYNOS_OMX_DATABUFFER *pDataBuffer);
+OMX_ERRORTYPE Exynos_ResetCodecData(EXYNOS_OMX_DATA *pData);
+OMX_ERRORTYPE Exynos_Shared_BufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_PLANE nPlane);
+OMX_ERRORTYPE Exynos_Shared_DataToBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer);
+
+#ifdef __cplusplus
+};
+#endif
+
+
+#endif
diff --git a/component/common/Exynos_OMX_Resourcemanager.c b/component/common/Exynos_OMX_Resourcemanager.c
new file mode 100644 (file)
index 0000000..e8be83b
--- /dev/null
@@ -0,0 +1,478 @@
+/*
+ *
+ * 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_Resourcemanager.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_Resourcemanager.h"
+#include "Exynos_OMX_Basecomponent.h"
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_Mutex.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_RM"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+#define MAX_RESOURCE_VIDEO_DEC 3 /* for Android */
+#define MAX_RESOURCE_VIDEO_ENC 1 /* for Android */
+
+/* Max allowable video scheduler component instance */
+static EXYNOS_OMX_RM_COMPONENT_LIST *gpVideoDecRMComponentList = NULL;
+static EXYNOS_OMX_RM_COMPONENT_LIST *gpVideoDecRMWaitingList = NULL;
+static EXYNOS_OMX_RM_COMPONENT_LIST *gpVideoEncRMComponentList = NULL;
+static EXYNOS_OMX_RM_COMPONENT_LIST *gpVideoEncRMWaitingList = NULL;
+static OMX_HANDLETYPE ghVideoRMComponentListMutex = NULL;
+
+
+OMX_ERRORTYPE addElementList(EXYNOS_OMX_RM_COMPONENT_LIST **ppList, OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                 ret = OMX_ErrorNone;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pTempComp = NULL;
+    EXYNOS_OMX_BASECOMPONENT     *pExynosComponent = NULL;
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    if (*ppList != NULL) {
+        pTempComp = *ppList;
+        while (pTempComp->pNext != NULL) {
+            pTempComp = pTempComp->pNext;
+        }
+        pTempComp->pNext = (EXYNOS_OMX_RM_COMPONENT_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_RM_COMPONENT_LIST));
+        if (pTempComp->pNext == NULL) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+        ((EXYNOS_OMX_RM_COMPONENT_LIST *)(pTempComp->pNext))->pNext = NULL;
+        ((EXYNOS_OMX_RM_COMPONENT_LIST *)(pTempComp->pNext))->pOMXStandComp = pOMXComponent;
+        ((EXYNOS_OMX_RM_COMPONENT_LIST *)(pTempComp->pNext))->groupPriority = pExynosComponent->compPriority.nGroupPriority;
+        goto EXIT;
+    } else {
+        *ppList = (EXYNOS_OMX_RM_COMPONENT_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_RM_COMPONENT_LIST));
+        if (*ppList == NULL) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+        pTempComp = *ppList;
+        pTempComp->pNext = NULL;
+        pTempComp->pOMXStandComp = pOMXComponent;
+        pTempComp->groupPriority = pExynosComponent->compPriority.nGroupPriority;
+    }
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE removeElementList(EXYNOS_OMX_RM_COMPONENT_LIST **ppList, OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                 ret = OMX_ErrorNone;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pCurrComp = NULL;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pPrevComp = NULL;
+    OMX_BOOL                      bDetectComp = OMX_FALSE;
+
+    if (*ppList == NULL) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    pCurrComp = *ppList;
+    while (pCurrComp != NULL) {
+        if (pCurrComp->pOMXStandComp == pOMXComponent) {
+            if (*ppList == pCurrComp) {
+                *ppList = pCurrComp->pNext;
+                Exynos_OSAL_Free(pCurrComp);
+            } else {
+                if (pPrevComp != NULL)
+                    pPrevComp->pNext = pCurrComp->pNext;
+
+                Exynos_OSAL_Free(pCurrComp);
+            }
+            bDetectComp = OMX_TRUE;
+            break;
+        } else {
+            pPrevComp = pCurrComp;
+            pCurrComp = pCurrComp->pNext;
+        }
+    }
+
+    if (bDetectComp == OMX_FALSE)
+        ret = OMX_ErrorComponentNotFound;
+    else
+        ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+int searchLowPriority(EXYNOS_OMX_RM_COMPONENT_LIST *RMComp_list, OMX_U32 inComp_priority, EXYNOS_OMX_RM_COMPONENT_LIST **outLowComp)
+{
+    int ret = 0;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pTempComp = NULL;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pCandidateComp = NULL;
+
+    if (RMComp_list == NULL)
+        ret = -1;
+
+    pTempComp = RMComp_list;
+    *outLowComp = 0;
+
+    while (pTempComp != NULL) {
+        if (pTempComp->groupPriority > inComp_priority) {
+            if (pCandidateComp != NULL) {
+                if (pCandidateComp->groupPriority < pTempComp->groupPriority)
+                    pCandidateComp = pTempComp;
+            } else {
+                pCandidateComp = pTempComp;
+            }
+        }
+
+        pTempComp = pTempComp->pNext;
+    }
+
+    *outLowComp = pCandidateComp;
+    if (pCandidateComp == NULL)
+        ret = 0;
+    else
+        ret = 1;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE removeComponent(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    if (pExynosComponent->currentState == OMX_StateIdle) {
+        (*(pExynosComponent->pCallbacks->EventHandler))
+            (pOMXComponent, pExynosComponent->callbackData,
+            OMX_EventError, OMX_ErrorResourcesLost, 0, NULL);
+        ret = OMX_SendCommand(pOMXComponent, OMX_CommandStateSet, OMX_StateLoaded, NULL);
+        if (ret != OMX_ErrorNone) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+    } else if ((pExynosComponent->currentState == OMX_StateExecuting) || (pExynosComponent->currentState == OMX_StatePause)) {
+        /* Todo */
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+
+OMX_ERRORTYPE Exynos_OMX_ResourceManager_Init()
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    FunctionIn();
+    ret = Exynos_OSAL_MutexCreate(&ghVideoRMComponentListMutex);
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ResourceManager_Deinit()
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pCurrComponent;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pNextComponent;
+
+    FunctionIn();
+
+    Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex);
+
+    if (gpVideoDecRMComponentList) {
+        pCurrComponent = gpVideoDecRMComponentList;
+        while (pCurrComponent != NULL) {
+            pNextComponent = pCurrComponent->pNext;
+            Exynos_OSAL_Free(pCurrComponent);
+            pCurrComponent = pNextComponent;
+        }
+        gpVideoDecRMComponentList = NULL;
+    }
+    if (gpVideoDecRMWaitingList) {
+        pCurrComponent = gpVideoDecRMWaitingList;
+        while (pCurrComponent != NULL) {
+            pNextComponent = pCurrComponent->pNext;
+            Exynos_OSAL_Free(pCurrComponent);
+            pCurrComponent = pNextComponent;
+        }
+        gpVideoDecRMWaitingList = NULL;
+    }
+
+    if (gpVideoEncRMComponentList) {
+        pCurrComponent = gpVideoEncRMComponentList;
+        while (pCurrComponent != NULL) {
+            pNextComponent = pCurrComponent->pNext;
+            Exynos_OSAL_Free(pCurrComponent);
+            pCurrComponent = pNextComponent;
+        }
+        gpVideoEncRMComponentList = NULL;
+    }
+    if (gpVideoEncRMWaitingList) {
+        pCurrComponent = gpVideoEncRMWaitingList;
+        while (pCurrComponent != NULL) {
+            pNextComponent = pCurrComponent->pNext;
+            Exynos_OSAL_Free(pCurrComponent);
+            pCurrComponent = pNextComponent;
+        }
+        gpVideoEncRMWaitingList = NULL;
+    }
+
+    Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex);
+
+    Exynos_OSAL_MutexTerminate(ghVideoRMComponentListMutex);
+    ghVideoRMComponentListMutex = NULL;
+
+    ret = OMX_ErrorNone;
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_Get_Resource(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                 ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT     *pExynosComponent = NULL;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pComponentTemp = NULL;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pComponentCandidate = NULL;
+    int numElem = 0;
+    int lowCompDetect = 0;
+
+    FunctionIn();
+
+    Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex);
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC) {
+        pComponentTemp = gpVideoDecRMComponentList;
+        if (pComponentTemp != NULL) {
+            while (pComponentTemp) {
+                numElem++;
+                pComponentTemp = pComponentTemp->pNext;
+            }
+        } else {
+            numElem = 0;
+        }
+        if (numElem >= MAX_RESOURCE_VIDEO_DEC) {
+            lowCompDetect = searchLowPriority(gpVideoDecRMComponentList, pExynosComponent->compPriority.nGroupPriority, &pComponentCandidate);
+            if (lowCompDetect <= 0) {
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            } else {
+                ret = removeComponent(pComponentCandidate->pOMXStandComp);
+                if (ret != OMX_ErrorNone) {
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                } else {
+                    ret = removeElementList(&gpVideoDecRMComponentList, pComponentCandidate->pOMXStandComp);
+                    ret = addElementList(&gpVideoDecRMComponentList, pOMXComponent);
+                    if (ret != OMX_ErrorNone) {
+                        ret = OMX_ErrorInsufficientResources;
+                        goto EXIT;
+                    }
+                }
+            }
+        } else {
+            ret = addElementList(&gpVideoDecRMComponentList, pOMXComponent);
+            if (ret != OMX_ErrorNone) {
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    } else if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC) {
+        pComponentTemp = gpVideoEncRMComponentList;
+        if (pComponentTemp != NULL) {
+            while (pComponentTemp) {
+                numElem++;
+                pComponentTemp = pComponentTemp->pNext;
+            }
+        } else {
+            numElem = 0;
+        }
+        if (numElem >= MAX_RESOURCE_VIDEO_ENC) {
+            lowCompDetect = searchLowPriority(gpVideoEncRMComponentList, pExynosComponent->compPriority.nGroupPriority, &pComponentCandidate);
+            if (lowCompDetect <= 0) {
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            } else {
+                ret = removeComponent(pComponentCandidate->pOMXStandComp);
+                if (ret != OMX_ErrorNone) {
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                } else {
+                    ret = removeElementList(&gpVideoEncRMComponentList, pComponentCandidate->pOMXStandComp);
+                    ret = addElementList(&gpVideoEncRMComponentList, pOMXComponent);
+                    if (ret != OMX_ErrorNone) {
+                        ret = OMX_ErrorInsufficientResources;
+                        goto EXIT;
+                    }
+                }
+            }
+        } else {
+            ret = addElementList(&gpVideoEncRMComponentList, pOMXComponent);
+            if (ret != OMX_ErrorNone) {
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    }
+    ret = OMX_ErrorNone;
+
+EXIT:
+
+    Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex);
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_Release_Resource(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                 ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT     *pExynosComponent = NULL;
+    EXYNOS_OMX_RM_COMPONENT_LIST *pComponentTemp = NULL;
+    OMX_COMPONENTTYPE            *pOMXWaitComponent = NULL;
+    int numElem = 0;
+
+    FunctionIn();
+
+    Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex);
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    
+    if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC) {
+        pComponentTemp = gpVideoDecRMWaitingList;
+        if (gpVideoDecRMComponentList == NULL) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        ret = removeElementList(&gpVideoDecRMComponentList, pOMXComponent);
+        if (ret != OMX_ErrorNone) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+        while (pComponentTemp) {
+            numElem++;
+            pComponentTemp = pComponentTemp->pNext;
+        }
+        if (numElem > 0) {
+            pOMXWaitComponent = gpVideoDecRMWaitingList->pOMXStandComp;
+            removeElementList(&gpVideoDecRMWaitingList, pOMXWaitComponent);
+            ret = OMX_SendCommand(pOMXWaitComponent, OMX_CommandStateSet, OMX_StateIdle, NULL);
+            if (ret != OMX_ErrorNone) {
+                goto EXIT;
+            }
+        }
+    } else if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC) {
+        pComponentTemp = gpVideoEncRMWaitingList;
+        if (gpVideoEncRMComponentList == NULL) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        ret = removeElementList(&gpVideoEncRMComponentList, pOMXComponent);
+        if (ret != OMX_ErrorNone) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+        while (pComponentTemp) {
+            numElem++;
+            pComponentTemp = pComponentTemp->pNext;
+        }
+        if (numElem > 0) {
+            pOMXWaitComponent = gpVideoEncRMWaitingList->pOMXStandComp;
+            removeElementList(&gpVideoEncRMWaitingList, pOMXWaitComponent);
+            ret = OMX_SendCommand(pOMXWaitComponent, OMX_CommandStateSet, OMX_StateIdle, NULL);
+            if (ret != OMX_ErrorNone) {
+                goto EXIT;
+            }
+        }
+    }
+
+EXIT:
+
+    Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex);
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_In_WaitForResource(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex);
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC)
+        ret = addElementList(&gpVideoDecRMWaitingList, pOMXComponent);
+    else if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC)
+        ret = addElementList(&gpVideoEncRMWaitingList, pOMXComponent);
+
+    Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex);
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_Out_WaitForResource(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    Exynos_OSAL_MutexLock(ghVideoRMComponentListMutex);
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC)
+        ret = removeElementList(&gpVideoDecRMWaitingList, pOMXComponent);
+    else if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC)
+        ret = removeElementList(&gpVideoEncRMWaitingList, pOMXComponent);
+
+    Exynos_OSAL_MutexUnlock(ghVideoRMComponentListMutex);
+
+    FunctionOut();
+
+    return ret;
+}
+
diff --git a/component/common/Exynos_OMX_Resourcemanager.h b/component/common/Exynos_OMX_Resourcemanager.h
new file mode 100644 (file)
index 0000000..e9db7c4
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *
+ * 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_Resourcemanager.h
+ * @brief
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *    2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_RESOURCEMANAGER
+#define EXYNOS_OMX_RESOURCEMANAGER
+
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+
+
+struct EXYNOS_OMX_RM_COMPONENT_LIST;
+typedef struct _EXYNOS_OMX_RM_COMPONENT_LIST
+{
+    OMX_COMPONENTTYPE         *pOMXStandComp;
+    OMX_U32                    groupPriority;
+    struct _EXYNOS_OMX_RM_COMPONENT_LIST *pNext;
+} EXYNOS_OMX_RM_COMPONENT_LIST;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_ERRORTYPE Exynos_OMX_ResourceManager_Init();
+OMX_ERRORTYPE Exynos_OMX_ResourceManager_Deinit();
+OMX_ERRORTYPE Exynos_OMX_Get_Resource(OMX_COMPONENTTYPE *pOMXComponent);
+OMX_ERRORTYPE Exynos_OMX_Release_Resource(OMX_COMPONENTTYPE *pOMXComponent);
+OMX_ERRORTYPE Exynos_OMX_In_WaitForResource(OMX_COMPONENTTYPE *pOMXComponent);
+OMX_ERRORTYPE Exynos_OMX_Out_WaitForResource(OMX_COMPONENTTYPE *pOMXComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/video/dec/Android.mk b/component/video/dec/Android.mk
new file mode 100644 (file)
index 0000000..0d79ec4
--- /dev/null
@@ -0,0 +1,27 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_VdecControl.c \
+       Exynos_OMX_Vdec.c
+
+LOCAL_MODULE := libExynosOMX_Vdec
+LOCAL_ARM_MODE := arm
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/video/dec \
+       hardware/samsung_slsi/exynos5/include \
+       hardware/samsung_slsi/exynos5/libcsc \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include
+
+ifeq ($(BOARD_USE_ANB), true)
+LOCAL_STATIC_LIBRARIES := libExynosOMX_OSAL libcsc_helper
+LOCAL_CFLAGS += -DUSE_ANB
+endif
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/component/video/dec/Exynos_OMX_Vdec.c b/component/video/dec/Exynos_OMX_Vdec.c
new file mode 100644 (file)
index 0000000..2f8b72c
--- /dev/null
@@ -0,0 +1,1182 @@
+/*
+ *
+ * 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_Vdec.c
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ *              HyeYeon Chung (hyeon.chung@samsung.com)
+ *              Yunji Kim (yunji.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_Vdec.h"
+#include "Exynos_OMX_VdecControl.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 "csc.h"
+
+#ifdef USE_ANB
+#include "Exynos_OSAL_Android.h"
+#endif
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_VIDEO_DEC"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+
+int calc_plane(int width, int height)
+{
+    int mbX, mbY;
+
+    mbX = (width + 15)/16;
+    mbY = (height + 15)/16;
+
+    /* Alignment for interlaced processing */
+    mbY = (mbY + 1) / 2 * 2;
+
+    return (mbX * 16) * (mbY * 16);
+}
+
+inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    if ((exynosOutputPort->portDefinition.format.video.nFrameWidth !=
+            exynosInputPort->portDefinition.format.video.nFrameWidth) ||
+        (exynosOutputPort->portDefinition.format.video.nFrameHeight !=
+            exynosInputPort->portDefinition.format.video.nFrameHeight)) {
+        OMX_U32 width = 0, height = 0;
+
+        exynosOutputPort->portDefinition.format.video.nFrameWidth =
+            exynosInputPort->portDefinition.format.video.nFrameWidth;
+        exynosOutputPort->portDefinition.format.video.nFrameHeight =
+            exynosInputPort->portDefinition.format.video.nFrameHeight;
+        width = exynosOutputPort->portDefinition.format.video.nStride =
+            exynosInputPort->portDefinition.format.video.nStride;
+        height = exynosOutputPort->portDefinition.format.video.nSliceHeight =
+            exynosInputPort->portDefinition.format.video.nSliceHeight;
+
+        switch(exynosOutputPort->portDefinition.format.video.eColorFormat) {
+        case OMX_COLOR_FormatYUV420Planar:
+        case OMX_COLOR_FormatYUV420SemiPlanar:
+        case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
+            if (width && height)
+                exynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
+            break;
+        case OMX_SEC_COLOR_FormatNV12Tiled:
+            width = exynosOutputPort->portDefinition.format.video.nFrameWidth;
+            height = exynosOutputPort->portDefinition.format.video.nFrameHeight;
+            if (width && height) {
+                int YBufferSize = calc_plane(width, height);
+                int CBufferSize = calc_plane(width, height >> 1);
+                exynosOutputPort->portDefinition.nBufferSize = YBufferSize + CBufferSize;
+            }
+            break;
+        default:
+            if (width && height)
+                exynosOutputPort->portDefinition.nBufferSize = width * height * 2;
+            break;
+        }
+    }
+
+    return;
+}
+
+OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
+{
+    OMX_BOOL ret = OMX_FALSE;
+
+    if ((pExynosComponent->currentState == OMX_StateExecuting) &&
+        (pExynosComponent->pExynosPort[nPortIndex].portState == OMX_StateIdle) &&
+        (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+        (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) {
+        ret = OMX_TRUE;
+    } else {
+        ret = OMX_FALSE;
+    }
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    CODEC_DEC_BUFFER *pInputCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer;
+
+    pData->buffer.singlePlaneBuffer.dataBuffer = pInputCodecBuffer->pVirAddr[0];
+    pData->buffer.singlePlaneBuffer.fd = pInputCodecBuffer->fd[0];
+    pData->allocSize     = pInputCodecBuffer->bufferSize[0];
+    pData->dataLen       = pInputCodecBuffer->dataSize;
+    pData->usedDataLen   = 0;
+    pData->remainDataLen = pInputCodecBuffer->dataSize;
+
+    pData->nFlags        = 0;
+    pData->timeStamp     = 0;
+    pData->pPrivate      = codecBuffer;
+    pData->bufferHeader  = NULL;
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    OMX_PTR pSrcBuf[MAX_BUFFER_PLANE];
+    OMX_U32 allocSize[MAX_BUFFER_PLANE];
+
+    pVideoDec->exynos_codec_getCodecOutputPrivateData(codecBuffer, pSrcBuf, allocSize);
+    pData->buffer.multiPlaneBuffer.dataBuffer[0] = pSrcBuf[0];
+    pData->buffer.multiPlaneBuffer.dataBuffer[1] = pSrcBuf[1];
+    pData->buffer.multiPlaneBuffer.dataBuffer[2] = pSrcBuf[2];
+    pData->allocSize     = allocSize[0] + allocSize[1] + allocSize[2];
+    pData->dataLen       = 0;
+    pData->usedDataLen   = 0;
+    pData->remainDataLen = 0;
+
+    pData->nFlags        = 0;
+    pData->timeStamp     = 0;
+    pData->pPrivate      = codecBuffer;
+    pData->bufferHeader  = NULL;
+
+    return ret;
+}
+
+void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
+{
+    EXYNOS_OMX_BASEPORT *exynosOMXInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *exynosOMXPort = NULL;
+
+    FunctionIn();
+
+    exynosOMXPort = &pExynosComponent->pExynosPort[nPortIndex];
+
+    if (((pExynosComponent->currentState == OMX_StatePause) ||
+        (pExynosComponent->currentState == OMX_StateIdle) ||
+        (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) ||
+        (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) &&
+        (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded) &&
+        (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort))) {
+        Exynos_OSAL_SignalWait(pExynosComponent->pExynosPort[nPortIndex].pauseEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
+    }
+
+    FunctionOut();
+
+    return;
+}
+
+OMX_BOOL Exynos_CSC_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
+{
+    OMX_BOOL                   ret = OMX_FALSE;
+    EXYNOS_OMX_BASECOMPONENT  *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT       *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER     *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
+    OMX_U32                    copySize = 0;
+    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
+
+    FunctionIn();
+
+    OMX_U32 width = 0, height = 0;
+    int imageSize = 0;
+    OMX_COLOR_FORMATTYPE colorFormat;
+
+    void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
+    void *pSrcBuf[MAX_BUFFER_PLANE] = {NULL, };
+    void *pYUVBuf[MAX_BUFFER_PLANE] = {NULL, };
+
+    CSC_ERRORCODE cscRet = CSC_ErrorNone;
+    CSC_METHOD csc_method = CSC_METHOD_SW;
+    unsigned int cacheable = 1;
+
+    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
+
+    width = pBufferInfo->imageWidth;
+    height = pBufferInfo->imageHeight;
+    imageSize = width * height;
+    colorFormat = pBufferInfo->ColorFormat;
+
+    pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0];
+    pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1];
+    pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[2];
+
+    pYUVBuf[0]  = (unsigned char *)pOutputBuf;
+    pYUVBuf[1]  = (unsigned char *)pOutputBuf + imageSize;
+    pYUVBuf[2]  = (unsigned char *)pOutputBuf + imageSize + imageSize / 4;
+
+    csc_get_method(pVideoDec->csc_handle, &csc_method);
+    if (csc_method == CSC_METHOD_HW) {
+        pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.fd[0];
+        pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.fd[1];
+        pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.fd[2];
+    }
+
+#ifdef USE_ANB
+    if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+        ExynosVideoPlane planes[MAX_BUFFER_PLANE];
+        OMX_U32 stride;
+        Exynos_OSAL_LockANB(pOutputBuf, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes);
+        width = stride;
+        outputUseBuffer->dataLen = sizeof(void *);
+
+        if (csc_method == CSC_METHOD_SW) {
+            pYUVBuf[0]  = (unsigned char *)planes[0].addr;
+            pYUVBuf[1]  = (unsigned char *)planes[1].addr;
+            pYUVBuf[2]  = (unsigned char *)planes[2].addr;
+        } else {
+            pYUVBuf[0]  = (unsigned char *)planes[0].fd;
+            pYUVBuf[1]  = (unsigned char *)planes[1].fd;
+            pYUVBuf[2]  = (unsigned char *)planes[2].fd;
+        }
+    }
+#endif
+    if ((exynosOutputPort->bIsANBEnabled == OMX_FALSE) &&
+        (csc_method == CSC_METHOD_HW)) {
+        pYUVBuf[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pOutputBuf);
+        pYUVBuf[1] = NULL;
+        pYUVBuf[2] = NULL;
+    }
+
+    if (pVideoDec->csc_set_format == OMX_FALSE) {
+        csc_set_src_format(
+            pVideoDec->csc_handle,  /* handle */
+            width,            /* width */
+            height,           /* height */
+            0,                /* crop_left */
+            0,                /* crop_right */
+            width,            /* crop_width */
+            height,           /* crop_height */
+            omx_2_hal_pixel_format(colorFormat), /* color_format */
+            cacheable);             /* cacheable */
+        csc_set_dst_format(
+            pVideoDec->csc_handle,  /* handle */
+            width,           /* width */
+            height,           /* height */
+            0,                /* crop_left */
+            0,                /* crop_right */
+            width,           /* crop_width */
+            height,           /* crop_height */
+            omx_2_hal_pixel_format(exynosOutputPort->portDefinition.format.video.eColorFormat), /* color_format */
+            cacheable);             /* cacheable */
+        pVideoDec->csc_set_format = OMX_TRUE;
+    }
+    csc_set_src_buffer(
+        pVideoDec->csc_handle,  /* handle */
+        pSrcBuf);            /* YUV Addr or FD */
+    csc_set_dst_buffer(
+        pVideoDec->csc_handle,  /* handle */
+        pYUVBuf);            /* YUV Addr or FD */
+    cscRet = csc_convert(pVideoDec->csc_handle);
+    if (cscRet != CSC_ErrorNone)
+        ret = OMX_FALSE;
+    else
+        ret = OMX_TRUE;
+
+#ifdef USE_ANB
+    if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+        Exynos_OSAL_UnlockANB(pOutputBuf);
+    }
+#endif
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData)
+{
+    OMX_BOOL               ret = OMX_FALSE;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *inputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
+    OMX_U32                copySize = 0;
+    OMX_BYTE               checkInputStream = NULL;
+    OMX_U32                checkInputStreamLen = 0;
+
+    FunctionIn();
+
+    if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((srcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) ||
+            (srcInputData->pPrivate == NULL)) {
+            ret = OMX_FALSE;
+            goto EXIT;
+        }
+    }
+
+    if (inputUseBuffer->dataValid == OMX_TRUE) {
+        if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
+            Exynos_Shared_BufferToData(inputUseBuffer, srcInputData, ONE_PLANE);
+
+            if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
+                OMX_PTR dataBuffer = NULL;
+
+                dataBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory,
+                                                            srcInputData->buffer.singlePlaneBuffer.dataBuffer);
+                if (dataBuffer == NULL) {
+                    ret = OMX_FALSE;
+                    goto EXIT;
+                }
+
+                srcInputData->buffer.singlePlaneBuffer.dataBuffer = dataBuffer;
+            }
+
+            /* reset dataBuffer */
+            Exynos_ResetDataBuffer(inputUseBuffer);
+        } else if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
+            checkInputStreamLen = inputUseBuffer->remainDataLen;
+
+            pExynosComponent->bUseFlagEOF = OMX_TRUE;
+
+            copySize = checkInputStreamLen;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
+
+            if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) {
+                if (copySize > 0) {
+                    Exynos_OSAL_Memcpy(srcInputData->buffer.singlePlaneBuffer.dataBuffer + srcInputData->dataLen,
+                                       checkInputStream, copySize);
+                }
+
+                inputUseBuffer->dataLen -= copySize;
+                inputUseBuffer->remainDataLen -= copySize;
+                inputUseBuffer->usedDataLen += copySize;
+
+                srcInputData->dataLen += copySize;
+                srcInputData->remainDataLen += copySize;
+
+                srcInputData->timeStamp = inputUseBuffer->timeStamp;
+                srcInputData->nFlags = inputUseBuffer->nFlags;
+                srcInputData->bufferHeader = inputUseBuffer->bufferHeader;
+            } else {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "input codec buffer is smaller than decoded input data size Out Length");
+                pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                        pExynosComponent->callbackData,
+                                                        OMX_EventError, OMX_ErrorUndefined, 0, NULL);
+                ret = OMX_FALSE;
+            }
+
+            Exynos_InputBufferReturn(pOMXComponent);
+        }
+
+        if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE");
+            srcInputData->dataLen = 0;
+            srcInputData->remainDataLen = 0;
+            pExynosComponent->bSaveFlagEOS = OMX_TRUE;
+        }
+
+        if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
+            pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
+            pExynosComponent->checkTimeStamp.startTimeStamp = srcInputData->timeStamp;
+            pExynosComponent->checkTimeStamp.nStartFlags = srcInputData->nFlags;
+            pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
+                            srcInputData->timeStamp, srcInputData->timeStamp / 1E6);
+        }
+
+        ret = OMX_TRUE;
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
+{
+    OMX_BOOL                   ret = OMX_FALSE;
+    EXYNOS_OMX_BASECOMPONENT  *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT       *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER     *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
+    OMX_U32                    copySize = 0;
+    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
+
+    FunctionIn();
+
+    if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if (exynosOutputPort->bIsANBEnabled == OMX_FALSE) {
+            if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone)
+                outputUseBuffer->dataValid = OMX_TRUE;
+        } else {
+            if (Exynos_Shared_DataToANBBuffer(dstOutputData, outputUseBuffer, exynosOutputPort) == OMX_ErrorNone) {
+                outputUseBuffer->dataValid = OMX_TRUE;
+            } else {
+                ret = OMX_FALSE;
+                goto EXIT;
+            }
+        }
+    }
+
+    if (outputUseBuffer->dataValid == OMX_TRUE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out timestamp after seeking %lld us (%.2f secs)",
+            dstOutputData->timeStamp, dstOutputData->timeStamp / 1E6);
+        if ((pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) &&
+            ((dstOutputData->nFlags & OMX_BUFFERFLAG_EOS) != OMX_BUFFERFLAG_EOS)) {
+            if ((pExynosComponent->checkTimeStamp.startTimeStamp == dstOutputData->timeStamp) &&
+                (pExynosComponent->checkTimeStamp.nStartFlags == dstOutputData->nFlags)){
+                pExynosComponent->checkTimeStamp.startTimeStamp = -19761123;
+                pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
+                pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+                pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
+            } else {
+                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "drop frame after seeking", pExynosComponent);
+                if (exynosOutputPort->bufferProcessType == BUFFER_SHARE)
+                    Exynos_OMX_FillThisBuffer(pOMXComponent, outputUseBuffer->bufferHeader);
+                ret = OMX_TRUE;
+                goto EXIT;
+            }
+        } else if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE)) {
+            ret = OMX_TRUE;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "not set check timestame after seeking");
+            goto EXIT;
+        }
+
+        if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            OMX_U32 width = 0, height = 0;
+            int imageSize = 0;
+            void *pOutputBuf = (void *)outputUseBuffer->bufferHeader->pBuffer;
+
+            pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
+
+            width = pBufferInfo->imageWidth;
+            height = pBufferInfo->imageHeight;
+            imageSize = width * height;
+
+            if ((dstOutputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) &&
+                (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
+                copySize = dstOutputData->remainDataLen;
+                Exynos_OSAL_Log(EXYNOS_LOG_TRACE,"copySize: %d", copySize);
+
+                outputUseBuffer->dataLen += copySize;
+                outputUseBuffer->remainDataLen += copySize;
+                outputUseBuffer->nFlags = dstOutputData->nFlags;
+                outputUseBuffer->timeStamp = dstOutputData->timeStamp;
+
+                if (outputUseBuffer->remainDataLen > 0) {
+                    ret = Exynos_CSC_OutputData(pOMXComponent, dstOutputData);
+                } else {
+                    ret = OMX_TRUE;
+                }
+
+                if (ret == OMX_TRUE) {
+                    if ((outputUseBuffer->remainDataLen > 0) ||
+                        ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
+                        (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
+                        Exynos_OutputBufferReturn(pOMXComponent);
+                    }
+                } else {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "csc_convert Error");
+                    pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                            pExynosComponent->callbackData,
+                                                            OMX_EventError, OMX_ErrorUndefined, 0, NULL);
+                    ret = OMX_FALSE;
+                }
+            } else if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) {
+                outputUseBuffer->dataLen = 0;
+                outputUseBuffer->remainDataLen = 0;
+                outputUseBuffer->nFlags = dstOutputData->nFlags;
+                outputUseBuffer->timeStamp = dstOutputData->timeStamp;
+                Exynos_OutputBufferReturn(pOMXComponent);
+            } else {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than decoded data size Out Length");
+                pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                        pExynosComponent->callbackData,
+                                                        OMX_EventError, OMX_ErrorUndefined, 0, NULL);
+                ret = OMX_FALSE;
+            }
+        } else if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+            if ((outputUseBuffer->remainDataLen > 0) ||
+                ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
+                (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
+                Exynos_OutputBufferReturn(pOMXComponent);
+        }
+    } else {
+        ret = OMX_FALSE;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
+    EXYNOS_OMX_DATA          *pSrcInputData = &exynosInputPort->processData;
+    OMX_BOOL               bCheckInputData = OMX_FALSE;
+    OMX_BOOL               bValidCodecData = OMX_FALSE;
+
+    FunctionIn();
+
+    while (!pVideoDec->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+        Exynos_Wait_ProcessPause(pExynosComponent, INPUT_PORT_INDEX);
+
+        while ((Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) &&
+               (!pVideoDec->bExitBufferProcessThread)) {
+            Exynos_OSAL_SleepMillisec(0);
+
+            if ((CHECK_PORT_BEING_FLUSHED(exynosInputPort)) ||
+                ((exynosOutputPort->exceptionFlag == NEED_PORT_DISABLE) && (ret == OMX_ErrorInputDataDecodeYet)))
+                break;
+            if (exynosInputPort->portState != OMX_StateIdle)
+                break;
+
+            Exynos_OSAL_MutexLock(srcInputUseBuffer->bufferMutex);
+            if (ret != OMX_ErrorInputDataDecodeYet) {
+                if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                    OMX_PTR codecBuffer;
+                    if ((pSrcInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) || (pSrcInputData->pPrivate == NULL)) {
+                        Exynos_CodecBufferDeQueue(pExynosComponent, INPUT_PORT_INDEX, &codecBuffer);
+                        if (codecBuffer != NULL) {
+                            Exynos_Input_CodecBufferToData(pExynosComponent, codecBuffer, pSrcInputData);
+                        }
+                        Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+                        break;
+                    }
+                }
+
+                if (srcInputUseBuffer->dataValid == OMX_TRUE) {
+                    bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData);
+                } else {
+                    bCheckInputData = OMX_FALSE;
+                }
+
+                if ((bCheckInputData == OMX_FALSE) &&
+                    (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
+                    ret = Exynos_InputBufferGetQueue(pExynosComponent);
+                    Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+                    break;
+                }
+
+                if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) {
+                    Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+                    break;
+                }
+            }
+
+            ret = pVideoDec->exynos_codec_srcInputProcess(pOMXComponent, pSrcInputData);
+            if (ret != OMX_ErrorInputDataDecodeYet) {
+                Exynos_ResetCodecData(pSrcInputData);
+            }
+            Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+            if (ret == OMX_ErrorCodecInit)
+                pVideoDec->bExitBufferProcessThread = OMX_TRUE;
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *srcOutputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.outputDataBuffer;
+    EXYNOS_OMX_DATA           srcOutputData; 
+
+    FunctionIn();
+
+    while (!pVideoDec->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+
+        while (!pVideoDec->bExitBufferProcessThread) {
+            if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                if (Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX) == OMX_FALSE)
+                    break;
+            }
+            Exynos_OSAL_SleepMillisec(0);
+
+            if (CHECK_PORT_BEING_FLUSHED(exynosInputPort))
+                break;
+
+            Exynos_OSAL_MutexLock(srcOutputUseBuffer->bufferMutex);
+            ret = pVideoDec->exynos_codec_srcOutputProcess(pOMXComponent, &srcOutputData);
+
+            if (ret == OMX_ErrorNone) {
+                if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                    OMX_PTR codecBuffer;
+                    codecBuffer = srcOutputData.pPrivate;
+                    if (codecBuffer != NULL)
+                        Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer);
+                }
+                if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
+                    Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer);
+                    Exynos_InputBufferReturn(pOMXComponent);
+                }
+                Exynos_ResetCodecData(&srcOutputData);
+            }
+            Exynos_OSAL_MutexUnlock(srcOutputUseBuffer->bufferMutex);
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *dstInputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.inputDataBuffer;
+    EXYNOS_OMX_DATA           dstInputData;
+    
+    FunctionIn();
+
+    while (!pVideoDec->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+
+        while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
+               (!pVideoDec->bExitBufferProcessThread)) {
+            Exynos_OSAL_SleepMillisec(0);
+
+            if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) ||
+                (!CHECK_PORT_POPULATED(exynosOutputPort)))
+                break;
+            if (exynosOutputPort->portState != OMX_StateIdle)
+                break;
+
+            Exynos_OSAL_MutexLock(dstInputUseBuffer->bufferMutex);
+            if (ret != OMX_ErrorOutputBufferUseYet) {
+                if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                    OMX_PTR codecBuffer;
+                    ret = Exynos_CodecBufferDeQueue(pExynosComponent, OUTPUT_PORT_INDEX, &codecBuffer);
+                    if (ret != OMX_ErrorNone) {
+                        Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+                        break;
+                    }
+                    Exynos_Output_CodecBufferToData(pExynosComponent, codecBuffer, &dstInputData);
+                }
+
+                if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+                    if ((dstInputUseBuffer->dataValid != OMX_TRUE) &&
+                        (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
+                        ret = Exynos_OutputBufferGetQueue(pExynosComponent);
+                        if (ret != OMX_ErrorNone) {
+                            Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+                            break;
+                        }
+                        if (exynosOutputPort->bIsANBEnabled == OMX_FALSE) {
+                            Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, TWO_PLANE);
+                        } else {
+                            ret = Exynos_Shared_ANBBufferToData(dstInputUseBuffer, &dstInputData, exynosOutputPort, TWO_PLANE);
+                            if (ret != OMX_ErrorNone) {
+                                dstInputUseBuffer->dataValid = OMX_FALSE;
+                                Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+                                break;
+                            }
+                        }
+                        Exynos_ResetDataBuffer(dstInputUseBuffer);
+                    }
+                }
+
+                if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) {
+                    Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+                    break;
+                }
+            }
+
+            ret = pVideoDec->exynos_codec_dstInputProcess(pOMXComponent, &dstInputData);
+            if (ret != OMX_ErrorOutputBufferUseYet) {
+                Exynos_ResetCodecData(&dstInputData);
+            }
+            Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *dstOutputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
+    EXYNOS_OMX_DATA          *pDstOutputData = &exynosOutputPort->processData;
+    
+    FunctionIn();
+
+    while (!pVideoDec->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+        Exynos_Wait_ProcessPause(pExynosComponent, OUTPUT_PORT_INDEX);
+
+        while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
+               (!pVideoDec->bExitBufferProcessThread)) {
+            Exynos_OSAL_SleepMillisec(0);
+
+            if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))
+                break;
+
+            Exynos_OSAL_MutexLock(dstOutputUseBuffer->bufferMutex);
+            if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                if ((dstOutputUseBuffer->dataValid != OMX_TRUE) &&
+                    (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
+                    ret = Exynos_OutputBufferGetQueue(pExynosComponent);
+                    if (ret != OMX_ErrorNone) {
+                        Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
+                        break;
+                    }
+                }
+            }
+
+            if ((dstOutputUseBuffer->dataValid == OMX_TRUE) ||
+                (exynosOutputPort->bufferProcessType == BUFFER_SHARE))
+                ret = pVideoDec->exynos_codec_dstOutputProcess(pOMXComponent, pDstOutputData);
+
+            if (((ret == OMX_ErrorNone) && (dstOutputUseBuffer->dataValid == OMX_TRUE)) ||
+                (exynosOutputPort->bufferProcessType == BUFFER_SHARE)) {
+                Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
+            }
+
+            if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                OMX_PTR codecBuffer;
+                codecBuffer = pDstOutputData->pPrivate;
+                if (codecBuffer != NULL) {
+                    Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer);
+                    pDstOutputData->pPrivate = NULL;
+                }
+            }
+
+            /* reset outputData */
+            Exynos_ResetCodecData(pDstOutputData);
+            Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_SrcInputBufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_SrcOutputBufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_DstInputProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_DstInputBufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_DstOutputBufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    FunctionIn();
+
+    pVideoDec->bExitBufferProcessThread = OMX_FALSE;
+
+    ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstOutputThread,
+                 Exynos_OMX_DstOutputProcessThread,
+                 pOMXComponent);
+    if (ret == OMX_ErrorNone)
+        ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcOutputThread,
+                     Exynos_OMX_SrcOutputProcessThread,
+                     pOMXComponent);
+    if (ret == OMX_ErrorNone)
+        ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hDstInputThread,
+                     Exynos_OMX_DstInputProcessThread,
+                     pOMXComponent);
+    if (ret == OMX_ErrorNone)
+        ret = Exynos_OSAL_ThreadCreate(&pVideoDec->hSrcInputThread,
+                     Exynos_OMX_SrcInputProcessThread,
+                     pOMXComponent);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    OMX_S32                countValue = 0;
+    unsigned int           i = 0;
+
+    FunctionIn();
+
+    pVideoDec->bExitBufferProcessThread = OMX_TRUE;
+
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID, &countValue);
+    if (countValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID);
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID, &countValue);
+    if (countValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID);
+    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcInputThread);
+    pVideoDec->hSrcInputThread = NULL;
+
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID, &countValue);
+    if (countValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID);
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID, &countValue);
+    if (countValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID);
+    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pVideoDec->hDstInputThread);
+    pVideoDec->hDstInputThread = NULL;
+
+    pVideoDec->exynos_codec_stop(pOMXComponent, INPUT_PORT_INDEX);
+    pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
+    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pVideoDec->hSrcOutputThread);
+    pVideoDec->hSrcOutputThread = NULL;
+
+    pVideoDec->exynos_codec_stop(pOMXComponent, OUTPUT_PORT_INDEX);
+    pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
+    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pVideoDec->hDstOutputThread);
+    pVideoDec->hDstOutputThread = NULL;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = 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) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    ret = Exynos_OMX_Port_Constructor(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    pVideoDec = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT));
+    if (pVideoDec == NULL) {
+        Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Memset(pVideoDec, 0, sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT));
+    pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoDec;
+
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+    pExynosComponent->bMultiThreadProcess = OMX_TRUE;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_INPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_INPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferSize = 0;
+    pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
+
+    pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+
+    pExynosPort->portDefinition.format.video.nFrameWidth = 0;
+    pExynosPort->portDefinition.format.video.nFrameHeight= 0;
+    pExynosPort->portDefinition.format.video.nStride = 0;
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.format.video.nBitrate = 64000;
+    pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
+
+    pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+
+    pExynosPort->portDefinition.format.video.nFrameWidth = 0;
+    pExynosPort->portDefinition.format.video.nFrameHeight= 0;
+    pExynosPort->portDefinition.format.video.nStride = 0;
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.format.video.nBitrate = 64000;
+    pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
+
+    pExynosPort->processData.extInfo = (OMX_PTR)Exynos_OSAL_Malloc(sizeof(DECODE_CODEC_EXTRA_BUFFERINFO));
+
+    pOMXComponent->UseBuffer              = &Exynos_OMX_UseBuffer;
+    pOMXComponent->AllocateBuffer         = &Exynos_OMX_AllocateBuffer;
+    pOMXComponent->FreeBuffer             = &Exynos_OMX_FreeBuffer;
+    pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest;
+
+    pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer;
+    pExynosComponent->exynos_FreeTunnelBuffer     = &Exynos_OMX_FreeTunnelBuffer;
+    pExynosComponent->exynos_BufferProcessCreate    = &Exynos_OMX_BufferProcess_Create;
+    pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate;
+    pExynosComponent->exynos_BufferFlush          = &Exynos_OMX_BufferFlush;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    int                    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_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_Free(pVideoDec);
+    pExynosComponent->hComponentHandle = pVideoDec = NULL;
+
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    if (pExynosPort->processData.extInfo != NULL) {
+        Exynos_OSAL_Free(pExynosPort->processData.extInfo);
+        pExynosPort->processData.extInfo = NULL;
+    }
+
+    for(i = 0; i < ALL_PORT_NUM; i++) {
+        pExynosPort = &pExynosComponent->pExynosPort[i];
+        Exynos_OSAL_Free(pExynosPort->portDefinition.format.video.cMIMEType);
+        pExynosPort->portDefinition.format.video.cMIMEType = NULL;
+    }
+
+    ret = Exynos_OMX_Port_Destructor(pOMXComponent);
+
+    ret = Exynos_OMX_BaseComponent_Destructor(hComponent);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/video/dec/Exynos_OMX_Vdec.h b/component/video/dec/Exynos_OMX_Vdec.h
new file mode 100644 (file)
index 0000000..664c899
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ *
+ * 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_Vdec.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ *              HyeYeon Chung (hyeon.chung@samsung.com)
+ *              Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_VIDEO_DECODE
+#define EXYNOS_OMX_VIDEO_DECODE
+
+#include "OMX_Component.h"
+#include "Exynos_OMX_Def.h"
+#include "Exynos_OSAL_Queue.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Basecomponent.h"
+#include "ExynosVideoApi.h"
+
+#define MAX_VIDEO_INPUTBUFFER_NUM           5
+#define MAX_VIDEO_OUTPUTBUFFER_NUM          2
+
+#define DEFAULT_FRAME_WIDTH                 176
+#define DEFAULT_FRAME_HEIGHT                144
+
+#define DEFAULT_VIDEO_INPUT_BUFFER_SIZE    (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT) * 2
+#define DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE   (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT * 3) / 2
+
+#define MFC_INPUT_BUFFER_NUM_MAX            3
+#define DEFAULT_MFC_INPUT_BUFFER_SIZE       1920 * 1080 * 3 / 2
+
+#define MFC_OUTPUT_BUFFER_NUM_MAX           16 * 2
+#define DEFAULT_MFC_OUTPUT_YBUFFER_SIZE     1920 * 1080
+#define DEFAULT_MFC_OUTPUT_CBUFFER_SIZE     1920 * 1080 / 2
+
+#define INPUT_PORT_SUPPORTFORMAT_NUM_MAX    1
+#define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX   4
+
+#define EXTRA_DPB_NUM                       5
+
+#define MFC_INPUT_BUFFER_PLANE              1
+#define MFC_OUTPUT_BUFFER_PLANE             2
+
+typedef struct
+{
+    void *pAddrY;
+    void *pAddrC;
+} CODEC_DEC_ADDR_INFO;
+
+typedef struct _CODEC_DEC_BUFFER
+{
+    void *pVirAddr[MAX_BUFFER_PLANE];   /* virtual address   */
+    int   bufferSize[MAX_BUFFER_PLANE]; /* buffer alloc size */
+    int   fd[MAX_BUFFER_PLANE];         /* buffer FD */
+    int   dataSize;                     /* total data length */
+} CODEC_DEC_BUFFER;
+
+typedef struct _DECODE_CODEC_EXTRA_BUFFERINFO
+{
+    /* For Decode Output */
+    OMX_U32 imageWidth;
+    OMX_U32 imageHeight;
+    OMX_COLOR_FORMATTYPE ColorFormat;
+} DECODE_CODEC_EXTRA_BUFFERINFO;
+
+typedef struct _EXYNOS_OMX_VIDEODEC_COMPONENT
+{
+    OMX_HANDLETYPE hCodecHandle;
+    OMX_BOOL bThumbnailMode;
+    OMX_BOOL bFirstFrame;
+    CODEC_DEC_BUFFER *pMFCDecInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
+    CODEC_DEC_BUFFER *pMFCDecOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
+
+    /* Buffer Process */
+    OMX_BOOL       bExitBufferProcessThread;
+    OMX_HANDLETYPE hSrcInputThread;
+    OMX_HANDLETYPE hSrcOutputThread;
+    OMX_HANDLETYPE hDstInputThread;
+    OMX_HANDLETYPE hDstOutputThread;
+
+    /* Shared Memory Handle */
+    OMX_HANDLETYPE hSharedMemory;
+
+    /* For DRM Play */
+    OMX_BOOL bDRMPlayerMode;
+
+    /* CSC handle */
+    OMX_PTR csc_handle;
+    OMX_U32 csc_set_format;
+
+    OMX_ERRORTYPE (*exynos_codec_srcInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
+    OMX_ERRORTYPE (*exynos_codec_srcOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
+    OMX_ERRORTYPE (*exynos_codec_dstInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
+    OMX_ERRORTYPE (*exynos_codec_dstOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
+
+    OMX_ERRORTYPE (*exynos_codec_start)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
+    OMX_ERRORTYPE (*exynos_codec_stop)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
+    OMX_ERRORTYPE (*exynos_codec_bufferProcessRun)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
+    OMX_ERRORTYPE (*exynos_codec_enqueueAllBuffer)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
+
+    int (*exynos_checkInputFrame) (OMX_U8 *pInputStream, OMX_U32 buffSize, OMX_U32 flag,
+                                   OMX_BOOL bPreviousFrameEOF, OMX_BOOL *pbEndOfFrame);
+    OMX_ERRORTYPE (*exynos_codec_getCodecInputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr, OMX_U32 *size);
+    OMX_ERRORTYPE (*exynos_codec_getCodecOutputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[]);
+} EXYNOS_OMX_VIDEODEC_COMPONENT;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int calc_plane(int width, int height);
+inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent);
+OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex);
+OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
+OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
+
+OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/component/video/dec/Exynos_OMX_VdecControl.c b/component/video/dec/Exynos_OMX_VdecControl.c
new file mode 100644 (file)
index 0000000..432a4a7
--- /dev/null
@@ -0,0 +1,1583 @@
+/*
+ *
+ * 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_VdecControl.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_Vdec.h"
+#include "Exynos_OMX_VdecControl.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"
+#include "Exynos_OSAL_Queue.h"
+#include "csc.h"
+
+#ifdef USE_ANB
+#include "Exynos_OSAL_Android.h"
+#endif
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_VIDEO_DECCONTROL"
+#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_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
+    OMX_U8                *temp_buffer = NULL;
+    int                    temp_buffer_fd = -1;
+    OMX_U32                i = 0;
+    MEMORY_TYPE            mem_type;
+
+    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_VIDEODEC_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 ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && (nPortIndex == INPUT_PORT_INDEX)) {
+        mem_type = SECURE_MEMORY;
+    } else if (pExynosPort->bufferProcessType == BUFFER_SHARE) {
+        mem_type = NORMAL_MEMORY;
+    } else {
+        mem_type = SYSTEM_MEMORY;
+    }
+    temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nSizeBytes, mem_type);
+    if (temp_buffer == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    temp_buffer_fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, temp_buffer);
+
+    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
+    if (temp_bufferHeader == NULL) {
+        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, temp_buffer);
+        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->extendBufferHeader[i].buf_fd[0] = temp_buffer_fd;
+            pExynosPort->bufferStateAllocate[i] = (BUFFER_STATE_ALLOCATED | HEADER_STATE_ALLOCATED);
+            INIT_SET_SIZE_VERSION(temp_bufferHeader, OMX_BUFFERHEADERTYPE);
+            if (mem_type == SECURE_MEMORY)
+                temp_bufferHeader->pBuffer = temp_buffer_fd;
+            else
+                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);
+    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, 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_VIDEODEC_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_VIDEODEC_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*/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 ((pVideoDec->bDRMPlayerMode == OMX_TRUE) && (nPortIndex == INPUT_PORT_INDEX)) {
+                        OMX_PTR mapBuffer = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory, (int)pExynosPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, mapBuffer);
+                    } else {
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, 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_VIDEODEC_COMPONENT *pVideoDec = 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;
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_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);
+
+    pVideoDec->exynos_codec_bufferProcessRun(pOMXComponent, nPortIndex);
+    Exynos_OSAL_MutexLock(flushPortBuffer[0]->bufferMutex);
+    pVideoDec->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)
+        pVideoDec->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", 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_ErrorUndefined;
+    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) {
+                Exynos_OSAL_Free(message);
+                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_ErrorUndefined;
+    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) {
+                Exynos_OSAL_Free(message);
+                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_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    OMX_BUFFERHEADERTYPE  *retBuffer = NULL;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_MESSAGE    *message = NULL;
+
+    FunctionIn();
+
+    if (pExynosComponent->currentState != OMX_StateExecuting) {
+        retBuffer = NULL;
+        goto EXIT;
+    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
+        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+
+        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+        if (message == NULL) {
+            retBuffer = NULL;
+            goto EXIT;
+        }
+        if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+            Exynos_OSAL_Free(message);
+            retBuffer = NULL;
+            goto EXIT;
+        }
+
+        retBuffer  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+        Exynos_OSAL_Free(message);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return retBuffer;
+}
+
+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_VideoDecodeGetParameter(
+    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; /* supportFormatNum = N-1 */
+
+        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) {
+            supportFormatNum = INPUT_PORT_SUPPORTFORMAT_NUM_MAX - 1;
+            if (index > supportFormatNum) {
+                ret = OMX_ErrorNoMore;
+                goto EXIT;
+            }
+
+            pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+            portDefinition = &pExynosPort->portDefinition;
+
+            portFormat->eCompressionFormat = portDefinition->format.video.eCompressionFormat;
+            portFormat->eColorFormat       = portDefinition->format.video.eColorFormat;
+            portFormat->xFramerate           = portDefinition->format.video.xFramerate;
+        } else if (portIndex == OUTPUT_PORT_INDEX) {
+            pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_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_FormatNV12TPhysicalAddress;
+                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
+                break;
+            case supportFormat_3:
+                portFormat->eCompressionFormat = OMX_VIDEO_CodingUnused;
+                portFormat->eColorFormat       = OMX_SEC_COLOR_FormatNV12Tiled;
+                portFormat->xFramerate         = portDefinition->format.video.xFramerate;
+                break;
+            default:
+                if (index > supportFormat_0) {
+                    ret = OMX_ErrorNoMore;
+                    goto EXIT;
+                }
+                break;
+            }
+        }
+        ret = OMX_ErrorNone;
+    }
+        break;
+#ifdef USE_ANB
+    case OMX_IndexParamGetAndroidNativeBuffer:
+    {
+        ret = Exynos_OSAL_GetANBParameter(hComponent, nParamIndex, ComponentParameterStructure);
+    }
+        break;
+    case OMX_IndexParamPortDefinition:
+    {
+        OMX_PARAM_PORTDEFINITIONTYPE *portDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
+        OMX_U32                       portIndex = portDefinition->nPortIndex;
+        EXYNOS_OMX_BASEPORT             *pExynosPort;
+
+        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        /* at this point, GetParameter has done all the verification, we
+         * just dereference things directly here
+         */
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+        if (pExynosPort->bIsANBEnabled == OMX_TRUE) {
+            portDefinition->format.video.eColorFormat =
+                (OMX_COLOR_FORMATTYPE)Exynos_OSAL_OMX2HalPixelFormat(portDefinition->format.video.eColorFormat);
+        }
+    }
+        break;
+#endif
+    default:
+    {
+        ret = Exynos_OMX_GetParameter(hComponent, nParamIndex, ComponentParameterStructure);
+    }
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetParameter(
+    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_IndexParamPortDefinition:
+    {
+        OMX_PARAM_PORTDEFINITIONTYPE *pPortDefinition = (OMX_PARAM_PORTDEFINITIONTYPE *)ComponentParameterStructure;
+        OMX_U32                       portIndex = pPortDefinition->nPortIndex;
+        EXYNOS_OMX_BASEPORT             *pExynosPort;
+        OMX_U32 width, height, size;
+        OMX_U32 realWidth, realHeight;
+
+        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);
+
+#ifdef USE_ANB // Modified by Google engineer
+        /* should not affect the format since in ANB case, the caller
+                * is providing us a HAL format */
+        if (pExynosPort->bIsANBEnabled == OMX_TRUE) {
+            pExynosPort->portDefinition.format.video.eColorFormat =
+                Exynos_OSAL_Hal2OMXPixelFormat(pExynosPort->portDefinition.format.video.eColorFormat);
+        }
+#endif
+
+        realWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
+        realHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
+        width = ((realWidth + 15) & (~15));
+        height = ((realHeight + 15) & (~15));
+        size = (width * height * 3) / 2;
+        pExynosPort->portDefinition.format.video.nStride = width;
+        pExynosPort->portDefinition.format.video.nSliceHeight = height;
+        pExynosPort->portDefinition.nBufferSize = (size > pExynosPort->portDefinition.nBufferSize) ? size : pExynosPort->portDefinition.nBufferSize;
+
+        if (portIndex == INPUT_PORT_INDEX) {
+            EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+            pExynosOutputPort->portDefinition.format.video.nFrameWidth = pExynosPort->portDefinition.format.video.nFrameWidth;
+            pExynosOutputPort->portDefinition.format.video.nFrameHeight = pExynosPort->portDefinition.format.video.nFrameHeight;
+            pExynosOutputPort->portDefinition.format.video.nStride = width;
+            pExynosOutputPort->portDefinition.format.video.nSliceHeight = height;
+
+            switch (pExynosOutputPort->portDefinition.format.video.eColorFormat) {
+            case OMX_COLOR_FormatYUV420Planar:
+            case OMX_COLOR_FormatYUV420SemiPlanar:
+            case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
+                pExynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
+                break;
+            case OMX_SEC_COLOR_FormatNV12Tiled:
+                pExynosOutputPort->portDefinition.nBufferSize =
+                    calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
+                    calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
+                break;
+            default:
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Color format is not support!! use default YUV size!!");
+                ret = OMX_ErrorUnsupportedSetting;
+                break;
+            }
+
+            if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+                pExynosOutputPort->portDefinition.nBufferSize =
+                    calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight) +
+                    calc_plane(pExynosPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight >> 1);
+            }
+        }
+    }
+        break;
+#ifdef USE_ANB
+    case OMX_IndexParamEnableAndroidBuffers:
+    case OMX_IndexParamUseAndroidNativeBuffer:
+    {
+        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_VideoDecodeGetConfig(
+    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) {
+        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 (pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    default:
+        ret = Exynos_OMX_GetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetConfig(
+    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) {
+        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 (pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    case OMX_IndexVendorThumbnailMode:
+    {
+        EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+        pVideoDec->bThumbnailMode = *((OMX_BOOL *)pComponentConfigStructure);
+
+        ret = OMX_ErrorNone;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_SetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetExtensionIndex(
+    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_ANB
+    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_ANB) == 0)
+        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamEnableAndroidBuffers;
+    else if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_GET_ANB) == 0)
+        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamGetAndroidNativeBuffer;
+    else if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_USE_ANB) == 0)
+        *pIndexType = (OMX_INDEXTYPE) OMX_IndexParamUseAndroidNativeBuffer;
+    else
+        ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
+#else
+    ret = Exynos_OMX_GetExtensionIndex(hComponent, cParameterName, pIndexType);
+#endif
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+#ifdef USE_ANB
+OMX_ERRORTYPE Exynos_Shared_ANBBufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_PLANE nPlane)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    OMX_U32 width, height;
+//    void *pPhys[MAX_BUFFER_PLANE];
+    ExynosVideoPlane planes[MAX_BUFFER_PLANE];
+
+    memset(planes, 0, sizeof(planes));
+
+    if (pExynosPort->bIsANBEnabled == OMX_TRUE) {
+        OMX_U32 stride;
+
+        width = pExynosPort->portDefinition.format.video.nFrameWidth;
+        height = pExynosPort->portDefinition.format.video.nFrameHeight;
+        if ((pUseBuffer->bufferHeader != NULL) && (pUseBuffer->bufferHeader->pBuffer != NULL)) {
+            Exynos_OSAL_LockANB(pUseBuffer->bufferHeader->pBuffer, width, height, pExynosPort->portDefinition.format.video.eColorFormat, &stride, planes);
+            pUseBuffer->dataLen = sizeof(void *);
+        } else {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+    } else {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    if (nPlane == TWO_PLANE) {
+        /* Case of Shared Buffer, Only support two PlaneBuffer */
+        pData->buffer.multiPlaneBuffer.dataBuffer[0] = planes[0].addr;
+        pData->buffer.multiPlaneBuffer.fd[0] = planes[0].fd;
+        pData->buffer.multiPlaneBuffer.dataBuffer[1] = planes[1].addr;
+        pData->buffer.multiPlaneBuffer.fd[1] = planes[1].fd;
+    } else {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not support plane");
+        ret = OMX_ErrorNotImplemented;
+        goto EXIT;
+    }
+
+    pData->allocSize     = pUseBuffer->allocSize;
+    pData->dataLen       = pUseBuffer->dataLen;
+    pData->usedDataLen   = pUseBuffer->usedDataLen;
+    pData->remainDataLen = pUseBuffer->remainDataLen;
+    pData->timeStamp     = pUseBuffer->timeStamp;
+    pData->nFlags        = pUseBuffer->nFlags;
+    pData->pPrivate      = pUseBuffer->pPrivate;
+    pData->bufferHeader  = pUseBuffer->bufferHeader;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Shared_DataToANBBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_BASEPORT *pExynosPort)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    pUseBuffer->bufferHeader          = pData->bufferHeader;
+    pUseBuffer->allocSize             = pData->allocSize;
+    pUseBuffer->dataLen               = pData->dataLen;
+    pUseBuffer->usedDataLen           = pData->usedDataLen;
+    pUseBuffer->remainDataLen         = pData->remainDataLen;
+    pUseBuffer->timeStamp             = pData->timeStamp;
+    pUseBuffer->nFlags                = pData->nFlags;
+    pUseBuffer->pPrivate              = pData->pPrivate;
+
+    if ((pUseBuffer->bufferHeader == NULL) ||
+        (pUseBuffer->bufferHeader->pBuffer == NULL)) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    if (pExynosPort->bIsANBEnabled == OMX_TRUE) {
+        Exynos_OSAL_UnlockANB(pUseBuffer->bufferHeader->pBuffer);
+    } else {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+EXIT:
+    return ret;
+}
+#endif
diff --git a/component/video/dec/Exynos_OMX_VdecControl.h b/component/video/dec/Exynos_OMX_VdecControl.h
new file mode 100644 (file)
index 0000000..23011fa
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ *
+ * 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_VdecControl.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_VIDEO_DECODECONTROL
+#define EXYNOS_OMX_VIDEO_DECODECONTROL
+
+#include "OMX_Component.h"
+#include "Exynos_OMX_Def.h"
+#include "Exynos_OSAL_Queue.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Basecomponent.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+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 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 Exynos_OMX_FreeBuffer(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_U32        nPortIndex,
+    OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr);
+OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(
+    EXYNOS_OMX_BASEPORT *pOMXBasePort,
+    OMX_U32           nPortIndex);
+OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(
+    EXYNOS_OMX_BASEPORT *pOMXBasePort,
+    OMX_U32           nPortIndex);
+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 Exynos_OMX_VideoDecodeGetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR     ComponentParameterStructure);
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        ComponentParameterStructure);
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetConfig(
+    OMX_HANDLETYPE hComponent,
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure);
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeSetConfig(
+    OMX_HANDLETYPE hComponent,
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure);
+OMX_ERRORTYPE Exynos_OMX_VideoDecodeGetExtensionIndex(
+    OMX_IN OMX_HANDLETYPE  hComponent,
+    OMX_IN OMX_STRING      cParameterName,
+    OMX_OUT OMX_INDEXTYPE *pIndexType);
+OMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent);
+OMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent);
+OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent);
+OMX_ERRORTYPE Exynos_FlushInputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer);
+OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer);
+
+#ifdef USE_ANB
+OMX_ERRORTYPE Exynos_Shared_ANBBufferToData(EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_DATA *pData, EXYNOS_OMX_BASEPORT *pExynosPort, EXYNOS_OMX_PLANE nPlane);
+OMX_ERRORTYPE Exynos_Shared_DataToANBBuffer(EXYNOS_OMX_DATA *pData, EXYNOS_OMX_DATABUFFER *pUseBuffer, EXYNOS_OMX_BASEPORT *pExynosPort);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/component/video/dec/h264/Android.mk b/component/video/dec/h264/Android.mk
new file mode 100644 (file)
index 0000000..5f8957d
--- /dev/null
@@ -0,0 +1,49 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_H264dec.c \
+       library_register.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libOMX.Exynos.AVC.Decoder
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/omx
+
+LOCAL_CFLAGS :=
+
+ifeq ($(BOARD_NONBLOCK_MODE_PROCESS), true)
+LOCAL_CFLAGS += -DNONBLOCK_MODE_PROCESS
+endif
+
+ifeq ($(BOARD_USE_ANB), true)
+LOCAL_CFLAGS += -DUSE_ANB
+endif
+
+ifeq ($(BOARD_USE_S3D_SUPPORT), true)
+LOCAL_CFLAGS += -DS3D_SUPPORT
+endif
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_Vdec libExynosOMX_OSAL libExynosOMX_Basecomponent \
+       libswconverter libExynosVideoApi
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libui \
+       libExynosOMX_Resourcemanager libcsc libexynosv4l2 libion_exynos libexynosgscaler
+
+ifeq ($(BOARD_USES_MFC_FPS),true)
+LOCAL_CFLAGS += -DCONFIG_MFC_FPS
+endif
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/video/dec \
+       hardware/samsung_slsi/exynos5/include \
+       hardware/samsung_slsi/exynos5/libcsc \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/component/video/dec/h264/Exynos_OMX_H264dec.c b/component/video/dec/h264/Exynos_OMX_H264dec.c
new file mode 100644 (file)
index 0000000..495fcae
--- /dev/null
@@ -0,0 +1,2268 @@
+/*
+ *
+ * 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_H264dec.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_OMX_Basecomponent.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Vdec.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Thread.h"
+#include "library_register.h"
+#include "Exynos_OMX_H264dec.h"
+#include "ExynosVideoApi.h"
+#include "Exynos_OSAL_SharedMemory.h"
+#include "Exynos_OSAL_Event.h"
+
+#ifdef USE_ANB
+#include "Exynos_OSAL_Android.h"
+#endif
+
+/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
+/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
+#include "csc.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_H264_DEC"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+#define H264_DEC_NUM_OF_EXTRA_BUFFERS 7
+
+//#define ADD_SPS_PPS_I_FRAME
+//#define FULL_FRAME_SEARCH
+
+/* H.264 Decoder Supported Levels & profiles */
+EXYNOS_OMX_VIDEO_PROFILELEVEL supportedAVCProfileLevels[] ={
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel42},
+
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1b},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel11},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel12},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel13},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel2},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel21},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel22},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel3},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel31},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel32},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel4},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel41},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel42},
+
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1b},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel11},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel12},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel13},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel2},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel21},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel22},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel3},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel31},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel32},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel4},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel41},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel42}};
+
+static OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+static OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    ExynosVideoBuffer  *pCodecBuffer;
+
+    if (codecBuffer == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
+
+    if (addr != NULL) {
+        addr[0] = pCodecBuffer->planes[0].addr;
+        addr[1] = pCodecBuffer->planes[1].addr;
+        addr[2] = pCodecBuffer->planes[2].addr;
+    }
+
+    if (size != NULL) {
+        size[0] = pCodecBuffer->planes[0].allocSize;
+        size[1] = pCodecBuffer->planes[1].allocSize;
+        size[2] = pCodecBuffer->planes[2].allocSize;
+    }
+
+EXIT:
+    return ret;
+}
+
+int Check_H264_Frame(
+    OMX_U8   *pInputStream,
+    OMX_U32   buffSize,
+    OMX_U32   flag,
+    OMX_BOOL  bPreviousFrameEOF,
+    OMX_BOOL *pbEndOfFrame)
+{
+    OMX_U32  preFourByte       = (OMX_U32)-1;
+    int      accessUnitSize    = 0;
+    int      frameTypeBoundary = 0;
+    int      nextNaluSize      = 0;
+    int      naluStart         = 0;
+
+    if (bPreviousFrameEOF == OMX_TRUE)
+        naluStart = 0;
+    else
+        naluStart = 1;
+
+    while (1) {
+        int inputOneByte = 0;
+
+        if (accessUnitSize == (int)buffSize)
+            goto EXIT;
+
+        inputOneByte = *(pInputStream++);
+        accessUnitSize += 1;
+
+        if (preFourByte == 0x00000001 || (preFourByte << 8) == 0x00000100) {
+            int naluType = inputOneByte & 0x1F;
+
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NaluType : %d", naluType);
+            if (naluStart == 0) {
+#ifdef ADD_SPS_PPS_I_FRAME
+                if (naluType == 1 || naluType == 5)
+#else
+                if (naluType == 1 || naluType == 5 || naluType == 7 || naluType == 8)
+#endif
+                    naluStart = 1;
+            } else {
+#ifdef OLD_DETECT
+                frameTypeBoundary = (8 - naluType) & (naluType - 10); //AUD(9)
+#else
+                if (naluType == 9)
+                    frameTypeBoundary = -2;
+#endif
+                if (naluType == 1 || naluType == 5) {
+                    if (accessUnitSize == (int)buffSize) {
+                        accessUnitSize--;
+                        goto EXIT;
+                    }
+                    inputOneByte = *pInputStream++;
+                    accessUnitSize += 1;
+
+                    if (inputOneByte >= 0x80)
+                        frameTypeBoundary = -1;
+                }
+                if (frameTypeBoundary < 0) {
+                    break;
+                }
+            }
+
+        }
+        preFourByte = (preFourByte << 8) + inputOneByte;
+    }
+
+    *pbEndOfFrame = OMX_TRUE;
+    nextNaluSize = -5;
+    if (frameTypeBoundary == -1)
+        nextNaluSize = -6;
+    if (preFourByte != 0x00000001)
+        nextNaluSize++;
+    return (accessUnitSize + nextNaluSize);
+
+EXIT:
+    *pbEndOfFrame = OMX_FALSE;
+
+    return accessUnitSize;
+}
+
+static OMX_BOOL Check_H264_StartCode(
+    OMX_U8 *pInputStream,
+    OMX_U32 streamSize)
+{
+    if (streamSize < 4) {
+        return OMX_FALSE;
+    }
+
+    if ((pInputStream[0] == 0x00) &&
+        (pInputStream[1] == 0x00) &&
+        (pInputStream[2] == 0x00) &&
+        (pInputStream[3] != 0x00) &&
+        ((pInputStream[3] >> 3) == 0x00)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NaluType : %d, 0x%x, 0x%x, 0x%x", (pInputStream[4] & 0x1F), pInputStream[3], pInputStream[4], pInputStream[5]);
+        return OMX_TRUE;
+    } else if ((pInputStream[0] == 0x00) &&
+               (pInputStream[1] == 0x00) &&
+               (pInputStream[2] != 0x00) &&
+               ((pInputStream[2] >> 3) == 0x00)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NaluType : %d, 0x%x, 0x%x, 0x%x", (pInputStream[3] & 0x1F), pInputStream[2], pInputStream[3], pInputStream[4]);
+        return OMX_TRUE;
+    } else {
+        return OMX_FALSE;
+    }
+}
+
+OMX_ERRORTYPE H264CodecOpen(EXYNOS_H264DEC_HANDLE *pH264Dec)
+{
+    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pH264Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    /* alloc ops structure */
+    pDecOps    = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
+    pInbufOps  = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
+    pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
+
+    if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pH264Dec->hMFCH264Handle.pDecOps    = pDecOps;
+    pH264Dec->hMFCH264Handle.pInbufOps  = pInbufOps;
+    pH264Dec->hMFCH264Handle.pOutbufOps = pOutbufOps;
+
+    /* function pointer mapping */
+    pDecOps->nSize    = sizeof(ExynosVideoDecOps);
+    pInbufOps->nSize  = sizeof(ExynosVideoDecBufferOps);
+    pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
+
+    Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
+
+    /* check mandatory functions for decoder ops */
+    if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
+        (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
+        (pDecOps->Get_FrameTag == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* check mandatory functions for buffer ops */
+    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
+        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
+        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
+        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
+        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* alloc context, open, querycap */
+    pH264Dec->hMFCH264Handle.hMFCHandle = pH264Dec->hMFCH264Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
+    if (pH264Dec->hMFCH264Handle.hMFCHandle == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pDecOps != NULL) {
+            Exynos_OSAL_Free(pDecOps);
+            pH264Dec->hMFCH264Handle.pDecOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pH264Dec->hMFCH264Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pH264Dec->hMFCH264Handle.pOutbufOps = NULL;
+        }
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecClose(EXYNOS_H264DEC_HANDLE *pH264Dec)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pH264Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+
+    if (hMFCHandle != NULL) {
+        pDecOps->Finalize(hMFCHandle);
+        pH264Dec->hMFCH264Handle.hMFCHandle = NULL;
+    }
+    if (pOutbufOps != NULL) {
+        Exynos_OSAL_Free(pOutbufOps);
+        pH264Dec->hMFCH264Handle.pOutbufOps = NULL;
+    }
+    if (pInbufOps != NULL) {
+        Exynos_OSAL_Free(pInbufOps);
+        pH264Dec->hMFCH264Handle.pInbufOps = NULL;
+    }
+    if (pDecOps != NULL) {
+        Exynos_OSAL_Free(pDecOps);
+        pH264Dec->hMFCH264Handle.pDecOps = NULL;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_H264DEC_HANDLE   *pH264Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pH264Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX)
+        pInbufOps->Run(hMFCHandle);
+    else if (nPortIndex == OUTPUT_PORT_INDEX)
+        pOutbufOps->Run(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_H264DEC_HANDLE   *pH264Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pH264Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+
+    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
+        pInbufOps->Stop(hMFCHandle);
+    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
+        pOutbufOps->Stop(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_H264DEC_HANDLE   *pH264Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pH264Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX) {
+        if (pH264Dec->bSourceStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pH264Dec->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    if (nPortIndex == OUTPUT_PORT_INDEX) {
+        if (pH264Dec->bDestinationStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pH264Dec->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    int i, nOutbufs;
+
+    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+
+    FunctionIn();
+
+    if ((nPortIndex == INPUT_PORT_INDEX) &&
+        (pH264Dec->bSourceStart == OMX_TRUE)) {
+        Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
+
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
+
+            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
+        }
+
+        pInbufOps->Clear_Queue(hMFCHandle);
+    } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
+               (pH264Dec->bDestinationStart == OMX_TRUE)) {
+        OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+        ExynosVideoBuffer *pBuffer = NULL;
+
+        Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
+
+        nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
+        nOutbufs += EXTRA_DPB_NUM;
+        for (i = 0; i < nOutbufs; i++) {
+            pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
+            Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
+        }
+        pOutbufOps->Clear_Queue(hMFCHandle);
+    } else {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
+
+    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+    ExynosVideoGeometry      bufferConf;
+    OMX_U32                  inputBufferNumber = 0;
+    int i;
+
+    FunctionIn();
+
+    if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
+
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if (pVideoDec->bThumbnailMode == OMX_TRUE)
+        pDecOps->Set_DisplayDelay(hMFCHandle, 0);
+
+    /* input buffer info */
+    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
+    bufferConf.eCompressionFormat = VIDEO_CODING_AVC;
+    pInbufOps->Set_Shareable(hMFCHandle);
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
+                                * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
+        inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
+    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
+    }
+
+    /* should be done before prepare input buffer */
+    if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* set input buffer geometry */
+    if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* setup input buffer */
+    if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register input buffer */
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            ExynosVideoPlane plane;
+            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
+            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
+            plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
+            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /* Register input buffer */
+        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
+            ExynosVideoPlane plane;
+            if (pVideoDec->bDRMPlayerMode == OMX_FALSE) {
+                plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
+            } else {
+                plane.addr = Exynos_OSAL_SharedMemory_IONToVirt(pVideoDec->hSharedMemory,
+                                               pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+            }
+            plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
+            plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
+            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    }
+
+    /* set output geometry */
+    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
+    pH264Dec->hMFCH264Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
+    if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* input buffer enqueue for header parsing */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
+    if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
+                        (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
+//        ret = OMX_ErrorInsufficientResources;
+        ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
+        goto EXIT;
+    }
+
+    /* start header parsing */
+    if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
+        ret = OMX_ErrorCodecInit;
+        goto EXIT;
+    }
+
+    /* get geometry for output */
+    Exynos_OSAL_Memset(&pH264Dec->hMFCH264Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
+    if (pOutbufOps->Get_Geometry(hMFCHandle, &pH264Dec->hMFCH264Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* get dpb count */
+    pH264Dec->hMFCH264Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
+    if (pVideoDec->bThumbnailMode == OMX_FALSE)
+        pH264Dec->hMFCH264Handle.maxDPBNum += EXTRA_DPB_NUM;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "H264CodecSetup nOutbufs: %d", pH264Dec->hMFCH264Handle.maxDPBNum);
+
+    pH264Dec->hMFCH264Handle.bConfiguredMFCSrc = OMX_TRUE;
+
+    pExynosOutputPort->cropRectangle.nTop = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nTop;
+    pExynosOutputPort->cropRectangle.nLeft = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nLeft;
+    pExynosOutputPort->cropRectangle.nWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nWidth;
+    pExynosOutputPort->cropRectangle.nHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nHeight;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth) ||
+            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight)) {
+            pExynosInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth;
+            pExynosInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight;
+            pExynosInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
+            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
+
+            Exynos_UpdateFrameSize(pOMXComponent);
+            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
+
+            /** Send Port Settings changed call back **/
+            (*(pExynosComponent->pCallbacks->EventHandler))
+                (pOMXComponent,
+                 pExynosComponent->callbackData,
+                 OMX_EventPortSettingsChanged, /* The command was completed */
+                 OMX_DirOutput, /* This is the port index */
+                 0,
+                 NULL);
+        }
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth) ||
+            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight) ||
+            (pExynosOutputPort->portDefinition.nBufferCountActual != pH264Dec->hMFCH264Handle.maxDPBNum)) {
+            pExynosInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth;
+            pExynosInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight;
+            pExynosInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
+            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
+
+            pExynosOutputPort->portDefinition.nBufferCountActual = pH264Dec->hMFCH264Handle.maxDPBNum - 2;
+            pExynosOutputPort->portDefinition.nBufferCountMin = pH264Dec->hMFCH264Handle.maxDPBNum - 2;
+
+            Exynos_UpdateFrameSize(pOMXComponent);
+            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
+
+            /** Send Port Settings changed call back **/
+            (*(pExynosComponent->pCallbacks->EventHandler))
+                (pOMXComponent,
+                 pExynosComponent->callbackData,
+                 OMX_EventPortSettingsChanged, /* The command was completed */
+                 OMX_DirOutput, /* This is the port index */
+                 0,
+                 NULL);
+        }
+    }
+    if ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nWidth) ||
+        (pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nHeight)) {
+        /* Check Crop */
+        pExynosInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth;
+        pExynosInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight;
+        pExynosInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
+        pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
+        Exynos_UpdateFrameSize(pOMXComponent);
+
+        /** Send crop info call back **/
+        (*(pExynosComponent->pCallbacks->EventHandler))
+            (pOMXComponent,
+             pExynosComponent->callbackData,
+             OMX_EventPortSettingsChanged, /* The command was completed */
+             OMX_DirOutput, /* This is the port index */
+             OMX_IndexConfigCommonOutputCrop,
+             NULL);
+    }
+
+    Exynos_OSAL_SleepMillisec(0);
+    ret = OMX_ErrorInputDataDecodeYet;
+    H264CodecStop(pOMXComponent, INPUT_PORT_INDEX);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+
+    int i, nOutbufs;
+
+    FunctionIn();
+
+    /* get dpb count */
+    nOutbufs = pH264Dec->hMFCH264Handle.maxDPBNum;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* should be done before prepare output buffer */
+        if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    pOutbufOps->Set_Shareable(hMFCHandle);
+    if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
+    OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+    int plane;
+
+    nAllocLen[0] = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth,
+                        pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight);
+    nAllocLen[1] = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth,
+                        pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight >> 1);
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        MEMORY_TYPE memoryType;
+        if (pVideoDec->bDRMPlayerMode == OMX_TRUE)
+            memoryType = SECURE_MEMORY;
+        else
+            memoryType = NORMAL_MEMORY;
+
+        /* Register output buffer */
+        for (i = 0; i < nOutbufs; i++) {
+            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
+
+            for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
+                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], memoryType);
+                if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
+                    Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
+                                                       pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
+
+                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
+                planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
+                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
+            }
+
+            if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
+                            (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+        }
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /* Register output buffer */
+        /*************/
+        /*    TBD    */
+        /*************/
+#ifdef USE_ANB
+        if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+            for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
+                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                    planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
+                    planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
+                    planes[plane].allocSize = nAllocLen[plane];
+                }
+
+                if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
+                               (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+            }
+        } else {
+            ret = OMX_ErrorNotImplemented;
+            goto EXIT;
+        }
+#else
+        ret = OMX_ErrorNotImplemented;
+        goto EXIT;
+#endif
+    }
+
+    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        H264CodecStop(pOMXComponent, OUTPUT_PORT_INDEX);
+    }
+    pH264Dec->hMFCH264Handle.bConfiguredMFCDst = OMX_TRUE;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_GetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR     pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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 (nParamIndex) {
+    case OMX_IndexParamVideoAvc:
+    {
+        OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = NULL;
+        EXYNOS_H264DEC_HANDLE      *pH264Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstAVCComponent->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcAVCComponent = &pH264Dec->AVCComponent[pDstAVCComponent->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstAVCComponent, pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H264_DEC_ROLE);
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelQuerySupported:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure;
+        EXYNOS_OMX_VIDEO_PROFILELEVEL *pProfileLevel = NULL;
+        OMX_U32 maxProfileLevelNum = 0;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pProfileLevel = supportedAVCProfileLevels;
+        maxProfileLevelNum = sizeof(supportedAVCProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
+
+        if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
+            ret = OMX_ErrorNoMore;
+            goto EXIT;
+        }
+
+        pProfileLevel += pDstProfileLevel->nProfileIndex;
+        pDstProfileLevel->eProfile = pProfileLevel->profile;
+        pDstProfileLevel->eLevel = pProfileLevel->level;
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelCurrent:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = NULL;
+        EXYNOS_H264DEC_HANDLE      *pH264Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcAVCComponent = &pH264Dec->AVCComponent[pDstProfileLevel->nPortIndex];
+
+        pDstProfileLevel->eProfile = pSrcAVCComponent->eProfile;
+        pDstProfileLevel->eLevel = pSrcAVCComponent->eLevel;
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
+        EXYNOS_H264DEC_HANDLE      *pH264Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcErrorCorrectionType = &pH264Dec->errorCorrectionType[INPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_SetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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_IndexParamVideoAvc:
+    {
+        OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = NULL;
+        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure;
+        EXYNOS_H264DEC_HANDLE   *pH264Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcAVCComponent->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstAVCComponent = &pH264Dec->AVCComponent[pSrcAVCComponent->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstAVCComponent, pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+
+        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H264_DEC_ROLE)) {
+            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+        } else {
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelCurrent:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_AVCTYPE          *pDstAVCComponent = NULL;
+        EXYNOS_H264DEC_HANDLE            *pH264Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+
+        if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+
+        pDstAVCComponent = &pH264Dec->AVCComponent[pSrcProfileLevel->nPortIndex];
+        pDstAVCComponent->eProfile = pSrcProfileLevel->eProfile;
+        pDstAVCComponent->eLevel = pSrcProfileLevel->eLevel;
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
+        EXYNOS_H264DEC_HANDLE               *pH264Dec = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstErrorCorrectionType = &pH264Dec->errorCorrectionType[INPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_GetConfig(
+    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) {
+        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 (pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    case OMX_IndexConfigCommonOutputCrop:
+    {
+        EXYNOS_H264DEC_HANDLE  *pH264Dec = NULL;
+        OMX_CONFIG_RECTTYPE    *pSrcRectType = NULL;
+        OMX_CONFIG_RECTTYPE    *pDstRectType = NULL;
+        pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+
+        if (pH264Dec->hMFCH264Handle.bConfiguredMFCSrc == OMX_FALSE) {
+            ret = OMX_ErrorNotReady;
+            break;
+        }
+
+        pDstRectType = (OMX_CONFIG_RECTTYPE *)pComponentConfigStructure;
+
+        if ((pDstRectType->nPortIndex != INPUT_PORT_INDEX) &&
+            (pDstRectType->nPortIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[pDstRectType->nPortIndex];
+
+        pSrcRectType = &(pExynosPort->cropRectangle);
+
+        pDstRectType->nTop = pSrcRectType->nTop;
+        pDstRectType->nLeft = pSrcRectType->nLeft;
+        pDstRectType->nHeight = pSrcRectType->nHeight;
+        pDstRectType->nWidth = pSrcRectType->nWidth;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_SetConfig(
+    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) {
+        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 (pComponentConfigStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pExynosComponent->currentState == OMX_StateInvalid) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    default:
+        ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_GetExtensionIndex(
+    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;
+    }
+
+    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
+        EXYNOS_H264DEC_HANDLE *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        *pIndexType = OMX_IndexVendorThumbnailMode;
+        ret = OMX_ErrorNone;
+    } else {
+        ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_ComponentRoleEnum(
+    OMX_HANDLETYPE hComponent,
+    OMX_U8        *cRole,
+    OMX_U32        nIndex)
+{
+    OMX_ERRORTYPE             ret               = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent     = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent  = NULL;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (cRole == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
+        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H264_DEC_ROLE);
+        ret = OMX_ErrorNone;
+    } else {
+        ret = OMX_ErrorNoMore;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Init */
+OMX_ERRORTYPE Exynos_H264Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_H264DEC_HANDLE         *pH264Dec          = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
+    OMX_PTR                        hMFCHandle        = pH264Dec->hMFCH264Handle.hMFCHandle;
+
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    CSC_METHOD csc_method = CSC_METHOD_SW;
+    int i, plane;
+
+    FunctionIn();
+
+    pH264Dec->hMFCH264Handle.bConfiguredMFCSrc = OMX_FALSE;
+    pH264Dec->hMFCH264Handle.bConfiguredMFCDst = OMX_FALSE;
+    pExynosComponent->bUseFlagEOF = OMX_TRUE;
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+
+    /* H.264 Codec Open */
+    ret = H264CodecOpen(pH264Dec);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
+        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
+
+            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                /* Use ION Allocator */
+                pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
+                pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+                pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+                pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+                if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+            }
+
+            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
+        }
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
+        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    pH264Dec->bSourceStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pH264Dec->hSourceStartEvent);
+    pH264Dec->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pH264Dec->hDestinationStartEvent);
+
+    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
+    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
+    pH264Dec->hMFCH264Handle.indexTimestamp = 0;
+    pH264Dec->hMFCH264Handle.outputIndexTimestamp = 0;
+
+    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+
+#if 0//defined(USE_CSC_GSCALER)
+    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
+#endif
+    if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
+        pVideoDec->csc_handle = csc_init(CSC_METHOD_HW);
+        csc_set_hw_property(pVideoDec->csc_handle, CSC_HW_PROPERTY_FIXED_NODE, 2);
+        csc_set_hw_property(pVideoDec->csc_handle, CSC_HW_PROPERTY_MODE_DRM, pVideoDec->bDRMPlayerMode);
+    } else {
+        pVideoDec->csc_handle = csc_init(csc_method);
+    }
+
+    if (pVideoDec->csc_handle == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    pVideoDec->csc_set_format = OMX_FALSE;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Terminate */
+OMX_ERRORTYPE Exynos_H264Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_H264DEC_HANDLE         *pH264Dec          = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    OMX_PTR                        hMFCHandle        = pH264Dec->hMFCH264Handle.hMFCHandle;
+
+    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+
+    int i, plane;
+
+    FunctionIn();
+
+    if (pVideoDec->csc_handle != NULL) {
+        csc_deinit(pVideoDec->csc_handle);
+        pVideoDec->csc_handle = NULL;
+    }
+
+    Exynos_OSAL_SignalTerminate(pH264Dec->hDestinationStartEvent);
+    pH264Dec->hDestinationStartEvent = NULL;
+    pH264Dec->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalTerminate(pH264Dec->hSourceStartEvent);
+    pH264Dec->hSourceStartEvent = NULL;
+    pH264Dec->bSourceStart = OMX_FALSE;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
+                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                    if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+                }
+
+                Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
+                pVideoDec->pMFCDecOutputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
+                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                    if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+                }
+                Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
+                pVideoDec->pMFCDecInputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+    H264CodecClose(pH264Dec);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE               ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
+    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+    int i;
+
+    FunctionIn();
+
+    if (pH264Dec->hMFCH264Handle.bConfiguredMFCSrc == OMX_FALSE) {
+        ret = H264CodecSrcSetup(pOMXComponent, pSrcInputData);
+        goto EXIT;
+    }
+    if (pH264Dec->hMFCH264Handle.bConfiguredMFCDst == OMX_FALSE) {
+        ret = H264CodecDstSetup(pOMXComponent);
+    }
+
+    if (((pVideoDec->bDRMPlayerMode == OMX_TRUE) ||
+            (Check_H264_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE)) ||
+        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        pExynosComponent->timeStamp[pH264Dec->hMFCH264Handle.indexTimestamp] = pSrcInputData->timeStamp;
+        pExynosComponent->nFlags[pH264Dec->hMFCH264Handle.indexTimestamp] = pSrcInputData->nFlags;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pH264Dec->hMFCH264Handle.indexTimestamp, pSrcInputData->nFlags);
+        pDecOps->Set_FrameTag(hMFCHandle, pH264Dec->hMFCH264Handle.indexTimestamp);
+        pH264Dec->hMFCH264Handle.indexTimestamp++;
+        pH264Dec->hMFCH264Handle.indexTimestamp %= MAX_TIMESTAMP;
+
+        /* queue work for input buffer */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
+                                    (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        if (codecReturn != VIDEO_ERROR_NONE) {
+            ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+            goto EXIT;
+        }
+        H264CodecStart(pOMXComponent, INPUT_PORT_INDEX);
+        if (pH264Dec->bSourceStart == OMX_FALSE) {
+            pH264Dec->bSourceStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pH264Dec->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+        if (pH264Dec->bDestinationStart == OMX_FALSE) {
+            pH264Dec->bDestinationStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pH264Dec->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+
+    FunctionIn();
+
+    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+
+    pSrcOutputData->dataLen       = 0;
+    pSrcOutputData->usedDataLen   = 0;
+    pSrcOutputData->remainDataLen = 0;
+    pSrcOutputData->nFlags    = 0;
+    pSrcOutputData->timeStamp = 0;
+
+    if (pVideoBuffer == NULL) {
+        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
+        pSrcOutputData->allocSize  = 0;
+        pSrcOutputData->pPrivate = NULL;
+        pSrcOutputData->bufferHeader = NULL;
+    } else {
+        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
+        pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
+        pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
+
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            int i = 0;
+            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
+                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
+                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+                    goto EXIT;
+                }
+                i++;
+            }
+            pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+            pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
+        }
+
+        /* For Share Buffer */
+        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+
+    FunctionIn();
+
+    if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
+                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
+                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
+
+    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
+                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
+
+    if (codecReturn != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+        ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+        goto EXIT;
+    }
+    H264CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
+    void                          *hMFCHandle = pH264Dec->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pH264Dec->hMFCH264Handle.pDecOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
+    ExynosVideoGeometry *bufferGeometry;
+    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
+    OMX_S32 indexTimestamp = 0;
+    int plane;
+
+    FunctionIn();
+
+    if (pH264Dec->bDestinationStart == OMX_FALSE) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    while (1) {
+        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+        displayStatus = pVideoBuffer->displayStatus;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
+
+        if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
+            (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
+            (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
+            (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            if (pVideoBuffer != NULL) {
+                ret = OMX_ErrorNone;
+                break;
+            } else {
+                ret = OMX_ErrorUndefined;
+                break;
+            }
+        }
+    }
+
+    if (ret != OMX_ErrorNone)
+        goto EXIT;
+
+    pH264Dec->hMFCH264Handle.outputIndexTimestamp++;
+    pH264Dec->hMFCH264Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
+
+    pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
+    for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+        pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
+        pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
+        pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
+        pDstOutputData->dataLen +=  pVideoBuffer->planes[plane].dataSize;
+    }
+    pDstOutputData->usedDataLen = 0;
+    pDstOutputData->pPrivate = pVideoBuffer;
+    /* For Share Buffer */
+    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
+
+    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
+    bufferGeometry = &pH264Dec->hMFCH264Handle.codecOutbufConf;
+    pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
+    pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
+    switch (bufferGeometry->eColorFormat) {
+    case VIDEO_COLORFORMAT_NV12:
+        pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+        break;
+    case VIDEO_COLORFORMAT_NV12_TILED:
+    default:
+        pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
+        break;
+    }
+
+    indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
+    if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
+        if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
+            (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pH264Dec->hMFCH264Handle.outputIndexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[pH264Dec->hMFCH264Handle.outputIndexTimestamp];
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
+        } else {
+            pDstOutputData->timeStamp = 0x00;
+            pDstOutputData->nFlags = 0x00;
+        }
+    } else {
+        /* For timestamp correction. if mfc support frametype detect */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
+#ifdef NEED_TIMESTAMP_REORDER
+        if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
+            pH264Dec->hMFCH264Handle.outputIndexTimestamp = indexTimestamp;
+        } else {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pH264Dec->hMFCH264Handle.outputIndexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[pH264Dec->hMFCH264Handle.outputIndexTimestamp];
+        }
+#else
+        pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
+        pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
+#endif
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
+    }
+
+    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
+        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
+        pDstOutputData->remainDataLen = 0;
+    } else {
+        pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_H264DEC_HANDLE    *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    ret = Exynos_H264Dec_SrcIn(pOMXComponent, pSrcInputData);
+    if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_H264DEC_HANDLE    *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+    }
+    if ((pH264Dec->bSourceStart == OMX_FALSE) &&
+       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
+        Exynos_OSAL_SignalWait(pH264Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pH264Dec->hSourceStartEvent);
+    }
+
+    ret = Exynos_H264Dec_SrcOut(pOMXComponent, pSrcOutputData);
+    if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_H264DEC_HANDLE    *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if ((pH264Dec->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pH264Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pH264Dec->hDestinationStartEvent);
+        }
+    }
+    if (pH264Dec->hMFCH264Handle.bConfiguredMFCDst == OMX_TRUE) {
+        ret = Exynos_H264Dec_DstIn(pOMXComponent, pDstInputData);
+        if (ret != OMX_ErrorNone) {
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                    pExynosComponent->callbackData,
+                                                    OMX_EventError, ret, 0, NULL);
+        }
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_H264DEC_HANDLE    *pH264Dec = (EXYNOS_H264DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((pH264Dec->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pH264Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pH264Dec->hDestinationStartEvent);
+        }
+    }
+    ret = Exynos_H264Dec_DstOut(pOMXComponent, pDstOutputData);
+    if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec        = NULL;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec         = NULL;
+    OMX_BOOL                       bDRMPlayerMode   = OMX_FALSE;
+    int i = 0;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (componentName == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H264_DEC, componentName) == 0) {
+        bDRMPlayerMode = OMX_FALSE;
+    } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H264_DRM_DEC, componentName) == 0) {
+        bDRMPlayerMode = OMX_TRUE;
+    } else {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
+        goto EXIT;
+    }
+
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
+
+    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
+    if (pExynosComponent->componentName == NULL) {
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
+
+    pH264Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_H264DEC_HANDLE));
+    if (pH264Dec == NULL) {
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pH264Dec, 0, sizeof(EXYNOS_H264DEC_HANDLE));
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pH264Dec;
+
+    if (bDRMPlayerMode == OMX_TRUE)
+        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H264_DRM_DEC);
+    else
+        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H264_DEC);
+
+    pVideoDec->bDRMPlayerMode = bDRMPlayerMode;
+
+    /* Set componentVersion */
+    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
+    /* Set specVersion */
+    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/avc");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_SHARE;
+    if (bDRMPlayerMode == OMX_TRUE)
+        pExynosPort->bufferProcessType = BUFFER_SHARE;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    for(i = 0; i < ALL_PORT_NUM; i++) {
+        INIT_SET_SIZE_VERSION(&pH264Dec->AVCComponent[i], OMX_VIDEO_PARAM_AVCTYPE);
+        pH264Dec->AVCComponent[i].nPortIndex = i;
+        pH264Dec->AVCComponent[i].eProfile   = OMX_VIDEO_AVCProfileBaseline;
+        pH264Dec->AVCComponent[i].eLevel     = OMX_VIDEO_AVCLevel4;
+    }
+
+    pOMXComponent->GetParameter      = &Exynos_H264Dec_GetParameter;
+    pOMXComponent->SetParameter      = &Exynos_H264Dec_SetParameter;
+    pOMXComponent->GetConfig         = &Exynos_H264Dec_GetConfig;
+    pOMXComponent->SetConfig         = &Exynos_H264Dec_SetConfig;
+    pOMXComponent->GetExtensionIndex = &Exynos_H264Dec_GetExtensionIndex;
+    pOMXComponent->ComponentRoleEnum = &Exynos_H264Dec_ComponentRoleEnum;
+    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
+
+    pExynosComponent->exynos_codec_componentInit      = &Exynos_H264Dec_Init;
+    pExynosComponent->exynos_codec_componentTerminate = &Exynos_H264Dec_Terminate;
+
+    pVideoDec->exynos_codec_srcInputProcess  = &Exynos_H264Dec_srcInputBufferProcess;
+    pVideoDec->exynos_codec_srcOutputProcess = &Exynos_H264Dec_srcOutputBufferProcess;
+    pVideoDec->exynos_codec_dstInputProcess  = &Exynos_H264Dec_dstInputBufferProcess;
+    pVideoDec->exynos_codec_dstOutputProcess = &Exynos_H264Dec_dstOutputBufferProcess;
+
+    pVideoDec->exynos_codec_start            = &H264CodecStart;
+    pVideoDec->exynos_codec_stop             = &H264CodecStop;
+    pVideoDec->exynos_codec_bufferProcessRun = &H264CodecOutputBufferProcessRun;
+    pVideoDec->exynos_codec_enqueueAllBuffer = &H264CodecEnQueueAllBuffer;
+
+    pVideoDec->exynos_checkInputFrame                 = &Check_H264_Frame;
+    pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
+    pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
+
+    pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
+    if (pVideoDec->hSharedMemory == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        Exynos_OSAL_Free(pH264Dec);
+        pH264Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pExynosComponent->currentState = OMX_StateLoaded;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec        = NULL;
+    EXYNOS_H264DEC_HANDLE         *pH264Dec         = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
+
+    Exynos_OSAL_Free(pExynosComponent->componentName);
+    pExynosComponent->componentName = NULL;
+
+    pH264Dec = (EXYNOS_H264DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pH264Dec != NULL) {
+        Exynos_OSAL_Free(pH264Dec);
+        pH264Dec = pVideoDec->hCodecHandle = NULL;
+    }
+
+    ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/video/dec/h264/Exynos_OMX_H264dec.h b/component/video/dec/h264/Exynos_OMX_H264dec.h
new file mode 100644 (file)
index 0000000..c2c1dbc
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ *
+ * 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_H264dec.h
+ * @brief
+ * @author    SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_H264_DEC_COMPONENT
+#define EXYNOS_OMX_H264_DEC_COMPONENT
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "OMX_Video.h"
+#include "ExynosVideoApi.h"
+
+typedef struct _EXYNOS_MFC_H264DEC_HANDLE
+{
+    OMX_HANDLETYPE             hMFCHandle;
+    OMX_U32                    indexTimestamp;
+    OMX_U32                    outputIndexTimestamp;
+    OMX_BOOL                   bConfiguredMFCSrc;
+    OMX_BOOL                   bConfiguredMFCDst;
+    OMX_U32                    maxDPBNum;
+
+    ExynosVideoColorFormatType MFCOutputColorType;
+    ExynosVideoDecOps         *pDecOps;
+    ExynosVideoDecBufferOps   *pInbufOps;
+    ExynosVideoDecBufferOps   *pOutbufOps;
+    ExynosVideoGeometry        codecOutbufConf;
+} EXYNOS_MFC_H264DEC_HANDLE;
+
+typedef struct _EXYNOS_H264DEC_HANDLE
+{
+    /* OMX Codec specific */
+    OMX_VIDEO_PARAM_AVCTYPE AVCComponent[ALL_PORT_NUM];
+    OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType[ALL_PORT_NUM];
+
+    /* EXYNOS MFC Codec specific */
+    EXYNOS_MFC_H264DEC_HANDLE hMFCH264Handle;
+
+    OMX_BOOL bSourceStart;
+    OMX_BOOL bDestinationStart;
+    OMX_HANDLETYPE hSourceStartEvent;
+    OMX_HANDLETYPE hDestinationStartEvent;
+} EXYNOS_H264DEC_HANDLE;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName);
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/video/dec/h264/library_register.c b/component/video/dec/h264/library_register.c
new file mode 100644 (file)
index 0000000..7fe26e8
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *
+ * 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    library_register.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 <dlfcn.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_ETC.h"
+#include "library_register.h"
+#include "Exynos_OSAL_Log.h"
+
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(ExynosRegisterComponentType **exynosComponents)
+{
+    FunctionIn();
+
+    if (exynosComponents == NULL)
+        goto EXIT;
+
+    /* component 1 - video decoder H.264 */
+    Exynos_OSAL_Strcpy(exynosComponents[0]->componentName, EXYNOS_OMX_COMPONENT_H264_DEC);
+    Exynos_OSAL_Strcpy(exynosComponents[0]->roles[0], EXYNOS_OMX_COMPONENT_H264_DEC_ROLE);
+    exynosComponents[0]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+    /* component 2 - video decoder H.264 for DRM */
+    Exynos_OSAL_Strcpy(exynosComponents[1]->componentName, EXYNOS_OMX_COMPONENT_H264_DRM_DEC);
+    Exynos_OSAL_Strcpy(exynosComponents[1]->roles[0], EXYNOS_OMX_COMPONENT_H264_DEC_ROLE);
+    exynosComponents[1]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+EXIT:
+    FunctionOut();
+
+    return MAX_COMPONENT_NUM;
+}
diff --git a/component/video/dec/h264/library_register.h b/component/video/dec/h264/library_register.h
new file mode 100644 (file)
index 0000000..2886068
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ *
+ * 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        library_register.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_H264_REG
+#define EXYNOS_OMX_H264_REG
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "Exynos_OMX_Component_Register.h"
+
+
+#define OSCL_EXPORT_REF __attribute__((visibility("default")))
+#define MAX_COMPONENT_NUM       2
+#define MAX_COMPONENT_ROLE_NUM  1
+
+/* H.264 */
+#define EXYNOS_OMX_COMPONENT_H264_DEC "OMX.Exynos.AVC.Decoder"
+#define EXYNOS_OMX_COMPONENT_H264_DRM_DEC "OMX.Exynos.AVC.Decoder.secure"
+#define EXYNOS_OMX_COMPONENT_H264_DEC_ROLE "video_decoder.avc"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(ExynosRegisterComponentType **exynosComponents);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
+
diff --git a/component/video/dec/mpeg4/Android.mk b/component/video/dec/mpeg4/Android.mk
new file mode 100644 (file)
index 0000000..26876ee
--- /dev/null
@@ -0,0 +1,45 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_Mpeg4dec.c \
+       library_register.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libOMX.Exynos.MPEG4.Decoder
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/omx
+
+LOCAL_CFLAGS :=
+
+ifeq ($(BOARD_NONBLOCK_MODE_PROCESS), true)
+LOCAL_CFLAGS += -DNONBLOCK_MODE_PROCESS
+endif
+
+ifeq ($(BOARD_USE_ANB), true)
+LOCAL_CFLAGS += -DUSE_ANB
+endif
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_Vdec libExynosOMX_OSAL libExynosOMX_Basecomponent \
+       libswconverter libExynosVideoApi
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libui \
+       libExynosOMX_Resourcemanager libcsc libexynosv4l2 libion_exynos libexynosgscaler
+
+ifeq ($(BOARD_USES_MFC_FPS),true)
+LOCAL_CFLAGS += -DCONFIG_MFC_FPS
+endif
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/video/dec \
+       hardware/samsung_slsi/exynos5/include \
+       hardware/samsung_slsi/exynos5/libcsc \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c b/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c
new file mode 100644 (file)
index 0000000..761b1d2
--- /dev/null
@@ -0,0 +1,2415 @@
+/*
+ *
+ * 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_Mpeg4dec.c
+ * @brief
+ * @author    Yunji Kim (yunji.kim@samsung.com)
+ * @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_OMX_Basecomponent.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Vdec.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Thread.h"
+#include "library_register.h"
+#include "Exynos_OMX_Mpeg4dec.h"
+#include "ExynosVideoApi.h"
+#include "Exynos_OSAL_SharedMemory.h"
+#include "Exynos_OSAL_Event.h"
+
+#ifdef USE_ANB
+#include "Exynos_OSAL_Android.h"
+#endif
+
+/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
+/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
+#include "csc.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_MPEG4_DEC"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+#define MPEG4_DEC_NUM_OF_EXTRA_BUFFERS 7
+
+//#define FULL_FRAME_SEARCH
+
+/* MPEG4 Decoder Supported Levels & profiles */
+EXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels[] ={
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4a},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}};
+
+/* H.263 Decoder Supported Levels & profiles */
+EXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels[] = {
+    /* Baseline (Profile 0) */
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70},
+    /* Profile 1 */
+    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level10},
+    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level20},
+    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level30},
+    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level40},
+    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level45},
+    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level50},
+    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level60},
+    {OMX_VIDEO_H263ProfileH320Coding, OMX_VIDEO_H263Level70},
+    /* Profile 2 */
+    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level10},
+    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level20},
+    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level30},
+    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level40},
+    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level45},
+    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level50},
+    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level60},
+    {OMX_VIDEO_H263ProfileBackwardCompatible, OMX_VIDEO_H263Level70},
+    /* Profile 3, restricted up to SD resolution */
+    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level10},
+    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level20},
+    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level30},
+    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level40},
+    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level45},
+    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level50},
+    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level60},
+    {OMX_VIDEO_H263ProfileISWV2, OMX_VIDEO_H263Level70}};
+
+
+static OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+static OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    ExynosVideoBuffer  *pCodecBuffer;
+
+    if (codecBuffer == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
+
+    if (addr != NULL) {
+        addr[0] = pCodecBuffer->planes[0].addr;
+        addr[1] = pCodecBuffer->planes[1].addr;
+        addr[2] = pCodecBuffer->planes[2].addr;
+    }
+
+    if (size != NULL) {
+        size[0] = pCodecBuffer->planes[0].allocSize;
+        size[1] = pCodecBuffer->planes[1].allocSize;
+        size[2] = pCodecBuffer->planes[2].allocSize;
+    }
+
+EXIT:
+    return ret;
+}
+
+static OMX_BOOL gbFIMV1 = OMX_FALSE;
+
+static int Check_Mpeg4_Frame(
+    OMX_U8   *pInputStream,
+    OMX_U32   buffSize,
+    OMX_U32   flag,
+    OMX_BOOL  bPreviousFrameEOF,
+    OMX_BOOL *pbEndOfFrame)
+{
+    OMX_U32  len;
+    int      readStream;
+    unsigned startCode;
+    OMX_BOOL bFrameStart;
+
+    len = 0;
+    bFrameStart = OMX_FALSE;
+
+    if (flag & OMX_BUFFERFLAG_CODECCONFIG) {
+        if (*pInputStream == 0x03) { /* FIMV1 */
+            BitmapInfoHhr *pInfoHeader;
+
+            pInfoHeader = (BitmapInfoHhr *)(pInputStream + 1);
+            /* FIXME */
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "############## NOT SUPPORTED #################");
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "width(%d), height(%d)", pInfoHeader->BiWidth, pInfoHeader->BiHeight);
+            gbFIMV1 = OMX_TRUE;
+            *pbEndOfFrame = OMX_TRUE;
+            return buffSize;
+        }
+    }
+
+    if (gbFIMV1) {
+        *pbEndOfFrame = OMX_TRUE;
+        return buffSize;
+    }
+
+    if (bPreviousFrameEOF == OMX_FALSE)
+        bFrameStart = OMX_TRUE;
+
+    startCode = 0xFFFFFFFF;
+    if (bFrameStart == OMX_FALSE) {
+        /* find VOP start code */
+        while(startCode != 0x1B6) {
+            readStream = *(pInputStream + len);
+            startCode = (startCode << 8) | readStream;
+            len++;
+            if (len > buffSize)
+                goto EXIT;
+        }
+    }
+
+    /* find next VOP start code */
+    startCode = 0xFFFFFFFF;
+    while ((startCode != 0x1B6)) {
+        readStream = *(pInputStream + len);
+        startCode = (startCode << 8) | readStream;
+        len++;
+        if (len > buffSize)
+            goto EXIT;
+    }
+
+    *pbEndOfFrame = OMX_TRUE;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_Mpeg4_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 4, buffSize);
+
+    return len - 4;
+
+EXIT :
+    *pbEndOfFrame = OMX_FALSE;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_Mpeg4_Frame returned EOF = %d, len = %d, buffSize = %d", *pbEndOfFrame, len - 1, buffSize);
+
+    return --len;
+}
+
+static int Check_H263_Frame(
+    OMX_U8   *pInputStream,
+    OMX_U32   buffSize,
+    OMX_U32   flag,
+    OMX_BOOL  bPreviousFrameEOF,
+    OMX_BOOL *pbEndOfFrame)
+{
+    OMX_U32  len;
+    int      readStream;
+    unsigned startCode;
+    OMX_BOOL bFrameStart = 0;
+    unsigned pTypeMask   = 0x03;
+    unsigned pType       = 0;
+
+    len = 0;
+    bFrameStart = OMX_FALSE;
+
+    if (bPreviousFrameEOF == OMX_FALSE)
+        bFrameStart = OMX_TRUE;
+
+    startCode = 0xFFFFFFFF;
+    if (bFrameStart == OMX_FALSE) {
+        /* find PSC(Picture Start Code) : 0000 0000 0000 0000 1000 00 */
+        while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
+            readStream = *(pInputStream + len);
+            startCode = (startCode << 8) | readStream;
+
+            readStream = *(pInputStream + len + 1);
+            pType = readStream & pTypeMask;
+
+            len++;
+            if (len > buffSize)
+                goto EXIT;
+        }
+    }
+
+    /* find next PSC */
+    startCode = 0xFFFFFFFF;
+    pType = 0;
+    while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
+        readStream = *(pInputStream + len);
+        startCode = (startCode << 8) | readStream;
+
+        readStream = *(pInputStream + len + 1);
+        pType = readStream & pTypeMask;
+
+        len++;
+        if (len > buffSize)
+            goto EXIT;
+    }
+
+    *pbEndOfFrame = OMX_TRUE;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "1. Check_H263_Frame returned EOF = %d, len = %d, iBuffSize = %d", *pbEndOfFrame, len - 3, buffSize);
+
+    return len - 3;
+
+EXIT :
+
+    *pbEndOfFrame = OMX_FALSE;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "2. Check_H263_Frame returned EOF = %d, len = %d, iBuffSize = %d", *pbEndOfFrame, len - 1, buffSize);
+
+    return --len;
+}
+
+static OMX_BOOL Check_Stream_StartCode(
+    OMX_U8    *pInputStream,
+    OMX_U32    streamSize,
+    CODEC_TYPE codecType)
+{
+    switch (codecType) {
+    case CODEC_TYPE_MPEG4:
+        if (gbFIMV1) {
+            return OMX_TRUE;
+        } else {
+            if (streamSize < 3) {
+                return OMX_FALSE;
+            } else if ((pInputStream[0] == 0x00) &&
+                       (pInputStream[1] == 0x00) &&
+                       (pInputStream[2] == 0x01)) {
+                return OMX_TRUE;
+            } else {
+                return OMX_FALSE;
+            }
+        }
+        break;
+    case CODEC_TYPE_H263:
+        if (streamSize > 0) {
+            unsigned startCode = 0xFFFFFFFF;
+            unsigned pTypeMask = 0x03;
+            unsigned pType     = 0;
+            OMX_U32  len       = 0;
+            int      readStream;
+            /* Check PSC(Picture Start Code) : 0000 0000 0000 0000 1000 00 */
+            while (((startCode << 8 >> 10) != 0x20) || (pType != 0x02)) {
+                readStream = *(pInputStream + len);
+                startCode = (startCode << 8) | readStream;
+
+                readStream = *(pInputStream + len + 1);
+                pType = readStream & pTypeMask;
+
+                len++;
+                if (len > 0x3)
+                    break;
+            }
+
+            if (len > 0x3) {
+                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "[%s] Picture Start Code Missing", __FUNCTION__);
+                return OMX_FALSE;
+            } else {
+                return OMX_TRUE;
+            }
+        } else {
+            return OMX_FALSE;
+        }
+    default:
+        Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "%s: undefined codec type (%d)", __FUNCTION__, codecType);
+        return OMX_FALSE;
+    }
+}
+
+OMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
+{
+    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pMpeg4Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    /* alloc ops structure */
+    pDecOps    = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
+    pInbufOps  = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
+    pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
+
+    if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pMpeg4Dec->hMFCMpeg4Handle.pDecOps    = pDecOps;
+    pMpeg4Dec->hMFCMpeg4Handle.pInbufOps  = pInbufOps;
+    pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = pOutbufOps;
+
+    /* function pointer mapping */
+    pDecOps->nSize    = sizeof(ExynosVideoDecOps);
+    pInbufOps->nSize  = sizeof(ExynosVideoDecBufferOps);
+    pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
+
+    Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
+
+    /* check mandatory functions for decoder ops */
+    if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
+        (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
+        (pDecOps->Get_FrameTag == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* check mandatory functions for buffer ops */
+    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
+        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
+        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
+        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
+        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* alloc context, open, querycap */
+    pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
+    if (pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pDecOps != NULL) {
+            Exynos_OSAL_Free(pDecOps);
+            pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
+        }
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecClose(EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec)
+{
+    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pMpeg4Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+
+    if (hMFCHandle != NULL) {
+        pDecOps->Finalize(hMFCHandle);
+        pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle = NULL;
+    }
+    if (pOutbufOps != NULL) {
+        Exynos_OSAL_Free(pOutbufOps);
+        pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps = NULL;
+    }
+    if (pInbufOps != NULL) {
+        Exynos_OSAL_Free(pInbufOps);
+        pMpeg4Dec->hMFCMpeg4Handle.pInbufOps = NULL;
+    }
+    if (pDecOps != NULL) {
+        Exynos_OSAL_Free(pDecOps);
+        pMpeg4Dec->hMFCMpeg4Handle.pDecOps = NULL;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pMpeg4Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX)
+        pInbufOps->Run(hMFCHandle);
+    else if (nPortIndex == OUTPUT_PORT_INDEX)
+        pOutbufOps->Run(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pMpeg4Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+
+    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
+        pInbufOps->Stop(hMFCHandle);
+    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
+        pOutbufOps->Stop(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pMpeg4Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX) {
+        if (pMpeg4Dec->bSourceStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pMpeg4Dec->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    if (nPortIndex == OUTPUT_PORT_INDEX) {
+        if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pMpeg4Dec->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    int i, nOutbufs;
+
+    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+
+    FunctionIn();
+
+    if ((nPortIndex == INPUT_PORT_INDEX) &&
+        (pMpeg4Dec->bSourceStart == OMX_TRUE)) {
+        Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
+
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
+
+            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
+        }
+
+        pInbufOps->Clear_Queue(hMFCHandle);
+    } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
+               (pMpeg4Dec->bDestinationStart == OMX_TRUE)) {
+        OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+        ExynosVideoBuffer *pBuffer = NULL;
+
+        Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
+
+        nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
+        nOutbufs += EXTRA_DPB_NUM;
+        for (i = 0; i < nOutbufs; i++) {
+            pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
+            Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
+        }
+        pOutbufOps->Clear_Queue(hMFCHandle);
+    } else {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
+
+    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+    ExynosVideoGeometry      bufferConf;
+    OMX_U32                  inputBufferNumber = 0;
+    int i;
+
+    FunctionIn();
+
+    if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
+
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if (pVideoDec->bThumbnailMode == OMX_TRUE)
+        pDecOps->Set_DisplayDelay(hMFCHandle, 0);
+
+    /* input buffer info */
+    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
+    if (pMpeg4Dec->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
+        bufferConf.eCompressionFormat = VIDEO_CODING_MPEG4;
+    else
+        bufferConf.eCompressionFormat = VIDEO_CODING_H263;
+
+    pInbufOps->Set_Shareable(hMFCHandle);
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
+                                * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
+        inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
+    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
+    }
+
+    /* should be done before prepare input buffer */
+    if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* set input buffer geometry */
+    if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* setup input buffer */
+    if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register input buffer */
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            ExynosVideoPlane plane;
+            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
+            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
+            plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
+            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /* Register input buffer */
+        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
+            ExynosVideoPlane plane;
+            plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
+            plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
+            plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
+            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    }
+
+    /* set output geometry */
+    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
+    pMpeg4Dec->hMFCMpeg4Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
+    if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* input buffer enqueue for header parsing */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
+    if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
+                        (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
+//        ret = OMX_ErrorInsufficientResources;
+        ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
+        goto EXIT;
+    }
+
+    /* start header parsing */
+    if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
+        ret = OMX_ErrorCodecInit;
+        goto EXIT;
+    }
+
+    /* get geometry for output */
+    Exynos_OSAL_Memset(&pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
+    if (pOutbufOps->Get_Geometry(hMFCHandle, &pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* get dpb count */
+    pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
+    if (pVideoDec->bThumbnailMode == OMX_FALSE)
+        pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum += EXTRA_DPB_NUM;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Mpeg4CodecSetup nOutbufs: %d", pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum);
+
+    pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth) ||
+            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight)) {
+            pExynosInputPort->portDefinition.format.video.nFrameWidth = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
+            pExynosInputPort->portDefinition.format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
+            pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
+            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
+
+            Exynos_UpdateFrameSize(pOMXComponent);
+            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
+
+            /** Send Port Settings changed call back **/
+            (*(pExynosComponent->pCallbacks->EventHandler))
+                (pOMXComponent,
+                 pExynosComponent->callbackData,
+                 OMX_EventPortSettingsChanged, /* The command was completed */
+                 OMX_DirOutput, /* This is the port index */
+                 0,
+                 NULL);
+        }
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth) ||
+            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight) ||
+            (pExynosOutputPort->portDefinition.nBufferCountActual != pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum)) {
+            pExynosInputPort->portDefinition.format.video.nFrameWidth = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth;
+            pExynosInputPort->portDefinition.format.video.nFrameHeight = pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight;
+            pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
+            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
+
+            pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - 2;
+            pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - 2;
+
+            Exynos_UpdateFrameSize(pOMXComponent);
+            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
+
+            /** Send Port Settings changed call back **/
+            (*(pExynosComponent->pCallbacks->EventHandler))
+                (pOMXComponent,
+                 pExynosComponent->callbackData,
+                 OMX_EventPortSettingsChanged, /* The command was completed */
+                 OMX_DirOutput, /* This is the port index */
+                 0,
+                 NULL);
+        }
+    }
+    Exynos_OSAL_SleepMillisec(0);
+    ret = OMX_ErrorInputDataDecodeYet;
+    Mpeg4CodecStop(pOMXComponent, INPUT_PORT_INDEX);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+
+    int i, nOutbufs;
+
+    FunctionIn();
+
+    /* get dpb count */
+    nOutbufs = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* should be done before prepare output buffer */
+        if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+    pOutbufOps->Set_Shareable(hMFCHandle);
+    if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
+    OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+    int plane;
+
+    nAllocLen[0] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
+                        pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight);
+    nAllocLen[1] = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth,
+                        pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight >> 1);
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register output buffer */
+        for (i = 0; i < nOutbufs; i++) {
+            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
+
+            for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
+                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY);
+                if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
+                    Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
+                                                       pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
+
+                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
+                planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
+                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
+            }
+
+            if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
+                            (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+        }
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /* Register output buffer */
+        /*************/
+        /*    TBD    */
+        /*************/
+#ifdef USE_ANB
+        if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+            for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
+                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                    planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
+                    planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
+                    planes[plane].allocSize = nAllocLen[plane];
+                }
+
+                if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
+                               (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+            }
+        } else {
+            ret = OMX_ErrorNotImplemented;
+            goto EXIT;
+        }
+#else
+        ret = OMX_ErrorNotImplemented;
+        goto EXIT;
+#endif
+    }
+
+    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        Mpeg4CodecStop(pOMXComponent, OUTPUT_PORT_INDEX);
+    }
+    pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_TRUE;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_GetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR     pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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 (nParamIndex) {
+    case OMX_IndexParamVideoMpeg4:
+    {
+        OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = NULL;
+        EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec      = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstMpeg4Param->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcMpeg4Param = &pMpeg4Dec->mpeg4Component[pDstMpeg4Param->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstMpeg4Param, pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
+    }
+        break;
+    case OMX_IndexParamVideoH263:
+    {
+        OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = NULL;
+        EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec     = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstH263Param->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcH263Param = &pMpeg4Dec->h263Component[pDstH263Param->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstH263Param, pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_S32                      codecType;
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
+        if (codecType == CODEC_TYPE_MPEG4)
+            Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
+        else
+            Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelQuerySupported:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel   = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
+        EXYNOS_OMX_VIDEO_PROFILELEVEL    *pProfileLevel      = NULL;
+        OMX_U32                           maxProfileLevelNum = 0;
+        OMX_S32                           codecType;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
+        if (codecType == CODEC_TYPE_MPEG4) {
+            pProfileLevel = supportedMPEG4ProfileLevels;
+            maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
+        } else {
+            pProfileLevel = supportedH263ProfileLevels;
+            maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
+        }
+
+        if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
+            ret = OMX_ErrorNoMore;
+            goto EXIT;
+        }
+
+        pProfileLevel += pDstProfileLevel->nProfileIndex;
+        pDstProfileLevel->eProfile = pProfileLevel->profile;
+        pDstProfileLevel->eLevel = pProfileLevel->level;
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelCurrent:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_MPEG4TYPE        *pSrcMpeg4Param   = NULL;
+        OMX_VIDEO_PARAM_H263TYPE         *pSrcH263Param    = NULL;
+        EXYNOS_MPEG4DEC_HANDLE           *pMpeg4Dec        = NULL;
+        OMX_S32                           codecType;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        codecType = pMpeg4Dec->hMFCMpeg4Handle.codecType;
+        if (codecType == CODEC_TYPE_MPEG4) {
+            pSrcMpeg4Param = &pMpeg4Dec->mpeg4Component[pDstProfileLevel->nPortIndex];
+            pDstProfileLevel->eProfile = pSrcMpeg4Param->eProfile;
+            pDstProfileLevel->eLevel = pSrcMpeg4Param->eLevel;
+        } else {
+            pSrcH263Param = &pMpeg4Dec->h263Component[pDstProfileLevel->nPortIndex];
+            pDstProfileLevel->eProfile = pSrcH263Param->eProfile;
+            pDstProfileLevel->eLevel = pSrcH263Param->eLevel;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
+        EXYNOS_MPEG4DEC_HANDLE              *pMpeg4Dec               = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcErrorCorrectionType = &pMpeg4Dec->errorCorrectionType[INPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_SetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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_IndexParamVideoMpeg4:
+    {
+        OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Param = NULL;
+        OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Param = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
+        EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec      = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcMpeg4Param->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstMpeg4Param = &pMpeg4Dec->mpeg4Component[pSrcMpeg4Param->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstMpeg4Param, pSrcMpeg4Param, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
+    }
+        break;
+    case OMX_IndexParamVideoH263:
+    {
+        OMX_VIDEO_PARAM_H263TYPE *pDstH263Param = NULL;
+        OMX_VIDEO_PARAM_H263TYPE *pSrcH263Param = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
+        EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec     = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcH263Param->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstH263Param = &pMpeg4Dec->h263Component[pSrcH263Param->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstH263Param, pSrcH263Param, sizeof(OMX_VIDEO_PARAM_H263TYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+
+        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE)) {
+            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+        } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE)) {
+            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
+        } else {
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelCurrent:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_MPEG4TYPE        *pDstMpeg4Param   = NULL;
+        OMX_VIDEO_PARAM_H263TYPE         *pDstH263Param    = NULL;
+        EXYNOS_MPEG4DEC_HANDLE           *pMpeg4Dec        = NULL;
+        OMX_S32                           codecType;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+
+        if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        codecType = pMpeg4Dec->hMFCMpeg4Handle.codecType;
+        if (codecType == CODEC_TYPE_MPEG4) {
+            /*
+             * To do: Check validity of profile & level parameters
+             */
+
+            pDstMpeg4Param = &pMpeg4Dec->mpeg4Component[pSrcProfileLevel->nPortIndex];
+            pDstMpeg4Param->eProfile = pSrcProfileLevel->eProfile;
+            pDstMpeg4Param->eLevel = pSrcProfileLevel->eLevel;
+        } else {
+            /*
+             * To do: Check validity of profile & level parameters
+             */
+
+            pDstH263Param = &pMpeg4Dec->h263Component[pSrcProfileLevel->nPortIndex];
+            pDstH263Param->eProfile = pSrcProfileLevel->eProfile;
+            pDstH263Param->eLevel = pSrcProfileLevel->eLevel;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
+        EXYNOS_MPEG4DEC_HANDLE              *pMpeg4Dec               = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstErrorCorrectionType = &pMpeg4Dec->errorCorrectionType[INPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_GetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN 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) {
+    default:
+        ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_SetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN 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) {
+    default:
+        ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_GetExtensionIndex(
+    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;
+    }
+
+    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
+        EXYNOS_MPEG4DEC_HANDLE *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        *pIndexType = OMX_IndexVendorThumbnailMode;
+        ret = OMX_ErrorNone;
+    } else {
+        ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_ComponentRoleEnum(
+    OMX_IN  OMX_HANDLETYPE hComponent,
+    OMX_OUT OMX_U8        *cRole,
+    OMX_IN  OMX_U32        nIndex)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    OMX_S32                   codecType;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (cRole == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) {
+        ret = OMX_ErrorNoMore;
+        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;
+    }
+
+    codecType = ((EXYNOS_MPEG4DEC_HANDLE *)(((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
+    if (codecType == CODEC_TYPE_MPEG4)
+        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
+    else
+        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Init */
+OMX_ERRORTYPE Exynos_Mpeg4Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_MPEG4DEC_HANDLE        *pMpeg4Dec         = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
+    OMX_PTR                        hMFCHandle        = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    CSC_METHOD csc_method = CSC_METHOD_SW;
+    int i, plane;
+
+    FunctionIn();
+
+    pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
+    pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
+    pExynosComponent->bUseFlagEOF = OMX_TRUE;
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+
+    /* H.264 Codec Open */
+    ret = Mpeg4CodecOpen(pMpeg4Dec);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
+        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
+
+            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                /* Use ION Allocator */
+                pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
+                pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+                pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+                pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+                if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+            }
+
+            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
+        }
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
+        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    pMpeg4Dec->bSourceStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pMpeg4Dec->hSourceStartEvent);
+    pMpeg4Dec->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pMpeg4Dec->hDestinationStartEvent);
+
+    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
+    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
+    pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp = 0;
+    pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp = 0;
+
+    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+
+#if 0//defined(USE_CSC_GSCALER)
+    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
+#endif
+    pVideoDec->csc_handle = csc_init(csc_method);
+    if (pVideoDec->csc_handle == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    pVideoDec->csc_set_format = OMX_FALSE;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Terminate */
+OMX_ERRORTYPE Exynos_Mpeg4Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    OMX_PTR                hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+
+    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+
+    int i, plane;
+
+    FunctionIn();
+
+    if (pVideoDec->csc_handle != NULL) {
+        csc_deinit(pVideoDec->csc_handle);
+        pVideoDec->csc_handle = NULL;
+    }
+
+    Exynos_OSAL_SignalTerminate(pMpeg4Dec->hDestinationStartEvent);
+    pMpeg4Dec->hDestinationStartEvent = NULL;
+    pMpeg4Dec->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalTerminate(pMpeg4Dec->hSourceStartEvent);
+    pMpeg4Dec->hSourceStartEvent = NULL;
+    pMpeg4Dec->bSourceStart = OMX_FALSE;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
+                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                    if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+                }
+
+                Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
+                pVideoDec->pMFCDecOutputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
+                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                    if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+                }
+
+                Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
+                pVideoDec->pMFCDecInputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+    Mpeg4CodecClose(pMpeg4Dec);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE               ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
+    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+    int i;
+
+    FunctionIn();
+
+    if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc == OMX_FALSE) {
+        ret = Mpeg4CodecSrcSetup(pOMXComponent, pSrcInputData);
+        goto EXIT;
+    }
+    if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_FALSE) {
+        ret = Mpeg4CodecDstSetup(pOMXComponent);
+    }
+
+    if ((Check_Stream_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize, pMpeg4Dec->hMFCMpeg4Handle.codecType) == OMX_TRUE) ||
+        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->timeStamp;
+        pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->nFlags;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp, pSrcInputData->nFlags);
+        pDecOps->Set_FrameTag(hMFCHandle, pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp);
+        pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp++;
+        pMpeg4Dec->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP;
+
+        /* queue work for input buffer */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
+                                    (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        if (codecReturn != VIDEO_ERROR_NONE) {
+            ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+            goto EXIT;
+        }
+        Mpeg4CodecStart(pOMXComponent, INPUT_PORT_INDEX);
+        if (pMpeg4Dec->bSourceStart == OMX_FALSE) {
+            pMpeg4Dec->bSourceStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pMpeg4Dec->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+        if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
+            pMpeg4Dec->bDestinationStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pMpeg4Dec->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+
+    FunctionIn();
+
+    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+
+    pSrcOutputData->dataLen       = 0;
+    pSrcOutputData->usedDataLen   = 0;
+    pSrcOutputData->remainDataLen = 0;
+    pSrcOutputData->nFlags    = 0;
+    pSrcOutputData->timeStamp = 0;
+
+    if (pVideoBuffer == NULL) {
+        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
+        pSrcOutputData->allocSize  = 0;
+        pSrcOutputData->pPrivate = NULL;
+        pSrcOutputData->bufferHeader = NULL;
+    } else {
+        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
+        pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
+        pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
+
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            int i = 0;
+            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
+                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
+                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+                    goto EXIT;
+                }
+                i++;
+            }
+            pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+            pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
+        }
+
+        /* For Share Buffer */
+        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+
+    FunctionIn();
+
+    if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
+                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
+                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
+
+    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
+                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
+
+    if (codecReturn != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+        ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+        goto EXIT;
+    }
+    Mpeg4CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4DEC_HANDLE         *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Dec->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pMpeg4Dec->hMFCMpeg4Handle.pDecOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
+    ExynosVideoGeometry *bufferGeometry;
+    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
+    OMX_S32 indexTimestamp = 0;
+    int plane;
+
+    FunctionIn();
+
+    if (pMpeg4Dec->bDestinationStart == OMX_FALSE) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    while (1) {
+        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+        displayStatus = pVideoBuffer->displayStatus;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
+
+        if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
+            (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
+            (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
+            (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            if (pVideoBuffer != NULL) {
+                ret = OMX_ErrorNone;
+                break;
+            } else {
+                ret = OMX_ErrorUndefined;
+                break;
+            }
+        }
+    }
+
+    if (ret != OMX_ErrorNone)
+        goto EXIT;
+
+    pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp++;
+    pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
+
+    pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
+    for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+        pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
+        pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
+        pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
+        pDstOutputData->dataLen +=  pVideoBuffer->planes[plane].dataSize;
+    }
+    pDstOutputData->usedDataLen = 0;
+    pDstOutputData->pPrivate = pVideoBuffer;
+    /* For Share Buffer */
+    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
+
+    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
+    bufferGeometry = &pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf;
+    pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
+    pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
+    switch (bufferGeometry->eColorFormat) {
+    case VIDEO_COLORFORMAT_NV12:
+        pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+        break;
+    case VIDEO_COLORFORMAT_NV12_TILED:
+    default:
+        pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
+        break;
+    }
+
+    indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
+    if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
+        if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
+            (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
+        } else {
+            pDstOutputData->timeStamp = 0x00;
+            pDstOutputData->nFlags = 0x00;
+        }
+    } else {
+        /* For timestamp correction. if mfc support frametype detect */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
+#ifdef NEED_TIMESTAMP_REORDER
+        if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
+            pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp = indexTimestamp;
+        } else {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp];
+        }
+#else
+        pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
+        pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
+#endif
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
+    }
+
+    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
+        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
+        pDstOutputData->remainDataLen = 0;
+    } else {
+        pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    ret = Exynos_Mpeg4Dec_SrcIn(pOMXComponent, pSrcInputData);
+    if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+    }
+    if ((pMpeg4Dec->bSourceStart == OMX_FALSE) &&
+       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
+        Exynos_OSAL_SignalWait(pMpeg4Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pMpeg4Dec->hSourceStartEvent);
+    }
+
+    ret = Exynos_Mpeg4Dec_SrcOut(pOMXComponent, pSrcOutputData);
+    if ((ret != OMX_ErrorNone) &&
+        (pExynosComponent->currentState == OMX_StateExecuting)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_MPEG4DEC_HANDLE    *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if ((pMpeg4Dec->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pMpeg4Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pMpeg4Dec->hDestinationStartEvent);
+        }
+    }
+    if (pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_TRUE) {
+        ret = Exynos_Mpeg4Dec_DstIn(pOMXComponent, pDstInputData);
+        if (ret != OMX_ErrorNone) {
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+        }
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_MPEG4DEC_HANDLE   *pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((pMpeg4Dec->bDestinationStart == OMX_FALSE) &&
+            (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pMpeg4Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pMpeg4Dec->hDestinationStartEvent);
+        }
+    }
+    ret = Exynos_Mpeg4Dec_DstOut(pOMXComponent, pDstOutputData);
+    if ((ret != OMX_ErrorNone) &&
+        (pExynosComponent->currentState == OMX_StateExecuting)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec        = NULL;
+    EXYNOS_MPEG4DEC_HANDLE        *pMpeg4Dec        = NULL;
+    int i = 0;
+    OMX_S32 codecType = -1;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (componentName == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_DEC, componentName) == 0) {
+        codecType = CODEC_TYPE_MPEG4;
+    } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_DEC, componentName) == 0) {
+        codecType = CODEC_TYPE_H263;
+    } else {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
+        goto EXIT;
+    }
+
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
+
+    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
+    if (pExynosComponent->componentName == NULL) {
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
+
+    pMpeg4Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4DEC_HANDLE));
+    if (pMpeg4Dec == NULL) {
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pMpeg4Dec, 0, sizeof(EXYNOS_MPEG4DEC_HANDLE));
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Dec;
+    pMpeg4Dec->hMFCMpeg4Handle.codecType = codecType;
+
+    if (codecType == CODEC_TYPE_MPEG4)
+        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_DEC);
+    else
+        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_DEC);
+
+    /* Set componentVersion */
+    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
+    /* Set specVersion */
+    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
+    if (codecType == CODEC_TYPE_MPEG4) {
+        pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+        Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+        Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4");
+    } else {
+        pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
+        Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+        Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263");
+    }
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_SHARE;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    if (codecType == CODEC_TYPE_MPEG4) {
+        for(i = 0; i < ALL_PORT_NUM; i++) {
+            INIT_SET_SIZE_VERSION(&pMpeg4Dec->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE);
+            pMpeg4Dec->mpeg4Component[i].nPortIndex = i;
+            pMpeg4Dec->mpeg4Component[i].eProfile   = OMX_VIDEO_MPEG4ProfileSimple;
+            pMpeg4Dec->mpeg4Component[i].eLevel     = OMX_VIDEO_MPEG4Level3;
+        }
+    } else {
+        for(i = 0; i < ALL_PORT_NUM; i++) {
+            INIT_SET_SIZE_VERSION(&pMpeg4Dec->h263Component[i], OMX_VIDEO_PARAM_H263TYPE);
+            pMpeg4Dec->h263Component[i].nPortIndex = i;
+            pMpeg4Dec->h263Component[i].eProfile   = OMX_VIDEO_H263ProfileBaseline | OMX_VIDEO_H263ProfileISWV2;
+            pMpeg4Dec->h263Component[i].eLevel     = OMX_VIDEO_H263Level45;
+        }
+    }
+
+    pOMXComponent->GetParameter      = &Exynos_Mpeg4Dec_GetParameter;
+    pOMXComponent->SetParameter      = &Exynos_Mpeg4Dec_SetParameter;
+    pOMXComponent->GetConfig         = &Exynos_Mpeg4Dec_GetConfig;
+    pOMXComponent->SetConfig         = &Exynos_Mpeg4Dec_SetConfig;
+    pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Dec_GetExtensionIndex;
+    pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Dec_ComponentRoleEnum;
+    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
+
+    pExynosComponent->exynos_codec_componentInit      = &Exynos_Mpeg4Dec_Init;
+    pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg4Dec_Terminate;
+
+    pVideoDec->exynos_codec_srcInputProcess  = &Exynos_Mpeg4Dec_srcInputBufferProcess;
+    pVideoDec->exynos_codec_srcOutputProcess = &Exynos_Mpeg4Dec_srcOutputBufferProcess;
+    pVideoDec->exynos_codec_dstInputProcess  = &Exynos_Mpeg4Dec_dstInputBufferProcess;
+    pVideoDec->exynos_codec_dstOutputProcess = &Exynos_Mpeg4Dec_dstOutputBufferProcess;
+
+    pVideoDec->exynos_codec_start            = &Mpeg4CodecStart;
+    pVideoDec->exynos_codec_stop             = &Mpeg4CodecStop;
+    pVideoDec->exynos_codec_bufferProcessRun = &Mpeg4CodecOutputBufferProcessRun;
+    pVideoDec->exynos_codec_enqueueAllBuffer = &Mpeg4CodecEnQueueAllBuffer;
+
+    if (codecType == CODEC_TYPE_MPEG4)
+        pVideoDec->exynos_checkInputFrame = &Check_Mpeg4_Frame;
+    else
+        pVideoDec->exynos_checkInputFrame = &Check_H263_Frame;
+
+    pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
+    pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
+
+    pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
+    if (pVideoDec->hSharedMemory == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        Exynos_OSAL_Free(pMpeg4Dec);
+        pMpeg4Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pExynosComponent->currentState = OMX_StateLoaded;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE       *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_MPEG4DEC_HANDLE      *pMpeg4Dec = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
+
+    Exynos_OSAL_Free(pExynosComponent->componentName);
+    pExynosComponent->componentName = NULL;
+
+    pMpeg4Dec = (EXYNOS_MPEG4DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pMpeg4Dec != NULL) {
+        Exynos_OSAL_Free(pMpeg4Dec);
+        pMpeg4Dec = pVideoDec->hCodecHandle = NULL;
+    }
+
+    ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.h b/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.h
new file mode 100644 (file)
index 0000000..bfde6c9
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ *
+ * 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_Mpeg4dec.h
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_MPEG4_DEC_COMPONENT
+#define EXYNOS_OMX_MPEG4_DEC_COMPONENT
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "OMX_Video.h"
+#include "ExynosVideoApi.h"
+
+
+typedef enum _CODEC_TYPE
+{
+    CODEC_TYPE_H263,
+    CODEC_TYPE_MPEG4
+} CODEC_TYPE;
+
+/*
+ * This structure is the same as BitmapInfoHhr struct in pv_avifile_typedefs.h file
+ */
+typedef struct _BitmapInfoHhr
+{
+    OMX_U32    BiSize;
+    OMX_U32    BiWidth;
+    OMX_U32    BiHeight;
+    OMX_U16    BiPlanes;
+    OMX_U16    BiBitCount;
+    OMX_U32    BiCompression;
+    OMX_U32    BiSizeImage;
+    OMX_U32    BiXPelsPerMeter;
+    OMX_U32    BiYPelsPerMeter;
+    OMX_U32    BiClrUsed;
+    OMX_U32    BiClrImportant;
+} BitmapInfoHhr;
+
+typedef struct _EXYNOS_MFC_MPEG4DEC_HANDLE
+{
+    OMX_HANDLETYPE             hMFCHandle;
+    OMX_U32                    indexTimestamp;
+    OMX_U32                    outputIndexTimestamp;
+    OMX_BOOL                   bConfiguredMFCSrc;
+    OMX_BOOL                   bConfiguredMFCDst;
+    OMX_U32                    maxDPBNum;
+    CODEC_TYPE                 codecType;
+
+    ExynosVideoColorFormatType MFCOutputColorType;
+    ExynosVideoDecOps         *pDecOps;
+    ExynosVideoDecBufferOps   *pInbufOps;
+    ExynosVideoDecBufferOps   *pOutbufOps;
+    ExynosVideoGeometry        codecOutbufConf;
+} EXYNOS_MFC_MPEG4DEC_HANDLE;
+
+typedef struct _EXYNOS_MPEG4DEC_HANDLE
+{
+    /* OMX Codec specific */
+    OMX_VIDEO_PARAM_H263TYPE            h263Component[ALL_PORT_NUM];
+    OMX_VIDEO_PARAM_MPEG4TYPE           mpeg4Component[ALL_PORT_NUM];
+    OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType[ALL_PORT_NUM];
+
+    /* EXYNOS MFC Codec specific */
+    EXYNOS_MFC_MPEG4DEC_HANDLE          hMFCMpeg4Handle;
+
+    OMX_BOOL bSourceStart;
+    OMX_BOOL bDestinationStart;
+    OMX_HANDLETYPE hSourceStartEvent;
+    OMX_HANDLETYPE hDestinationStartEvent;
+} EXYNOS_MPEG4DEC_HANDLE;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
+    OMX_HANDLETYPE hComponent,
+    OMX_STRING componentName);
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
+    OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/video/dec/mpeg4/library_register.c b/component/video/dec/mpeg4/library_register.c
new file mode 100644 (file)
index 0000000..d4f670d
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ *
+ * 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        library_register.c
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_ETC.h"
+#include "library_register.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_MPEG4_DEC"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(
+    ExynosRegisterComponentType **ppExynosComponent)
+{
+    FunctionIn();
+
+    if (ppExynosComponent == NULL)
+        goto EXIT;
+
+    /* component 1 - video decoder MPEG4 */
+    Exynos_OSAL_Strcpy(ppExynosComponent[0]->componentName, EXYNOS_OMX_COMPONENT_MPEG4_DEC);
+    Exynos_OSAL_Strcpy(ppExynosComponent[0]->roles[0], EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE);
+    ppExynosComponent[0]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+    /* component 2 - video decoder H.263 */
+    Exynos_OSAL_Strcpy(ppExynosComponent[1]->componentName, EXYNOS_OMX_COMPONENT_H263_DEC);
+    Exynos_OSAL_Strcpy(ppExynosComponent[1]->roles[0], EXYNOS_OMX_COMPONENT_H263_DEC_ROLE);
+    ppExynosComponent[1]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+EXIT:
+    FunctionOut();
+
+    return MAX_COMPONENT_NUM;
+}
diff --git a/component/video/dec/mpeg4/library_register.h b/component/video/dec/mpeg4/library_register.h
new file mode 100644 (file)
index 0000000..5af7840
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *
+ * 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        library_register.h
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_MPEG4_DEC_REG
+#define EXYNOS_OMX_MPEG4_DEC_REG
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "Exynos_OMX_Component_Register.h"
+
+
+#define OSCL_EXPORT_REF __attribute__((visibility("default")))
+#define MAX_COMPONENT_NUM         2
+#define MAX_COMPONENT_ROLE_NUM    1
+
+/* MPEG4 */
+#define EXYNOS_OMX_COMPONENT_MPEG4_DEC         "OMX.Exynos.MPEG4.Decoder"
+#define EXYNOS_OMX_COMPONENT_MPEG4_DEC_ROLE    "video_decoder.mpeg4"
+
+/* H.263 */
+#define EXYNOS_OMX_COMPONENT_H263_DEC          "OMX.Exynos.H263.Decoder"
+#define EXYNOS_OMX_COMPONENT_H263_DEC_ROLE     "video_decoder.h263"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(
+    ExynosRegisterComponentType **ppExynosComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/video/dec/vp8/Android.mk b/component/video/dec/vp8/Android.mk
new file mode 100644 (file)
index 0000000..bd76dfc
--- /dev/null
@@ -0,0 +1,47 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_Vp8dec.c \
+       library_register.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libOMX.Exynos.VP8.Decoder
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/omx
+
+LOCAL_CFLAGS :=
+
+ifeq ($(BOARD_NONBLOCK_MODE_PROCESS), true)
+LOCAL_CFLAGS += -DNONBLOCK_MODE_PROCESS
+endif
+
+ifeq ($(BOARD_USE_ANB), true)
+LOCAL_CFLAGS += -DUSE_ANB
+endif
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_Vdec libExynosOMX_OSAL libExynosOMX_Basecomponent \
+       libswconverter libExynosVideoApi
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libui \
+       libExynosOMX_Resourcemanager libcsc libexynosv4l2 libion_exynos libexynosgscaler
+
+ifeq ($(BOARD_USES_MFC_FPS),true)
+LOCAL_CFLAGS += -DCONFIG_MFC_FPS
+endif
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/video/dec \
+       hardware/samsung_slsi/exynos5/include \
+       hardware/samsung_slsi/exynos5/libcsc \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include
+
+
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/component/video/dec/vp8/Exynos_OMX_Vp8dec.c b/component/video/dec/vp8/Exynos_OMX_Vp8dec.c
new file mode 100644 (file)
index 0000000..e8690e1
--- /dev/null
@@ -0,0 +1,1975 @@
+/*
+ *
+ * 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_Vp8dec.c
+ * @brief
+ * @author      Satish Kumar Reddy (palli.satish@samsung.com)
+ * @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_OMX_Basecomponent.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Vdec.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Thread.h"
+#include "library_register.h"
+#include "Exynos_OMX_Vp8dec.h"
+#include "ExynosVideoApi.h"
+#include "Exynos_OSAL_SharedMemory.h"
+#include "Exynos_OSAL_Event.h"
+
+#ifdef USE_ANB
+#include "Exynos_OSAL_Android.h"
+#endif
+
+/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
+/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
+#include "csc.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_VP8_DEC"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+#define VP8_DEC_NUM_OF_EXTRA_BUFFERS 7
+
+//#define FULL_FRAME_SEARCH /* Full frame search not support*/
+
+static OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, void *pVirtAddr, OMX_U32 *dataSize)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+static OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, void *addr[], int size[])
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    ExynosVideoBuffer  *pCodecBuffer;
+
+    if (codecBuffer == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
+
+    if (addr != NULL) {
+        addr[0] = pCodecBuffer->planes[0].addr;
+        addr[1] = pCodecBuffer->planes[1].addr;
+        addr[2] = pCodecBuffer->planes[2].addr;
+    }
+
+    if (size != NULL) {
+        size[0] = pCodecBuffer->planes[0].allocSize;
+        size[1] = pCodecBuffer->planes[1].allocSize;
+        size[2] = pCodecBuffer->planes[2].allocSize;
+    }
+
+EXIT:
+    return ret;
+}
+
+static int Check_VP8_Frame(
+    OMX_U8   *pInputStream,
+    int       buffSize,
+    OMX_U32   flag,
+    OMX_BOOL  bPreviousFrameEOF,
+    OMX_BOOL *pbEndOfFrame)
+{
+    /* Uncompressed data Chunk comprises a common
+    (for key frames and interframes) 3-byte frame tag that
+    contains four fields
+    - 1-bit frame type (0 - key frame, 1 - inter frame)
+    - 3-bit version number (0 - 3 are defined as four different
+                                      profiles with different decoding complexity)
+    - 1-bit show_frame flag ( 0 - current frame not for display,
+                                          1 - current frame is for dispaly)
+    - 19-bit field - size of the first data partition in bytes
+
+    Key Frames : frame tag followed by 7 bytes of uncompressed
+    data
+    3-bytes : Start code (byte 0: 0x9d,byte 1: 0x01,byte 2: 0x2a)
+    Next 4-bytes: Width & height, Horizontal and vertical scale information
+    16 bits      :     (2 bits Horizontal Scale << 14) | Width (14 bits)
+    16 bits      :     (2 bits Vertical Scale << 14) | Height (14 bits)
+    */
+    int width, height;
+    int horizSscale, vertScale;
+
+    FunctionIn();
+
+    *pbEndOfFrame = OMX_TRUE;
+
+    /*Check for Key frame*/
+    if (!(pInputStream[0] & 0x01)){
+        /* Key Frame  Start code*/
+        if (pInputStream[3] != 0x9d || pInputStream[4] != 0x01 || pInputStream[5]!=0x2a) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, " VP8 Key Frame Start Code not Found");
+            *pbEndOfFrame = OMX_FALSE;
+        }
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, " VP8 Found Key Frame Start Code");
+        width = (pInputStream[6] | (pInputStream[7] << 8)) & 0x3fff;
+        horizSscale = pInputStream[7] >> 6;
+        height = (pInputStream[8] | (pInputStream[9] << 8)) & 0x3fff;
+        vertScale = pInputStream[9] >> 6;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "width = %d, height = %d, horizSscale = %d, vertScale = %d", width, height, horizSscale, vertScale);
+    }
+
+    FunctionOut();
+    return buffSize;
+}
+
+OMX_BOOL Check_VP8_StartCode(
+    OMX_U8     *pInputStream,
+    OMX_U32     streamSize)
+{
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "streamSize: %d",streamSize);
+    if (streamSize < 3) {
+        return OMX_FALSE;
+    }
+
+    if (!(pInputStream[0] & 0x01)){
+        /* Key Frame  Start code*/
+        if (pInputStream[3] != 0x9d || pInputStream[4] != 0x01 || pInputStream[5]!=0x2a) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, " VP8 Key Frame Start Code not Found");
+            return OMX_FALSE;
+        }
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, " VP8 Found Key Frame Start Code");
+    }
+
+    return OMX_TRUE;
+}
+
+OMX_ERRORTYPE VP8CodecOpen(EXYNOS_VP8DEC_HANDLE *pVp8Dec)
+{
+    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pVp8Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    /* alloc ops structure */
+    pDecOps    = (ExynosVideoDecOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecOps));
+    pInbufOps  = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
+    pOutbufOps = (ExynosVideoDecBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoDecBufferOps));
+
+    if ((pDecOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate decoder ops buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pVp8Dec->hMFCVp8Handle.pDecOps    = pDecOps;
+    pVp8Dec->hMFCVp8Handle.pInbufOps  = pInbufOps;
+    pVp8Dec->hMFCVp8Handle.pOutbufOps = pOutbufOps;
+
+    /* function pointer mapping */
+    pDecOps->nSize    = sizeof(ExynosVideoDecOps);
+    pInbufOps->nSize  = sizeof(ExynosVideoDecBufferOps);
+    pOutbufOps->nSize = sizeof(ExynosVideoDecBufferOps);
+
+    Exynos_Video_Register_Decoder(pDecOps, pInbufOps, pOutbufOps);
+
+    /* check mandatory functions for decoder ops */
+    if ((pDecOps->Init == NULL) || (pDecOps->Finalize == NULL) ||
+        (pDecOps->Get_ActualBufferCount == NULL) || (pDecOps->Set_FrameTag == NULL) ||
+        (pDecOps->Get_FrameTag == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* check mandatory functions for buffer ops */
+    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
+        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
+        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
+        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
+        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* alloc context, open, querycap */
+    pVp8Dec->hMFCVp8Handle.hMFCHandle = pVp8Dec->hMFCVp8Handle.pDecOps->Init(V4L2_MEMORY_DMABUF);
+    if (pVp8Dec->hMFCVp8Handle.hMFCHandle == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pDecOps != NULL) {
+            Exynos_OSAL_Free(pDecOps);
+            pVp8Dec->hMFCVp8Handle.pDecOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pVp8Dec->hMFCVp8Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL;
+        }
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE VP8CodecClose(EXYNOS_VP8DEC_HANDLE *pVp8Dec)
+{
+    OMX_ERRORTYPE            ret        = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pVp8Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+
+    if (hMFCHandle != NULL) {
+        pDecOps->Finalize(hMFCHandle);
+        pVp8Dec->hMFCVp8Handle.hMFCHandle = NULL;
+    }
+    if (pOutbufOps != NULL) {
+        Exynos_OSAL_Free(pOutbufOps);
+        pVp8Dec->hMFCVp8Handle.pOutbufOps = NULL;
+    }
+    if (pInbufOps != NULL) {
+        Exynos_OSAL_Free(pInbufOps);
+        pVp8Dec->hMFCVp8Handle.pInbufOps = NULL;
+    }
+    if (pDecOps != NULL) {
+        Exynos_OSAL_Free(pDecOps);
+        pVp8Dec->hMFCVp8Handle.pDecOps = NULL;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE VP8CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_VP8DEC_HANDLE   *pVp8Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pVp8Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX)
+        pInbufOps->Run(hMFCHandle);
+    else if (nPortIndex == OUTPUT_PORT_INDEX)
+        pOutbufOps->Run(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE VP8CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_VP8DEC_HANDLE   *pVp8Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pVp8Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+
+    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
+        pInbufOps->Stop(hMFCHandle);
+    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
+        pOutbufOps->Stop(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE VP8CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_VP8DEC_HANDLE   *pVp8Dec = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoDec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pVp8Dec == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX) {
+        if (pVp8Dec->bSourceStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    if (nPortIndex == OUTPUT_PORT_INDEX) {
+        if (pVp8Dec->bDestinationStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE VP8CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    int i, nOutbufs;
+
+    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+
+    FunctionIn();
+
+    if ((nPortIndex == INPUT_PORT_INDEX) &&
+        (pVp8Dec->bSourceStart == OMX_TRUE)) {
+        Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
+
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]);
+
+            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
+        }
+
+        pInbufOps->Clear_Queue(hMFCHandle);
+    } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
+               (pVp8Dec->bDestinationStart == OMX_TRUE)) {
+        OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+        ExynosVideoBuffer *pBuffer = NULL;
+
+        Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
+
+        nOutbufs = pDecOps->Get_ActualBufferCount(hMFCHandle);
+        nOutbufs += EXTRA_DPB_NUM;
+        for (i = 0; i < nOutbufs; i++) {
+            pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
+            Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
+        }
+        pOutbufOps->Clear_Queue(hMFCHandle);
+    } else {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_VP8DEC_HANDLE          *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
+
+    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+    ExynosVideoGeometry      bufferConf;
+    OMX_U32                  inputBufferNumber = 0;
+    int i;
+
+    FunctionIn();
+
+    if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
+
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if (pVideoDec->bThumbnailMode == OMX_TRUE)
+        pDecOps->Set_DisplayDelay(hMFCHandle, 0);
+
+    /* input buffer info */
+    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
+    bufferConf.eCompressionFormat = VIDEO_CODING_VP8;
+    pInbufOps->Set_Shareable(hMFCHandle);
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        bufferConf.nSizeImage = pExynosInputPort->portDefinition.format.video.nFrameWidth
+                                * pExynosInputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
+        inputBufferNumber = MAX_VIDEO_INPUTBUFFER_NUM;
+    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        bufferConf.nSizeImage = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
+    }
+
+    /* should be done before prepare input buffer */
+    if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* set input buffer geometry */
+    if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* setup input buffer */
+    if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register input buffer */
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            ExynosVideoPlane plane;
+            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0];
+            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize[0];
+            plane.fd = pVideoDec->pMFCDecInputBuffer[i]->fd[0];
+            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /* Register input buffer */
+        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
+            ExynosVideoPlane plane;
+            plane.addr = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
+            plane.allocSize = pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen;
+            plane.fd = pExynosInputPort->extendBufferHeader[i].buf_fd[0];
+            if (pInbufOps->Register(hMFCHandle, &plane, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    }
+
+    /* set output geometry */
+    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
+    pVp8Dec->hMFCVp8Handle.MFCOutputColorType = bufferConf.eColorFormat = VIDEO_COLORFORMAT_NV12_TILED;
+    if (pOutbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* input buffer enqueue for header parsing */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d", oneFrameSize);
+    if (pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
+                        (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to enqueue input buffer for header parsing");
+//        ret = OMX_ErrorInsufficientResources;
+        ret = (OMX_ERRORTYPE)OMX_ErrorCodecInit;
+        goto EXIT;
+    }
+
+    /* start header parsing */
+    if (pInbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run input buffer for header parsing");
+        ret = OMX_ErrorCodecInit;
+        goto EXIT;
+    }
+
+    /* get geometry for output */
+    Exynos_OSAL_Memset(&pVp8Dec->hMFCVp8Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry));
+    if (pOutbufOps->Get_Geometry(hMFCHandle, &pVp8Dec->hMFCVp8Handle.codecOutbufConf) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to get geometry for parsed header info");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* get dpb count */
+    pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle);
+    if (pVideoDec->bThumbnailMode == OMX_FALSE)
+        pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum);
+
+    pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
+            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight)) {
+            pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
+            pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
+            pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
+            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
+
+            Exynos_UpdateFrameSize(pOMXComponent);
+            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
+
+            /** Send Port Settings changed call back **/
+            (*(pExynosComponent->pCallbacks->EventHandler))
+                (pOMXComponent,
+                 pExynosComponent->callbackData,
+                 OMX_EventPortSettingsChanged, /* The command was completed */
+                 OMX_DirOutput, /* This is the port index */
+                 0,
+                 NULL);
+        }
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if ((pExynosInputPort->portDefinition.format.video.nFrameWidth != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth) ||
+            (pExynosInputPort->portDefinition.format.video.nFrameHeight != pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight) ||
+            (pExynosOutputPort->portDefinition.nBufferCountActual != pVp8Dec->hMFCVp8Handle.maxDPBNum)) {
+            pExynosInputPort->portDefinition.format.video.nFrameWidth = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth;
+            pExynosInputPort->portDefinition.format.video.nFrameHeight = pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight;
+            pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15));
+            pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15));
+
+            pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
+            pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - 2;
+
+            Exynos_UpdateFrameSize(pOMXComponent);
+            pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE;
+
+            /** Send Port Settings changed call back **/
+            (*(pExynosComponent->pCallbacks->EventHandler))
+                (pOMXComponent,
+                 pExynosComponent->callbackData,
+                 OMX_EventPortSettingsChanged, /* The command was completed */
+                 OMX_DirOutput, /* This is the port index */
+                 0,
+                 NULL);
+        }
+    }
+    Exynos_OSAL_SleepMillisec(0);
+    ret = OMX_ErrorInputDataDecodeYet;
+    VP8CodecStop(pOMXComponent, INPUT_PORT_INDEX);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+
+    int i, nOutbufs;
+
+    FunctionIn();
+
+    /* get dpb count */
+    nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* should be done before prepare output buffer */
+        if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    pOutbufOps->Set_Shareable(hMFCHandle);
+    if (pOutbufOps->Setup(hMFCHandle, nOutbufs) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
+    OMX_U32 nAllocLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0, 0};
+    int plane;
+
+    nAllocLen[0] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth,
+                        pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight);
+    nAllocLen[1] = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth,
+                        pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1);
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register output buffer */
+        for (i = 0; i < nOutbufs; i++) {
+            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Memset(pVideoDec->pMFCDecOutputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
+
+            for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] =
+                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, nAllocLen[plane], NORMAL_MEMORY);
+                if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] == NULL) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                pVideoDec->pMFCDecOutputBuffer[i]->fd[plane] =
+                    Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
+                                                       pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane] = nAllocLen[plane];
+
+                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane];
+                planes[plane].fd = pVideoDec->pMFCDecOutputBuffer[i]->fd[plane];
+                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[plane];
+            }
+
+            if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
+                            (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+        }
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /* Register output buffer */
+        /*************/
+        /*    TBD    */
+        /*************/
+#ifdef USE_ANB
+        if (pExynosOutputPort->bIsANBEnabled == OMX_TRUE) {
+            for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
+                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                    planes[plane].fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[plane];
+                    planes[plane].addr = pExynosOutputPort->extendBufferHeader[i].pYUVBuf[plane];
+                    planes[plane].allocSize = nAllocLen[plane];
+                }
+
+                if (pOutbufOps->Register(hMFCHandle, planes, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf,
+                              (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+            }
+        } else {
+            ret = OMX_ErrorNotImplemented;
+            goto EXIT;
+        }
+#else
+        ret = OMX_ErrorNotImplemented;
+        goto EXIT;
+#endif
+    }
+
+    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        VP8CodecStop (pOMXComponent, OUTPUT_PORT_INDEX);
+    }
+    pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_TRUE;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_GetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR     pComponentParameterStructure)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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 (nParamIndex) {
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
+        EXYNOS_VP8DEC_HANDLE                *pVp8Dec                 = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoDecodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_SetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentParameterStructure)
+{
+    OMX_ERRORTYPE           ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+
+        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE)) {
+            pExynosComponent->pExynosPort[INPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX;
+        } else {
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
+        EXYNOS_VP8DEC_HANDLE                *pVp8Dec                 = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcErrorCorrectionType->nPortIndex != INPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstErrorCorrectionType = &pVp8Dec->errorCorrectionType[INPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoDecodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_GetConfig(
+    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) {
+    default:
+        ret = Exynos_OMX_VideoDecodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_SetConfig(
+    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) {
+    default:
+        ret = Exynos_OMX_VideoDecodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_GetExtensionIndex(
+    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;
+    }
+
+    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL) == 0) {
+        EXYNOS_VP8DEC_HANDLE *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        *pIndexType = OMX_IndexVendorThumbnailMode;
+        ret = OMX_ErrorNone;
+    } else {
+        ret = Exynos_OMX_VideoDecodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_ComponentRoleEnum(
+    OMX_HANDLETYPE hComponent,
+    OMX_U8        *cRole,
+    OMX_U32        nIndex)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (cRole == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
+        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
+        ret = OMX_ErrorNone;
+    } else {
+        ret = OMX_ErrorNoMore;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Init */
+OMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret               = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent  = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec         = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_VP8DEC_HANDLE          *pVp8Dec           = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
+    OMX_PTR                        hMFCHandle        = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+
+    ExynosVideoDecOps       *pDecOps    = NULL;
+    ExynosVideoDecBufferOps *pInbufOps  = NULL;
+    ExynosVideoDecBufferOps *pOutbufOps = NULL;
+
+    CSC_METHOD csc_method = CSC_METHOD_SW;
+    int i, plane;
+
+    FunctionIn();
+
+    pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_FALSE;
+    pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst = OMX_FALSE;
+    pExynosComponent->bUseFlagEOF = OMX_TRUE;
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+
+    /* H.264 Codec Open */
+    ret = VP8CodecOpen(pVp8Dec);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
+        Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Memset(pVideoDec->pMFCDecInputBuffer[i], 0, sizeof(CODEC_DEC_BUFFER));
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]);
+
+            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                /* Use ION Allocator */
+                pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
+                pVideoDec->pMFCDecInputBuffer[i]->fd[plane] = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+                pVideoDec->pMFCDecInputBuffer[i]->bufferSize[plane] = DEFAULT_MFC_INPUT_BUFFER_SIZE;
+                pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+                if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] == NULL) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->pVirAddr[%d]: 0x%x", i, plane, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+            }
+
+            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoDec->pMFCDecInputBuffer[i]);
+        }
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
+        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    pVp8Dec->bSourceStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pVp8Dec->hSourceStartEvent);
+    pVp8Dec->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pVp8Dec->hDestinationStartEvent);
+
+    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
+    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
+    pVp8Dec->hMFCVp8Handle.indexTimestamp = 0;
+    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = 0;
+
+    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+
+#if 0//defined(USE_CSC_GSCALER)
+    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
+#endif
+    pVideoDec->csc_handle = csc_init(csc_method);
+    if (pVideoDec->csc_handle == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    pVideoDec->csc_set_format = OMX_FALSE;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Terminate */
+OMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    OMX_PTR                hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+
+    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+
+    int i, plane;
+
+    FunctionIn();
+
+    if (pVideoDec->csc_handle != NULL) {
+        csc_deinit(pVideoDec->csc_handle);
+        pVideoDec->csc_handle = NULL;
+    }
+
+    Exynos_OSAL_SignalTerminate(pVp8Dec->hDestinationStartEvent);
+    pVp8Dec->hDestinationStartEvent = NULL;
+    pVp8Dec->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalTerminate(pVp8Dec->hSourceStartEvent);
+    pVp8Dec->hSourceStartEvent = NULL;
+    pVp8Dec->bSourceStart = OMX_FALSE;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
+                for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+                    if (pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane] != NULL)
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr[plane]);
+                }
+
+                Exynos_OSAL_Free(pVideoDec->pMFCDecOutputBuffer[i]);
+                pVideoDec->pMFCDecOutputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
+                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                    if (pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane] != NULL)
+                        Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[plane]);
+                }
+
+                Exynos_OSAL_Free(pVideoDec->pMFCDecInputBuffer[i]);
+                pVideoDec->pMFCDecInputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+    VP8CodecClose(pVp8Dec);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE               ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
+    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+    int i;
+
+    FunctionIn();
+
+    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc == OMX_FALSE) {
+        ret = VP8CodecSrcSetup(pOMXComponent, pSrcInputData);
+        goto EXIT;
+    }
+    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_FALSE) {
+        ret = VP8CodecDstSetup(pOMXComponent);
+    }
+
+    if ((Check_VP8_StartCode(pSrcInputData->buffer.singlePlaneBuffer.dataBuffer, oneFrameSize) == OMX_TRUE) ||
+        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->timeStamp;
+        pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.indexTimestamp] = pSrcInputData->nFlags;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pVp8Dec->hMFCVp8Handle.indexTimestamp, pSrcInputData->nFlags);
+        pDecOps->Set_FrameTag(hMFCHandle, pVp8Dec->hMFCVp8Handle.indexTimestamp);
+        pVp8Dec->hMFCVp8Handle.indexTimestamp++;
+        pVp8Dec->hMFCVp8Handle.indexTimestamp %= MAX_TIMESTAMP;
+
+        /* queue work for input buffer */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "oneFrameSize: %d, bufferHeader: 0x%x, dataBuffer: 0x%x", oneFrameSize, pSrcInputData->bufferHeader, pSrcInputData->buffer.singlePlaneBuffer.dataBuffer);
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)&pSrcInputData->buffer.singlePlaneBuffer.dataBuffer,
+                                    (unsigned int *)&oneFrameSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        if (codecReturn != VIDEO_ERROR_NONE) {
+            ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+            goto EXIT;
+        }
+        VP8CodecStart(pOMXComponent, INPUT_PORT_INDEX);
+        if (pVp8Dec->bSourceStart == OMX_FALSE) {
+            pVp8Dec->bSourceStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pVp8Dec->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+        if (pVp8Dec->bDestinationStart == OMX_FALSE) {
+            pVp8Dec->bDestinationStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pVp8Dec->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+
+    FunctionIn();
+
+    pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+
+    pSrcOutputData->dataLen       = 0;
+    pSrcOutputData->usedDataLen   = 0;
+    pSrcOutputData->remainDataLen = 0;
+    pSrcOutputData->nFlags    = 0;
+    pSrcOutputData->timeStamp = 0;
+
+    if (pVideoBuffer == NULL) {
+        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
+        pSrcOutputData->allocSize  = 0;
+        pSrcOutputData->pPrivate = NULL;
+        pSrcOutputData->bufferHeader = NULL;
+    } else {
+        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
+        pSrcOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
+        pSrcOutputData->allocSize  = pVideoBuffer->planes[0].allocSize;
+
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            int i = 0;
+            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->pVirAddr[0]) {
+                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find buffer");
+                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+                    goto EXIT;
+                }
+                i++;
+            }
+            pVideoDec->pMFCDecInputBuffer[i]->dataSize = 0;
+            pSrcOutputData->pPrivate = pVideoDec->pMFCDecInputBuffer[i];
+        }
+
+        /* For Share Buffer */
+        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0,};
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+
+    FunctionIn();
+
+    if (pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR[0]: 0x%x, ADDR[1]: 0x%x", __FUNCTION__, __LINE__,
+                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0],
+                                        pDstInputData->buffer.multiPlaneBuffer.dataBuffer[1]);
+
+    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pDstInputData->buffer.multiPlaneBuffer.dataBuffer,
+                     (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
+
+    if (codecReturn != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s : %d", __FUNCTION__, __LINE__);
+        ret = (OMX_ERRORTYPE)OMX_ErrorCodecDecode;
+        goto EXIT;
+    }
+    VP8CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_VP8DEC_HANDLE         *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pVp8Dec->hMFCVp8Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    ExynosVideoDecOps       *pDecOps    = pVp8Dec->hMFCVp8Handle.pDecOps;
+    ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
+    ExynosVideoGeometry *bufferGeometry;
+    DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
+    OMX_S32 indexTimestamp = 0;
+    int plane;
+
+    FunctionIn();
+
+    if (pVp8Dec->bDestinationStart == OMX_FALSE) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    while (1) {
+        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+        displayStatus = pVideoBuffer->displayStatus;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus: 0x%x", displayStatus);
+
+        if ((displayStatus == VIDEO_FRAME_STATUS_DISPLAY_DECODING) ||
+            (displayStatus == VIDEO_FRAME_STATUS_DISPLAY_ONLY) ||
+            (displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
+            (CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            if (pVideoBuffer != NULL) {
+                ret = OMX_ErrorNone;
+                break;
+            } else {
+                ret = OMX_ErrorUndefined;
+                break;
+            }
+        }
+    }
+
+    if (ret != OMX_ErrorNone)
+        goto EXIT;
+
+    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++;
+    pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
+
+    pDstOutputData->allocSize = pDstOutputData->dataLen = 0;
+    for (plane = 0; plane < MFC_OUTPUT_BUFFER_PLANE; plane++) {
+        pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
+        pDstOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
+        pDstOutputData->allocSize += pVideoBuffer->planes[plane].allocSize;
+        pDstOutputData->dataLen +=  pVideoBuffer->planes[plane].dataSize;
+    }
+    pDstOutputData->usedDataLen = 0;
+    pDstOutputData->pPrivate = pVideoBuffer;
+    /* For Share Buffer */
+    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
+
+    pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
+    bufferGeometry = &pVp8Dec->hMFCVp8Handle.codecOutbufConf;
+    pBufferInfo->imageWidth = bufferGeometry->nFrameWidth;
+    pBufferInfo->imageHeight = bufferGeometry->nFrameHeight;
+    switch (bufferGeometry->eColorFormat) {
+    case VIDEO_COLORFORMAT_NV12:
+        pBufferInfo->ColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+        break;
+    case VIDEO_COLORFORMAT_NV12_TILED:
+    default:
+        pBufferInfo->ColorFormat = OMX_SEC_COLOR_FormatNV12Tiled;
+        break;
+    }
+
+    indexTimestamp = pDecOps->Get_FrameTag(hMFCHandle);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "out indexTimestamp: %d", indexTimestamp);
+    if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
+        if ((pExynosComponent->checkTimeStamp.needSetStartTimeStamp != OMX_TRUE) &&
+            (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp != OMX_TRUE)) {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "missing out indexTimestamp: %d", indexTimestamp);
+        } else {
+            pDstOutputData->timeStamp = 0x00;
+            pDstOutputData->nFlags = 0x00;
+        }
+    } else {
+        /* For timestamp correction. if mfc support frametype detect */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "disp_pic_frame_type: %d", pVideoBuffer->frameType);
+#ifdef NEED_TIMESTAMP_REORDER
+        if ((pVideoBuffer->frameType == VIDEO_FRAME_I)) {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
+            pVp8Dec->hMFCVp8Handle.outputIndexTimestamp = indexTimestamp;
+        } else {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[pVp8Dec->hMFCVp8Handle.outputIndexTimestamp];
+        }
+#else
+        pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
+        pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
+#endif
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "timestamp %lld us (%.2f secs), indexTimestamp: %d, nFlags: 0x%x", pDstOutputData->timeStamp, pDstOutputData->timeStamp / 1E6, indexTimestamp, pDstOutputData->nFlags);
+    }
+
+    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
+        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "displayStatus:%d, nFlags0x%x", displayStatus, pDstOutputData->nFlags);
+        pDstOutputData->remainDataLen = 0;
+    } else {
+        pDstOutputData->remainDataLen = bufferGeometry->nFrameWidth * bufferGeometry->nFrameHeight * 3 / 2;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    ret = Exynos_VP8Dec_SrcIn(pOMXComponent, pSrcInputData);
+    if ((ret != OMX_ErrorNone) && (ret != OMX_ErrorInputDataDecodeYet)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+    }
+    if ((pVp8Dec->bSourceStart == OMX_FALSE) &&
+       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
+        Exynos_OSAL_SignalWait(pVp8Dec->hSourceStartEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pVp8Dec->hSourceStartEvent);
+    }
+
+    ret = Exynos_VP8Dec_SrcOut(pOMXComponent, pSrcOutputData);
+    if ((ret != OMX_ErrorNone) &&
+        (pExynosComponent->currentState == OMX_StateExecuting)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if ((pVp8Dec->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent);
+        }
+    }
+    if (pVp8Dec->hMFCVp8Handle.bConfiguredMFCDst == OMX_TRUE) {
+        ret = Exynos_VP8Dec_DstIn(pOMXComponent, pDstInputData);
+        if (ret != OMX_ErrorNone) {
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+        }
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_VP8Dec_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_VP8DEC_HANDLE    *pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((pVp8Dec->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pVp8Dec->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pVp8Dec->hDestinationStartEvent);
+        }
+    }
+    ret = Exynos_VP8Dec_DstOut(pOMXComponent, pDstOutputData);
+    if ((ret != OMX_ErrorNone) &&
+        (pExynosComponent->currentState == OMX_StateExecuting)) {
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
+    OMX_HANDLETYPE  hComponent,
+    OMX_STRING      componentName)
+{
+    OMX_ERRORTYPE                    ret                = OMX_ErrorNone;
+    OMX_COMPONENTTYPE               *pOMXComponent      = NULL;
+    EXYNOS_OMX_BASECOMPONENT        *pExynosComponent   = NULL;
+    EXYNOS_OMX_BASEPORT             *pExynosPort        = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT   *pVideoDec          = NULL;
+    EXYNOS_VP8DEC_HANDLE            *pVp8Dec            = NULL;
+    int i = 0;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (componentName == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_VP8_DEC, componentName) != 0) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
+        goto EXIT;
+    }
+
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_VideoDecodeComponentInit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pExynosComponent->codecType = HW_VIDEO_DEC_CODEC;
+
+    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
+    if (pExynosComponent->componentName == NULL) {
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
+
+    pVp8Dec = Exynos_OSAL_Malloc(sizeof(EXYNOS_VP8DEC_HANDLE));
+    if (pVp8Dec == NULL) {
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pVp8Dec, 0, sizeof(EXYNOS_VP8DEC_HANDLE));
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pVideoDec->hCodecHandle = (OMX_HANDLETYPE)pVp8Dec;
+
+    Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_VP8_DEC);
+
+    /* Set componentVersion */
+    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
+    /* Set specVersion */
+    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingVPX;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/x-vnd.on2.vp8");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_SHARE;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420Planar;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_COPY | BUFFER_ANBSHARE;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    pOMXComponent->GetParameter      = &Exynos_VP8Dec_GetParameter;
+    pOMXComponent->SetParameter      = &Exynos_VP8Dec_SetParameter;
+    pOMXComponent->GetConfig         = &Exynos_VP8Dec_GetConfig;
+    pOMXComponent->SetConfig         = &Exynos_VP8Dec_SetConfig;
+    pOMXComponent->GetExtensionIndex = &Exynos_VP8Dec_GetExtensionIndex;
+    pOMXComponent->ComponentRoleEnum = &Exynos_VP8Dec_ComponentRoleEnum;
+    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
+
+    pExynosComponent->exynos_codec_componentInit      = &Exynos_VP8Dec_Init;
+    pExynosComponent->exynos_codec_componentTerminate = &Exynos_VP8Dec_Terminate;
+
+    pVideoDec->exynos_codec_srcInputProcess  = &Exynos_VP8Dec_srcInputBufferProcess;
+    pVideoDec->exynos_codec_srcOutputProcess = &Exynos_VP8Dec_srcOutputBufferProcess;
+    pVideoDec->exynos_codec_dstInputProcess  = &Exynos_VP8Dec_dstInputBufferProcess;
+    pVideoDec->exynos_codec_dstOutputProcess = &Exynos_VP8Dec_dstOutputBufferProcess;
+
+    pVideoDec->exynos_codec_start            = &VP8CodecStart;
+    pVideoDec->exynos_codec_stop             = &VP8CodecStop;
+    pVideoDec->exynos_codec_bufferProcessRun = &VP8CodecOutputBufferProcessRun;
+    pVideoDec->exynos_codec_enqueueAllBuffer = &VP8CodecEnQueueAllBuffer;
+
+    pVideoDec->exynos_checkInputFrame                 = &Check_VP8_Frame;
+    pVideoDec->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
+    pVideoDec->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
+
+    pVideoDec->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
+    if (pVideoDec->hSharedMemory == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        Exynos_OSAL_Free(pVp8Dec);
+        pVp8Dec = ((EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
+        Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pExynosComponent->currentState = OMX_StateLoaded;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
+    OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE                ret                = OMX_ErrorNone;
+    OMX_COMPONENTTYPE           *pOMXComponent      = NULL;
+    EXYNOS_OMX_BASECOMPONENT    *pExynosComponent   = NULL;
+    EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = NULL;
+    EXYNOS_VP8DEC_HANDLE        *pVp8Dec            = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_SharedMemory_Close(pVideoDec->hSharedMemory);
+
+    Exynos_OSAL_Free(pExynosComponent->componentName);
+    pExynosComponent->componentName = NULL;
+
+    pVp8Dec = (EXYNOS_VP8DEC_HANDLE *)pVideoDec->hCodecHandle;
+    if (pVp8Dec != NULL) {
+        Exynos_OSAL_Free(pVp8Dec);
+        pVp8Dec = pVideoDec->hCodecHandle = NULL;
+    }
+
+    ret = Exynos_OMX_VideoDecodeComponentDeinit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/video/dec/vp8/Exynos_OMX_Vp8dec.h b/component/video/dec/vp8/Exynos_OMX_Vp8dec.h
new file mode 100644 (file)
index 0000000..0b66406
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ *
+ * 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_Vp8dec.h
+ * @brief
+ * @author     Satish Kumar Reddy (palli.satish@samsung.com)
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_VP8_DEC_COMPONENT
+#define EXYNOS_OMX_VP8_DEC_COMPONENT
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "OMX_Video.h"
+#include "ExynosVideoApi.h"
+
+
+typedef struct _EXYNOS_MFC_VP8DEC_HANDLE
+{
+    OMX_HANDLETYPE             hMFCHandle;
+    OMX_U32                    indexTimestamp;
+    OMX_U32                    outputIndexTimestamp;
+    OMX_BOOL                   bConfiguredMFCSrc;
+    OMX_BOOL                   bConfiguredMFCDst;
+    OMX_U32                    maxDPBNum;
+
+    ExynosVideoColorFormatType MFCOutputColorType;
+    ExynosVideoDecOps         *pDecOps;
+    ExynosVideoDecBufferOps   *pInbufOps;
+    ExynosVideoDecBufferOps   *pOutbufOps;
+    ExynosVideoGeometry        codecOutbufConf;
+} EXYNOS_MFC_VP8DEC_HANDLE;
+
+typedef struct _EXYNOS_VP8DEC_HANDLE
+{
+    /* OMX Codec specific */
+    OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType[ALL_PORT_NUM];
+
+    /* EXYNOS MFC Codec specific */
+    EXYNOS_MFC_VP8DEC_HANDLE            hMFCVp8Handle;
+
+    OMX_BOOL bSourceStart;
+    OMX_BOOL bDestinationStart;
+    OMX_HANDLETYPE hSourceStartEvent;
+    OMX_HANDLETYPE hDestinationStartEvent;
+} EXYNOS_VP8DEC_HANDLE;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(
+    OMX_HANDLETYPE hComponent,
+    OMX_STRING componentName);
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(
+    OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/video/dec/vp8/library_register.c b/component/video/dec/vp8/library_register.c
new file mode 100644 (file)
index 0000000..042a837
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ *
+ * 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       library_register.c
+ * @brief
+ * @author     Satish Kumar Reddy (palli.satish@samsung.com)
+ * @version    2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_ETC.h"
+#include "library_register.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_VP8_DEC"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(
+    ExynosRegisterComponentType **ppExynosComponent)
+{
+    FunctionIn();
+
+    if (ppExynosComponent == NULL)
+        goto EXIT;
+
+    /* component 1 - video decoder VP8 */
+    Exynos_OSAL_Strcpy(ppExynosComponent[0]->componentName, EXYNOS_OMX_COMPONENT_VP8_DEC);
+    Exynos_OSAL_Strcpy(ppExynosComponent[0]->roles[0], EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE);
+    ppExynosComponent[0]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+EXIT:
+    FunctionOut();
+    return MAX_COMPONENT_NUM;
+}
diff --git a/component/video/dec/vp8/library_register.h b/component/video/dec/vp8/library_register.h
new file mode 100644 (file)
index 0000000..375b914
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *
+ * 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        library_register.h
+ * @brief
+ * @author      Satish Kumar Reddy (palli.satish@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_VP8_DEC_REG
+#define EXYNOS_OMX_VP8_DEC_REG
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "Exynos_OMX_Component_Register.h"
+
+
+#define OSCL_EXPORT_REF __attribute__((visibility("default")))
+#define MAX_COMPONENT_NUM       1
+#define MAX_COMPONENT_ROLE_NUM  1
+
+/* VP8 */
+#define EXYNOS_OMX_COMPONENT_VP8_DEC      "OMX.Exynos.VP8.Decoder"
+#define EXYNOS_OMX_COMPONENT_VP8_DEC_ROLE "video_decoder.vpx"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(
+    ExynosRegisterComponentType **ppExynosComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/video/enc/Android.mk b/component/video/enc/Android.mk
new file mode 100644 (file)
index 0000000..7c1c436
--- /dev/null
@@ -0,0 +1,32 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_VencControl.c \
+       Exynos_OMX_Venc.c
+
+LOCAL_MODULE := libExynosOMX_Venc
+LOCAL_ARM_MODE := arm
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/video/enc \
+       hardware/samsung_slsi/exynos5/include \
+       hardware/samsung_slsi/exynos5/libcsc \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include
+
+ifeq ($(BOARD_USE_METADATABUFFERTYPE), true)
+LOCAL_CFLAGS += -DUSE_METADATABUFFERTYPE
+endif
+
+ifeq ($(BOARD_USE_STOREMETADATA), true)
+LOCAL_CFLAGS += -DUSE_STOREMETADATA
+endif
+
+LOCAL_SHARED_LIBRARIES := libcsc
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/component/video/enc/Exynos_OMX_Venc.c b/component/video/enc/Exynos_OMX_Venc.c
new file mode 100644 (file)
index 0000000..b3b2eb9
--- /dev/null
@@ -0,0 +1,1249 @@
+/*
+ *
+ * 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_Venc.c
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ *              Yunji Kim (yunji.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_SharedMemory.h"
+#include "Exynos_OSAL_Mutex.h"
+#include "Exynos_OSAL_ETC.h"
+#include "csc.h"
+
+#ifdef USE_STOREMETADATA
+#include <system/window.h>
+#include "Exynos_OSAL_Android.h"
+#endif
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_VIDEO_ENC"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+
+inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    if ((exynosOutputPort->portDefinition.format.video.nFrameWidth !=
+            exynosInputPort->portDefinition.format.video.nFrameWidth) ||
+        (exynosOutputPort->portDefinition.format.video.nFrameHeight !=
+            exynosInputPort->portDefinition.format.video.nFrameHeight)) {
+        OMX_U32 width = 0, height = 0;
+
+        exynosOutputPort->portDefinition.format.video.nFrameWidth =
+            exynosInputPort->portDefinition.format.video.nFrameWidth;
+        exynosOutputPort->portDefinition.format.video.nFrameHeight =
+            exynosInputPort->portDefinition.format.video.nFrameHeight;
+        width = exynosOutputPort->portDefinition.format.video.nStride =
+            exynosInputPort->portDefinition.format.video.nStride;
+        height = exynosOutputPort->portDefinition.format.video.nSliceHeight =
+            exynosInputPort->portDefinition.format.video.nSliceHeight;
+
+        if (width && height)
+            exynosOutputPort->portDefinition.nBufferSize = (width * height * 3) / 2;
+    }
+
+    return;
+}
+
+OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
+{
+    OMX_BOOL ret = OMX_FALSE;
+
+    if ((pExynosComponent->currentState == OMX_StateExecuting) &&
+        (pExynosComponent->pExynosPort[nPortIndex].portState == OMX_StateIdle) &&
+        (pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+        (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToExecuting)) {
+        ret = OMX_TRUE;
+    } else {
+        ret = OMX_FALSE;
+    }
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    CODEC_ENC_BUFFER *pInputCodecBuffer = (CODEC_ENC_BUFFER*)codecBuffer;
+
+    pData->buffer.multiPlaneBuffer.dataBuffer[0] = pInputCodecBuffer->pVirAddr[0];
+    pData->buffer.multiPlaneBuffer.dataBuffer[1] = pInputCodecBuffer->pVirAddr[1];
+    pData->allocSize     = pInputCodecBuffer->bufferSize[0] + pInputCodecBuffer->bufferSize[1];
+    pData->dataLen       = pInputCodecBuffer->dataSize;
+    pData->usedDataLen   = 0;
+    pData->remainDataLen = pInputCodecBuffer->dataSize;
+
+    pData->nFlags        = 0;
+    pData->timeStamp     = 0;
+    pData->pPrivate      = codecBuffer;
+    pData->bufferHeader  = NULL;
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    OMX_PTR pSrcBuf;
+    OMX_U32 allocSize;
+
+    pVideoEnc->exynos_codec_getCodecOutputPrivateData(codecBuffer, &pSrcBuf, &allocSize);
+    pData->buffer.singlePlaneBuffer.dataBuffer = pSrcBuf;
+    pData->allocSize     = allocSize;
+    pData->dataLen       = 0;
+    pData->usedDataLen   = 0;
+    pData->remainDataLen = 0;
+
+    pData->nFlags        = 0;
+    pData->timeStamp     = 0;
+    pData->pPrivate      = codecBuffer;
+    pData->bufferHeader  = NULL;
+
+    return ret;
+}
+
+void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex)
+{
+    EXYNOS_OMX_BASEPORT *exynosOMXInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *exynosOMXOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *exynosOMXPort = NULL;
+
+    FunctionIn();
+
+    exynosOMXPort = &pExynosComponent->pExynosPort[nPortIndex];
+
+    if (((pExynosComponent->currentState == OMX_StatePause) ||
+        (pExynosComponent->currentState == OMX_StateIdle) ||
+        (pExynosComponent->transientState == EXYNOS_OMX_TransStateLoadedToIdle) ||
+        (pExynosComponent->transientState == EXYNOS_OMX_TransStateExecutingToIdle)) &&
+        (pExynosComponent->transientState != EXYNOS_OMX_TransStateIdleToLoaded) &&
+        (!CHECK_PORT_BEING_FLUSHED(exynosOMXPort))) {
+        Exynos_OSAL_SignalWait(pExynosComponent->pExynosPort[nPortIndex].pauseEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pExynosComponent->pExynosPort[nPortIndex].pauseEvent);
+    }
+
+    FunctionOut();
+
+    return;
+}
+
+OMX_BOOL Exynos_CSC_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData)
+{
+    OMX_BOOL                       ret = OMX_FALSE;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT   *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
+    OMX_U32                nFrameWidth = exynosInputPort->portDefinition.format.video.nFrameWidth;
+    OMX_U32                nFrameHeight = exynosInputPort->portDefinition.format.video.nFrameHeight;
+    OMX_COLOR_FORMATTYPE   eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat;
+    OMX_BYTE               checkInputStream = NULL;
+    OMX_BOOL               flagEOS = OMX_FALSE;
+
+    FunctionIn();
+
+    checkInputStream = inputUseBuffer->bufferHeader->pBuffer;
+
+    CODEC_ENC_BUFFER *codecInputBuffer = (CODEC_ENC_BUFFER *)srcInputData->pPrivate;
+    codecInputBuffer->dataSize = ((nFrameWidth * nFrameHeight) * 3) / 2;
+
+    unsigned int csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
+    unsigned int csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
+    CSC_METHOD csc_method = CSC_METHOD_SW;
+    unsigned int cacheable = 1;
+
+    unsigned char *pSrcBuf[3] = {NULL, };
+    unsigned char *pDstBuf[3] = {NULL, };
+
+    CSC_ERRORCODE cscRet = CSC_ErrorNone;
+
+    pSrcBuf[0]  = checkInputStream;
+    pSrcBuf[1]  = checkInputStream + (nFrameWidth * nFrameHeight);
+    pSrcBuf[2]  = checkInputStream + (((nFrameWidth * nFrameHeight) * 5) / 4);
+
+    pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[0];
+    pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[1];
+    pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[2];
+
+    csc_get_method(pVideoEnc->csc_handle, &csc_method);
+    if (csc_method == CSC_METHOD_HW) {
+        pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.fd[0];
+        pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.fd[1];
+        pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.fd[2];
+    }
+
+#ifdef USE_METADATABUFFERTYPE
+    OMX_PTR ppBuf[MAX_BUFFER_PLANE];
+
+    /* kMetadataBufferTypeGrallocSource */
+    if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
+        /* ARGB8888 converted to YUV420SemiPlanar */
+        csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_Format32bitARGB8888);
+        csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
+
+        Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
+        if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
+            ExynosVideoPlane planes[MAX_BUFFER_PLANE];
+            OMX_U32 stride;
+            int imageSize;
+
+            Exynos_OSAL_LockANBHandle((OMX_U32)ppBuf[0], nFrameWidth, nFrameHeight, OMX_COLOR_FormatAndroidOpaque, planes);
+            imageSize = nFrameWidth * nFrameHeight * 3; /* RGB888 */
+
+            if (csc_method == CSC_METHOD_HW)
+                pSrcBuf[0]  = (unsigned char *)planes[0].fd;
+            else
+                pSrcBuf[0] = planes[0].addr;
+            pSrcBuf[1]  = NULL;
+            pSrcBuf[2]  = NULL;
+        }
+    } else
+#endif
+    {
+        if (csc_method == CSC_METHOD_HW) {
+            pSrcBuf[0]  = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, checkInputStream);
+            pSrcBuf[1]  = NULL;
+            pSrcBuf[2]  = NULL;
+        }
+
+        switch (eColorFormat) {
+        case OMX_COLOR_FormatYUV420Planar:
+            /* YUV420Planar converted to YUV420Semiplanar (interleaved UV plane) as per MFC spec.*/
+            csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420Planar);
+            csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
+            break;
+        case OMX_COLOR_FormatYUV420SemiPlanar:
+        case OMX_SEC_COLOR_FormatNV12Tiled:
+        case OMX_SEC_COLOR_FormatNV21Linear:
+            /* Just copied to MFC input buffer */
+            csc_src_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
+            csc_dst_color_format = omx_2_hal_pixel_format((unsigned int)OMX_COLOR_FormatYUV420SemiPlanar);
+            break;
+        default:
+            break;
+        }
+    }
+
+    csc_set_src_format(
+        pVideoEnc->csc_handle,  /* handle */
+        nFrameWidth,                  /* width */
+        nFrameHeight,                 /* height */
+        0,                      /* crop_left */
+        0,                      /* crop_right */
+        nFrameWidth,                  /* crop_width */
+        nFrameHeight,                 /* crop_height */
+        csc_src_color_format,   /* color_format */
+        cacheable);             /* cacheable */
+    csc_set_dst_format(
+        pVideoEnc->csc_handle,  /* handle */
+        nFrameWidth,                  /* width */
+        nFrameHeight,                 /* height */
+        0,                      /* crop_left */
+        0,                      /* crop_right */
+        nFrameWidth,                  /* crop_width */
+        nFrameHeight,                 /* crop_height */
+        csc_dst_color_format,   /* color_format */
+        cacheable);             /* cacheable */
+    csc_set_src_buffer(
+        pVideoEnc->csc_handle,  /* handle */
+        pSrcBuf);               /* YUV Addr or FD */
+    csc_set_dst_buffer(
+        pVideoEnc->csc_handle,  /* handle */
+        pDstBuf);               /* YUV Addr or FD */
+    cscRet = csc_convert(pVideoEnc->csc_handle);
+    if (cscRet != CSC_ErrorNone)
+        ret = OMX_FALSE;
+    else
+        ret = OMX_TRUE;
+
+#ifdef USE_METADATABUFFERTYPE
+    if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
+        Exynos_OSAL_UnlockANBHandle((OMX_U32)ppBuf[0]);
+    }
+#endif
+
+    ret = OMX_TRUE;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *srcInputData)
+{
+    OMX_BOOL                      ret = OMX_FALSE;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT   *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER *inputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
+    OMX_U32                nFrameWidth = exynosInputPort->portDefinition.format.video.nFrameWidth;
+    OMX_U32                nFrameHeight = exynosInputPort->portDefinition.format.video.nFrameHeight;
+    OMX_COLOR_FORMATTYPE   eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat;
+    OMX_U32                copySize = 0;
+    OMX_BYTE               checkInputStream = NULL;
+    OMX_U32                checkInputStreamLen = 0;
+    OMX_BOOL               flagEOS = OMX_FALSE;
+
+    FunctionIn();
+
+    if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((srcInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) ||
+            (srcInputData->pPrivate == NULL)) {
+            ret = OMX_FALSE;
+            goto EXIT;
+        }
+    }
+
+    if (inputUseBuffer->dataValid == OMX_TRUE) {
+        if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
+            Exynos_Shared_BufferToData(inputUseBuffer, srcInputData, ONE_PLANE);
+#ifdef USE_METADATABUFFERTYPE
+            if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
+                OMX_PTR ppBuf[MAX_BUFFER_PLANE];
+                OMX_PTR allocSize[MAX_BUFFER_PLANE];
+                int     plane = 0;
+                if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
+                    Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
+                    ExynosVideoPlane planes[MAX_BUFFER_PLANE];
+
+                    Exynos_OSAL_LockANBHandle((OMX_U32)ppBuf[0], nFrameWidth, nFrameHeight, OMX_COLOR_FormatYUV420SemiPlanar, planes);
+
+                    srcInputData->buffer.multiPlaneBuffer.fd[0] = planes[0].fd;
+                    srcInputData->buffer.multiPlaneBuffer.fd[1] = planes[1].fd;
+                    allocSize[0] = nFrameWidth * nFrameHeight;
+                    allocSize[1] = nFrameWidth * nFrameHeight >> 1;
+
+                    for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                        srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
+                            Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                        if(srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] == NULL) {
+                            srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
+                                Exynos_OSAL_SharedMemory_Map(pVideoEnc->hSharedMemory, allocSize[plane], srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                        }
+                    }
+                    /* input buffers are 2 plane. */
+                    srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
+                    srcInputData->buffer.multiPlaneBuffer.fd[2] = -1;
+                    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__, __LINE__, (unsigned int)ppBuf[0], (unsigned int)ppBuf[0]);
+                } else {
+                    /* kMetadataBufferTypeCameraSource */
+                    Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
+                    srcInputData->buffer.multiPlaneBuffer.fd[0] = ppBuf[0];
+                    srcInputData->buffer.multiPlaneBuffer.fd[1] = ppBuf[1];
+                    allocSize[0] = nFrameWidth * nFrameHeight;
+                    allocSize[1] = nFrameWidth * nFrameHeight >> 1;
+
+                    for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                        srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
+                            Exynos_OSAL_SharedMemory_IONToVirt(pVideoEnc->hSharedMemory, srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                        if(srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] == NULL) {
+                            srcInputData->buffer.multiPlaneBuffer.dataBuffer[plane] =
+                                Exynos_OSAL_SharedMemory_Map(pVideoEnc->hSharedMemory, allocSize[plane], srcInputData->buffer.multiPlaneBuffer.fd[plane]);
+                        }
+                    }
+                    /* input buffers are 2 plane. */
+                    srcInputData->buffer.multiPlaneBuffer.dataBuffer[2] = NULL;
+                    srcInputData->buffer.multiPlaneBuffer.fd[2] = -1;
+                    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s:%d YAddr: 0x%x CbCrAddr: 0x%x", __FUNCTION__, __LINE__, (unsigned int)ppBuf[0], (unsigned int)ppBuf[0]);
+                }
+            }
+#endif
+            /* reset dataBuffer */
+            Exynos_ResetDataBuffer(inputUseBuffer);
+        } else if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
+            checkInputStreamLen = inputUseBuffer->remainDataLen;
+
+            pExynosComponent->bUseFlagEOF = OMX_TRUE;
+
+            if (checkInputStreamLen == 0) {
+                inputUseBuffer->nFlags |= OMX_BUFFERFLAG_EOS;
+                flagEOS = OMX_TRUE;
+            }
+
+            copySize = checkInputStreamLen;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
+
+            if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) {
+                Exynos_CSC_InputData(pOMXComponent, srcInputData);
+
+                inputUseBuffer->dataLen -= copySize;
+                inputUseBuffer->remainDataLen -= copySize;
+                inputUseBuffer->usedDataLen += copySize;
+
+                srcInputData->dataLen += copySize;
+                srcInputData->remainDataLen += copySize;
+
+                srcInputData->timeStamp = inputUseBuffer->timeStamp;
+                srcInputData->nFlags = inputUseBuffer->nFlags;
+                srcInputData->bufferHeader = inputUseBuffer->bufferHeader;
+            } else {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "input codec buffer is smaller than decoded input data size Out Length");
+                pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                        pExynosComponent->callbackData,
+                                                        OMX_EventError, OMX_ErrorUndefined, 0, NULL);
+                ret = OMX_FALSE;
+            }
+
+            if (((exynosInputPort->bStoreMetaData == OMX_TRUE) && (eColorFormat == OMX_COLOR_FormatAndroidOpaque)) ||
+                (exynosInputPort->bStoreMetaData == OMX_FALSE)) {
+                Exynos_InputBufferReturn(pOMXComponent);
+            } else {
+                inputUseBuffer->dataValid = OMX_TRUE;
+            }
+        }
+
+        if ((srcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) {
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "bSaveFlagEOS : OMX_TRUE");
+            srcInputData->dataLen = 0;
+            srcInputData->remainDataLen = 0;
+            pExynosComponent->bSaveFlagEOS = OMX_TRUE;
+        }
+
+        if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
+            pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_TRUE;
+            pExynosComponent->checkTimeStamp.startTimeStamp = srcInputData->timeStamp;
+            pExynosComponent->checkTimeStamp.nStartFlags = srcInputData->nFlags;
+            pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "first frame timestamp after seeking %lld us (%.2f secs)",
+                            srcInputData->timeStamp, srcInputData->timeStamp / 1E6);
+        }
+
+        ret = OMX_TRUE;
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *dstOutputData)
+{
+    OMX_BOOL                  ret = OMX_FALSE;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *outputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
+    OMX_U32                   copySize = 0;
+
+    FunctionIn();
+
+    if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if (Exynos_Shared_DataToBuffer(dstOutputData, outputUseBuffer) == OMX_ErrorNone)
+            outputUseBuffer->dataValid = OMX_TRUE;
+    }
+
+    if (outputUseBuffer->dataValid == OMX_TRUE) {
+        if (pExynosComponent->checkTimeStamp.needCheckStartTimeStamp == OMX_TRUE) {
+            if (pExynosComponent->checkTimeStamp.startTimeStamp == dstOutputData->timeStamp){
+                pExynosComponent->checkTimeStamp.startTimeStamp = -19761123;
+                pExynosComponent->checkTimeStamp.nStartFlags = 0x0;
+                pExynosComponent->checkTimeStamp.needSetStartTimeStamp = OMX_FALSE;
+                pExynosComponent->checkTimeStamp.needCheckStartTimeStamp = OMX_FALSE;
+            } else {
+                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "garbage frame drop after flush");
+                ret = OMX_TRUE;
+                goto EXIT;
+            }
+        } else if (pExynosComponent->checkTimeStamp.needSetStartTimeStamp == OMX_TRUE) {
+            ret = OMX_TRUE;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input buffer has not come after flush.");
+            goto EXIT;
+        }
+
+        if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            if (dstOutputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) {
+                copySize = dstOutputData->remainDataLen;
+                if (copySize > 0)
+                    Exynos_OSAL_Memcpy((outputUseBuffer->bufferHeader->pBuffer + outputUseBuffer->dataLen),
+                                       (dstOutputData->buffer.singlePlaneBuffer.dataBuffer + dstOutputData->usedDataLen),
+                                       copySize);
+                outputUseBuffer->dataLen += copySize;
+                outputUseBuffer->remainDataLen += copySize;
+                outputUseBuffer->nFlags = dstOutputData->nFlags;
+                outputUseBuffer->timeStamp = dstOutputData->timeStamp;
+
+                ret = OMX_TRUE;
+
+                if ((outputUseBuffer->remainDataLen > 0) ||
+                    (outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS)) {
+                    Exynos_OutputBufferReturn(pOMXComponent);
+                }
+            } else {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "output buffer is smaller than encoded data size Out Length");
+                pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                        pExynosComponent->callbackData,
+                                                        OMX_EventError, OMX_ErrorUndefined, 0, NULL);
+                ret = OMX_FALSE;
+            }
+        } else if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+            if ((outputUseBuffer->remainDataLen > 0) ||
+                ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
+                (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)))
+                Exynos_OutputBufferReturn(pOMXComponent);
+        }
+    } else {
+        ret = OMX_FALSE;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+#ifdef USE_METADATABUFFERTYPE
+OMX_ERRORTYPE Exynos_OMX_ExtensionSetup(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
+    EXYNOS_OMX_DATA          *pSrcInputData = &exynosInputPort->processData;
+    OMX_COLOR_FORMATTYPE      eColorFormat = exynosInputPort->portDefinition.format.video.eColorFormat;
+
+    int i = 0;
+    OMX_PTR ppBuf[MAX_BUFFER_PLANE];
+
+
+    /* kMetadataBufferTypeGrallocSource */
+    if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
+        Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)srcInputUseBuffer->bufferHeader->pBuffer, ppBuf);
+        if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
+            pVideoEnc->ANBColorFormat = Exynos_OSAL_GetANBColorFormat(ppBuf[0]);
+            if ((pVideoEnc->ANBColorFormat == OMX_COLOR_FormatYUV420SemiPlanar) ||
+                (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)) {
+                exynosInputPort->bufferProcessType = BUFFER_SHARE;
+            } else {
+                exynosInputPort->bufferProcessType = BUFFER_COPY;
+            }
+
+            if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                Exynos_OSAL_SemaphoreCreate(&exynosInputPort->codecSemID);
+                Exynos_OSAL_QueueCreate(&exynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+
+                for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+                    pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
+                    /* Use ION Allocator */
+                    /*Alloc Y-Buffer */
+                    pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
+                    pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+                    pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
+                    /*Alloc C-Buffer */
+                    pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
+                    pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+                    pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
+
+                    pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
+
+                    if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) ||
+                        (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) {
+                        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+                        ret = OMX_ErrorInsufficientResources;
+                        goto EXIT;
+                    }
+
+                    /* MFC input buffers are 1 plane. */
+                    pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
+                    pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
+                    pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
+
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+
+                    Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
+                }
+            } else if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
+                /*************/
+                /*    TBD    */
+                /*************/
+                /* Does not require any actions. */
+            }
+        }
+    }
+
+
+EXIT:
+
+    return ret;
+}
+#endif
+
+OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *srcInputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.inputDataBuffer;
+    EXYNOS_OMX_DATA          *pSrcInputData = &exynosInputPort->processData;
+    OMX_BOOL               bCheckInputData = OMX_FALSE;
+    OMX_BOOL               bValidCodecData = OMX_FALSE;
+
+    FunctionIn();
+
+    while (!pVideoEnc->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+        Exynos_Wait_ProcessPause(pExynosComponent, INPUT_PORT_INDEX);
+
+        while ((Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) &&
+               (!pVideoEnc->bExitBufferProcessThread)) {
+            Exynos_OSAL_SleepMillisec(0);
+
+            if (CHECK_PORT_BEING_FLUSHED(exynosInputPort))
+                break;
+            if (exynosInputPort->portState != OMX_StateIdle)
+                break;
+
+            Exynos_OSAL_MutexLock(srcInputUseBuffer->bufferMutex);
+            if (pVideoEnc->bFirstInput == OMX_FALSE) {
+                if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                    OMX_PTR codecBuffer;
+                    if ((pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[0] == NULL) || (pSrcInputData->pPrivate == NULL)) {
+                        Exynos_CodecBufferDeQueue(pExynosComponent, INPUT_PORT_INDEX, &codecBuffer);
+                        if (codecBuffer != NULL) {
+                            Exynos_Input_CodecBufferToData(pExynosComponent, codecBuffer, pSrcInputData);
+                        }
+                        Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+                        break;
+                    }
+                }
+
+                if (srcInputUseBuffer->dataValid == OMX_TRUE) {
+                    bCheckInputData = Exynos_Preprocessor_InputData(pOMXComponent, pSrcInputData);
+                } else {
+                    bCheckInputData = OMX_FALSE;
+                }
+            }
+            if ((bCheckInputData == OMX_FALSE) &&
+                (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
+                ret = Exynos_InputBufferGetQueue(pExynosComponent);
+#ifdef USE_METADATABUFFERTYPE
+                if ((pVideoEnc->bFirstInput == OMX_TRUE) &&
+                    (!CHECK_PORT_BEING_FLUSHED(exynosInputPort))) {
+                    Exynos_OMX_ExtensionSetup(hComponent);
+                    pVideoEnc->bFirstInput = OMX_FALSE;
+                }
+#endif
+                Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+                break;
+            }
+
+            if (CHECK_PORT_BEING_FLUSHED(exynosInputPort)) {
+                Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+                break;
+            }
+
+            ret = pVideoEnc->exynos_codec_srcInputProcess(pOMXComponent, pSrcInputData);
+            Exynos_ResetCodecData(pSrcInputData);
+            Exynos_OSAL_MutexUnlock(srcInputUseBuffer->bufferMutex);
+            if (ret == OMX_ErrorCodecInit)
+                pVideoEnc->bExitBufferProcessThread = OMX_TRUE;
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *srcOutputUseBuffer = &exynosInputPort->way.port2WayDataBuffer.outputDataBuffer;
+    EXYNOS_OMX_DATA           srcOutputData; 
+
+    FunctionIn();
+
+    while (!pVideoEnc->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+
+        while (!pVideoEnc->bExitBufferProcessThread) {
+            if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                if (Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX) == OMX_FALSE)
+                    break;
+            }
+            Exynos_OSAL_SleepMillisec(0);
+
+            if (CHECK_PORT_BEING_FLUSHED(exynosInputPort))
+                break;
+
+            Exynos_OSAL_MutexLock(srcOutputUseBuffer->bufferMutex);
+            ret = pVideoEnc->exynos_codec_srcOutputProcess(pOMXComponent, &srcOutputData);
+
+            if (ret == OMX_ErrorNone) {
+                if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                    OMX_PTR codecBuffer;
+                    codecBuffer = srcOutputData.pPrivate;
+                    if (codecBuffer != NULL)
+                        Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, codecBuffer);
+                }
+                if (exynosInputPort->bufferProcessType == BUFFER_SHARE) {
+                    Exynos_Shared_DataToBuffer(&srcOutputData, srcOutputUseBuffer);
+                    Exynos_InputBufferReturn(pOMXComponent);
+                }
+                Exynos_ResetCodecData(&srcOutputData);
+            }
+            Exynos_OSAL_MutexUnlock(srcOutputUseBuffer->bufferMutex);
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *dstInputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.inputDataBuffer;
+    EXYNOS_OMX_DATA           dstInputData;
+    
+    FunctionIn();
+
+    while (!pVideoEnc->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+
+        while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
+               (!pVideoEnc->bExitBufferProcessThread)) {
+            Exynos_OSAL_SleepMillisec(0);
+
+            if ((CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) ||
+                (!CHECK_PORT_POPULATED(exynosOutputPort)))
+                break;
+            if (exynosOutputPort->portState != OMX_StateIdle)
+                break;
+
+            Exynos_OSAL_MutexLock(dstInputUseBuffer->bufferMutex);
+            if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                OMX_PTR codecBuffer;
+                ret = Exynos_CodecBufferDeQueue(pExynosComponent, OUTPUT_PORT_INDEX, &codecBuffer);
+                if (ret != OMX_ErrorNone) {
+                    Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+                    break;
+                }
+                Exynos_Output_CodecBufferToData(pExynosComponent, codecBuffer, &dstInputData);
+            }
+
+            if (exynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+                if ((dstInputUseBuffer->dataValid != OMX_TRUE) &&
+                    (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
+                    ret = Exynos_OutputBufferGetQueue(pExynosComponent);
+                    if (ret != OMX_ErrorNone) {
+                        Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+                        break;
+                    }
+                    Exynos_Shared_BufferToData(dstInputUseBuffer, &dstInputData, ONE_PLANE);
+                    Exynos_ResetDataBuffer(dstInputUseBuffer);
+                }
+            }
+
+            if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort)) {
+                Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+                break;
+            }
+            ret = pVideoEnc->exynos_codec_dstInputProcess(pOMXComponent, &dstInputData);
+
+            Exynos_ResetCodecData(&dstInputData);
+            Exynos_OSAL_MutexUnlock(dstInputUseBuffer->bufferMutex);
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *exynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_DATABUFFER    *dstOutputUseBuffer = &exynosOutputPort->way.port2WayDataBuffer.outputDataBuffer;
+    EXYNOS_OMX_DATA          *pDstOutputData = &exynosOutputPort->processData;
+    
+    FunctionIn();
+
+    while (!pVideoEnc->bExitBufferProcessThread) {
+        Exynos_OSAL_SleepMillisec(0);
+        Exynos_Wait_ProcessPause(pExynosComponent, OUTPUT_PORT_INDEX);
+
+        while ((Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) &&
+               (!pVideoEnc->bExitBufferProcessThread)) {
+            Exynos_OSAL_SleepMillisec(0);
+
+            if (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))
+                break;
+
+            Exynos_OSAL_MutexLock(dstOutputUseBuffer->bufferMutex);
+            if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                if ((dstOutputUseBuffer->dataValid != OMX_TRUE) &&
+                    (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
+                    ret = Exynos_OutputBufferGetQueue(pExynosComponent);
+                    if (ret != OMX_ErrorNone) {
+                        Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
+                        break;
+                    }
+                }
+            }
+
+            if ((dstOutputUseBuffer->dataValid == OMX_TRUE) ||
+                (exynosOutputPort->bufferProcessType == BUFFER_SHARE))
+                ret = pVideoEnc->exynos_codec_dstOutputProcess(pOMXComponent, pDstOutputData);
+
+            if (((ret == OMX_ErrorNone) && (dstOutputUseBuffer->dataValid == OMX_TRUE)) ||
+                (exynosOutputPort->bufferProcessType == BUFFER_SHARE)) {
+                Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData);
+            }
+
+            if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+                OMX_PTR codecBuffer;
+                codecBuffer = pDstOutputData->pPrivate;
+                if (codecBuffer != NULL) {
+                    Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer);
+                    pDstOutputData->pPrivate = NULL;
+                }
+            }
+
+            /* reset outputData */
+            Exynos_ResetCodecData(pDstOutputData);
+            Exynos_OSAL_MutexUnlock(dstOutputUseBuffer->bufferMutex);
+        }
+    }
+
+EXIT:
+
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_SrcInputProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_SrcInputBufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_SrcOutputProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_SrcOutputBufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_DstInputProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_DstInputBufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+static OMX_ERRORTYPE Exynos_OMX_DstOutputProcessThread(OMX_PTR threadData)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_OMX_MESSAGE       *message = NULL;
+
+    FunctionIn();
+
+    if (threadData == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)threadData;
+    ret = Exynos_OMX_Check_SizeVersion(pOMXComponent, sizeof(OMX_COMPONENTTYPE));
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    Exynos_OMX_DstOutputBufferProcess(pOMXComponent);
+
+    Exynos_OSAL_ThreadExit(NULL);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferProcess_Create(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    FunctionIn();
+
+    pVideoEnc->bExitBufferProcessThread = OMX_FALSE;
+
+    ret = Exynos_OSAL_ThreadCreate(&pVideoEnc->hDstOutputThread,
+                 Exynos_OMX_DstOutputProcessThread,
+                 pOMXComponent);
+    if (ret == OMX_ErrorNone)
+        ret = Exynos_OSAL_ThreadCreate(&pVideoEnc->hSrcOutputThread,
+                     Exynos_OMX_SrcOutputProcessThread,
+                     pOMXComponent);
+    if (ret == OMX_ErrorNone)
+        ret = Exynos_OSAL_ThreadCreate(&pVideoEnc->hDstInputThread,
+                     Exynos_OMX_DstInputProcessThread,
+                     pOMXComponent);
+    if (ret == OMX_ErrorNone)
+        ret = Exynos_OSAL_ThreadCreate(&pVideoEnc->hSrcInputThread,
+                     Exynos_OMX_SrcInputProcessThread,
+                     pOMXComponent);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_BufferProcess_Terminate(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE          ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE     *pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    OMX_S32                countValue = 0;
+    unsigned int           i = 0;
+
+    FunctionIn();
+
+    pVideoEnc->bExitBufferProcessThread = OMX_TRUE;
+
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID, &countValue);
+    if (countValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].bufferSemID);
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID, &countValue);
+    if (countValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].codecSemID);
+    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pVideoEnc->hSrcInputThread);
+    pVideoEnc->hSrcInputThread = NULL;
+
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID, &countValue);
+    if (countValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].bufferSemID);
+    Exynos_OSAL_Get_SemaphoreCount(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID, &countValue);
+    if (countValue == 0)
+        Exynos_OSAL_SemaphorePost(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].codecSemID);
+    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pVideoEnc->hDstInputThread);
+    pVideoEnc->hDstInputThread = NULL;
+
+    pVideoEnc->exynos_codec_stop(pOMXComponent, INPUT_PORT_INDEX);
+    pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
+    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[INPUT_PORT_INDEX].pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pVideoEnc->hSrcOutputThread);
+    pVideoEnc->hSrcOutputThread = NULL;
+
+    pVideoEnc->exynos_codec_stop(pOMXComponent, OUTPUT_PORT_INDEX);
+    pVideoEnc->exynos_codec_bufferProcessRun(pOMXComponent, INPUT_PORT_INDEX);
+    Exynos_OSAL_SignalSet(pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].pauseEvent);
+    Exynos_OSAL_ThreadTerminate(pVideoEnc->hDstOutputThread);
+    pVideoEnc->hDstOutputThread = NULL;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = 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) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    ret = Exynos_OMX_BaseComponent_Constructor(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    ret = Exynos_OMX_Port_Constructor(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+
+    pVideoEnc = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_VIDEOENC_COMPONENT));
+    if (pVideoEnc == NULL) {
+        Exynos_OMX_BaseComponent_Destructor(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Memset(pVideoEnc, 0, sizeof(EXYNOS_OMX_VIDEOENC_COMPONENT));
+    pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoEnc;
+
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+
+    pVideoEnc->bFirstInput  = OMX_FALSE;
+    pVideoEnc->bFirstOutput = OMX_FALSE;
+    pVideoEnc->configChange = OMX_FALSE;
+    pVideoEnc->quantization.nQpI = 4; // I frame quantization parameter
+    pVideoEnc->quantization.nQpP = 5; // P frame quantization parameter
+    pVideoEnc->quantization.nQpB = 5; // B frame quantization parameter
+
+    pExynosComponent->bMultiThreadProcess = OMX_TRUE;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_INPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_INPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferSize = 0;
+    pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
+
+    pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+
+    pExynosPort->portDefinition.format.video.nFrameWidth = 0;
+    pExynosPort->portDefinition.format.video.nFrameHeight= 0;
+    pExynosPort->portDefinition.format.video.nStride = 0;
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.format.video.nBitrate = 64000;
+    pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
+    pVideoEnc->eControlRate[INPUT_PORT_INDEX] = OMX_Video_ControlRateDisable;
+
+    pExynosPort->bStoreMetaData = OMX_FALSE;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.nBufferCountActual = MAX_VIDEO_OUTPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferCountMin = MAX_VIDEO_OUTPUTBUFFER_NUM;
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.eDomain = OMX_PortDomainVideo;
+
+    pExynosPort->portDefinition.format.video.cMIMEType = Exynos_OSAL_Malloc(MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+
+    pExynosPort->portDefinition.format.video.nFrameWidth = 0;
+    pExynosPort->portDefinition.format.video.nFrameHeight= 0;
+    pExynosPort->portDefinition.format.video.nStride = 0;
+    pExynosPort->portDefinition.format.video.nSliceHeight = 0;
+    pExynosPort->portDefinition.format.video.nBitrate = 64000;
+    pExynosPort->portDefinition.format.video.xFramerate = (15 << 16);
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.format.video.pNativeWindow = NULL;
+    pVideoEnc->eControlRate[OUTPUT_PORT_INDEX] = OMX_Video_ControlRateDisable;
+
+    pOMXComponent->UseBuffer              = &Exynos_OMX_UseBuffer;
+    pOMXComponent->AllocateBuffer         = &Exynos_OMX_AllocateBuffer;
+    pOMXComponent->FreeBuffer             = &Exynos_OMX_FreeBuffer;
+    pOMXComponent->ComponentTunnelRequest = &Exynos_OMX_ComponentTunnelRequest;
+
+    pExynosComponent->exynos_AllocateTunnelBuffer = &Exynos_OMX_AllocateTunnelBuffer;
+    pExynosComponent->exynos_FreeTunnelBuffer     = &Exynos_OMX_FreeTunnelBuffer;
+    pExynosComponent->exynos_BufferProcessCreate    = &Exynos_OMX_BufferProcess_Create;
+    pExynosComponent->exynos_BufferProcessTerminate = &Exynos_OMX_BufferProcess_Terminate;
+    pExynosComponent->exynos_BufferFlush          = &Exynos_OMX_BufferFlush;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    int                            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;
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_Free(pVideoEnc);
+    pExynosComponent->hComponentHandle = pVideoEnc = NULL;
+
+    for(i = 0; i < ALL_PORT_NUM; i++) {
+        pExynosPort = &pExynosComponent->pExynosPort[i];
+        Exynos_OSAL_Free(pExynosPort->portDefinition.format.video.cMIMEType);
+        pExynosPort->portDefinition.format.video.cMIMEType = NULL;
+    }
+
+    ret = Exynos_OMX_Port_Destructor(pOMXComponent);
+
+    ret = Exynos_OMX_BaseComponent_Destructor(hComponent);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/video/enc/Exynos_OMX_Venc.h b/component/video/enc/Exynos_OMX_Venc.h
new file mode 100644 (file)
index 0000000..cb5f110
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ *
+ * 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_Venc.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ *              Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_VIDEO_ENCODE
+#define EXYNOS_OMX_VIDEO_ENCODE
+
+#include "OMX_Component.h"
+#include "Exynos_OMX_Def.h"
+#include "Exynos_OSAL_Queue.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Basecomponent.h"
+#include "ExynosVideoApi.h"
+
+#define MAX_VIDEO_INPUTBUFFER_NUM    5
+#define MAX_VIDEO_OUTPUTBUFFER_NUM   4
+
+#define DEFAULT_FRAME_WIDTH          176
+#define DEFAULT_FRAME_HEIGHT         144
+
+#define DEFAULT_VIDEO_INPUT_BUFFER_SIZE    (ALIGN_TO_16B(DEFAULT_FRAME_WIDTH) * ALIGN_TO_16B(DEFAULT_FRAME_HEIGHT) + \
+                                                                                ALIGN((ALIGN_TO_16B(DEFAULT_FRAME_WIDTH) * ALIGN_TO_16B(DEFAULT_FRAME_HEIGHT))/2,256))
+#define DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE   (DEFAULT_FRAME_WIDTH * DEFAULT_FRAME_HEIGHT) * 2
+
+#define MFC_INPUT_BUFFER_NUM_MAX            3
+#define MFC_OUTPUT_BUFFER_NUM_MAX           4
+
+#define DEFAULT_MFC_INPUT_YBUFFER_SIZE      ALIGN_TO_16B(1920) * ALIGN_TO_16B(1080)
+#define DEFAULT_MFC_INPUT_CBUFFER_SIZE      ALIGN((DEFAULT_MFC_INPUT_YBUFFER_SIZE / 2), 256)
+#define DEFAULT_MFC_OUTPUT_BUFFER_SIZE      1920 * 1080 * 3 / 2
+
+#define INPUT_PORT_SUPPORTFORMAT_NUM_MAX    5
+#define OUTPUT_PORT_SUPPORTFORMAT_NUM_MAX   1
+
+#define MFC_INPUT_BUFFER_PLANE              2
+#define MFC_OUTPUT_BUFFER_PLANE             1
+
+#define MAX_INPUTBUFFER_NUM_DYNAMIC         0 /* Dynamic number of metadata buffer */
+
+// The largest metadata buffer size advertised
+// when metadata buffer mode is used for video encoding
+#define  MAX_INPUT_METADATA_BUFFER_SIZE (64)
+
+typedef struct
+{
+    void *pAddrY;
+    void *pAddrC;
+} CODEC_ENC_ADDR_INFO;
+
+typedef struct _CODEC_ENC_BUFFER
+{
+    void *pVirAddr[MAX_BUFFER_PLANE];   /* virtual address   */
+    int   bufferSize[MAX_BUFFER_PLANE]; /* buffer alloc size */
+    int   fd[MAX_BUFFER_PLANE];  /* buffer FD */
+    int   dataSize;              /* total data length */
+} CODEC_ENC_BUFFER;
+
+typedef struct _EXYNOS_OMX_VIDEOENC_COMPONENT
+{
+    OMX_HANDLETYPE hCodecHandle;
+    OMX_BOOL bFirstFrame;
+    CODEC_ENC_BUFFER *pMFCEncInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
+    CODEC_ENC_BUFFER *pMFCEncOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
+
+    /* Buffer Process */
+    OMX_BOOL       bExitBufferProcessThread;
+    OMX_HANDLETYPE hSrcInputThread;
+    OMX_HANDLETYPE hSrcOutputThread;
+    OMX_HANDLETYPE hDstInputThread;
+    OMX_HANDLETYPE hDstOutputThread;
+
+    /* Shared Memory Handle */
+    OMX_HANDLETYPE hSharedMemory;
+
+    OMX_BOOL configChange;
+    OMX_BOOL IntraRefreshVOP;
+    OMX_VIDEO_CONTROLRATETYPE eControlRate[ALL_PORT_NUM];
+    OMX_VIDEO_PARAM_QUANTIZATIONTYPE quantization;
+
+    OMX_BOOL bFirstInput;
+    OMX_BOOL bFirstOutput;
+
+    OMX_COLOR_FORMATTYPE ANBColorFormat;
+
+    /* CSC handle */
+    OMX_PTR csc_handle;
+    OMX_U32 csc_set_format;
+
+    OMX_ERRORTYPE (*exynos_codec_srcInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
+    OMX_ERRORTYPE (*exynos_codec_srcOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pInputData);
+    OMX_ERRORTYPE (*exynos_codec_dstInputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
+    OMX_ERRORTYPE (*exynos_codec_dstOutputProcess) (OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pOutputData);
+
+    OMX_ERRORTYPE (*exynos_codec_start)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
+    OMX_ERRORTYPE (*exynos_codec_stop)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
+    OMX_ERRORTYPE (*exynos_codec_bufferProcessRun)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
+    OMX_ERRORTYPE (*exynos_codec_enqueueAllBuffer)(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex);
+
+    int (*exynos_checkInputFrame) (OMX_U8 *pInputStream, OMX_U32 buffSize, OMX_U32 flag,
+                                   OMX_BOOL bPreviousFrameEOF, OMX_BOOL *pbEndOfFrame);
+    OMX_ERRORTYPE (*exynos_codec_getCodecInputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[]);
+    OMX_ERRORTYPE (*exynos_codec_getCodecOutputPrivateData) (OMX_PTR codecBuffer, OMX_PTR addr, OMX_U32 *size);
+} EXYNOS_OMX_VIDEOENC_COMPONENT;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+inline void Exynos_UpdateFrameSize(OMX_COMPONENTTYPE *pOMXComponent);
+OMX_BOOL Exynos_Check_BufferProcess_State(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 nPortIndex);
+OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
+OMX_ERRORTYPE Exynos_Output_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_PTR codecBuffer, EXYNOS_OMX_DATA *pData);
+
+
+OMX_ERRORTYPE Exynos_OMX_SrcInputBufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_SrcOutputBufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_DstInputBufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hComponent);
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentDeinit(OMX_IN OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/component/video/enc/Exynos_OMX_VencControl.c b/component/video/enc/Exynos_OMX_VencControl.c
new file mode 100644 (file)
index 0000000..e8c8647
--- /dev/null
@@ -0,0 +1,1589 @@
+/*
+ *
+ * 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 *pVideoEnc = NULL;
+    EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
+    OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
+    OMX_U8                *temp_buffer = NULL;
+    int                    temp_buffer_fd = -1;
+    OMX_U32                i = 0;
+    MEMORY_TYPE            mem_type;
+
+    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;
+    pVideoEnc = (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) {
+        mem_type = NORMAL_MEMORY;
+    } else {
+        mem_type = SYSTEM_MEMORY;
+    }
+    temp_buffer = Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, nSizeBytes, mem_type);
+    if (temp_buffer == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    temp_buffer_fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, temp_buffer);
+
+    temp_bufferHeader = (OMX_BUFFERHEADERTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_BUFFERHEADERTYPE));
+    if (temp_bufferHeader == NULL) {
+        Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, temp_buffer);
+        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->extendBufferHeader[i].buf_fd[0] = temp_buffer_fd;
+            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);
+    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, 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 *pVideoEnc = 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;
+    pVideoEnc = (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*/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) {
+                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, 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", 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_ErrorUndefined;
+    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) {
+                Exynos_OSAL_Free(message);
+                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_ErrorUndefined;
+    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) {
+                Exynos_OSAL_Free(message);
+                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_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    OMX_BUFFERHEADERTYPE  *retBuffer = NULL;
+    EXYNOS_OMX_BASEPORT   *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_OMX_MESSAGE    *message = NULL;
+
+    FunctionIn();
+
+    if (pExynosComponent->currentState != OMX_StateExecuting) {
+        retBuffer = NULL;
+        goto EXIT;
+    } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) &&
+               (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){
+        Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID);
+
+        message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ);
+        if (message == NULL) {
+            retBuffer = NULL;
+            goto EXIT;
+        }
+        if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) {
+            Exynos_OSAL_Free(message);
+            retBuffer = NULL;
+            goto EXIT;
+        }
+
+        retBuffer  = (OMX_BUFFERHEADERTYPE *)(message->pCmdData);
+        Exynos_OSAL_Free(message);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return retBuffer;
+}
+
+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;
+}
diff --git a/component/video/enc/Exynos_OMX_VencControl.h b/component/video/enc/Exynos_OMX_VencControl.h
new file mode 100644 (file)
index 0000000..61bd7bb
--- /dev/null
@@ -0,0 +1,100 @@
+/*\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.h\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
+#ifndef EXYNOS_OMX_VIDEO_ENCODECONTROL\r
+#define EXYNOS_OMX_VIDEO_ENCODECONTROL\r
+\r
+#include "OMX_Component.h"\r
+#include "Exynos_OMX_Def.h"\r
+#include "Exynos_OSAL_Queue.h"\r
+#include "Exynos_OMX_Baseport.h"\r
+#include "Exynos_OMX_Basecomponent.h"\r
+\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\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
+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
+OMX_ERRORTYPE Exynos_OMX_FreeBuffer(\r
+    OMX_IN OMX_HANDLETYPE hComponent,\r
+    OMX_IN OMX_U32        nPortIndex,\r
+    OMX_IN OMX_BUFFERHEADERTYPE *pBufferHdr);\r
+OMX_ERRORTYPE Exynos_OMX_AllocateTunnelBuffer(\r
+    EXYNOS_OMX_BASEPORT *pOMXBasePort,\r
+    OMX_U32           nPortIndex);\r
+OMX_ERRORTYPE Exynos_OMX_FreeTunnelBuffer(\r
+    EXYNOS_OMX_BASEPORT *pOMXBasePort,\r
+    OMX_U32           nPortIndex);\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
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetParameter(\r
+    OMX_IN OMX_HANDLETYPE hComponent,\r
+    OMX_IN OMX_INDEXTYPE  nParamIndex,\r
+    OMX_INOUT OMX_PTR     ComponentParameterStructure);\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
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeGetConfig(\r
+    OMX_HANDLETYPE hComponent,\r
+    OMX_INDEXTYPE nIndex,\r
+    OMX_PTR pComponentConfigStructure);\r
+OMX_ERRORTYPE Exynos_OMX_VideoEncodeSetConfig(\r
+    OMX_HANDLETYPE hComponent,\r
+    OMX_INDEXTYPE nIndex,\r
+    OMX_PTR pComponentConfigStructure);\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
+OMX_ERRORTYPE Exynos_InputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent);\r
+OMX_ERRORTYPE Exynos_OutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent);\r
+OMX_ERRORTYPE Exynos_OMX_BufferFlush(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 nPortIndex, OMX_BOOL bEvent);\r
+OMX_ERRORTYPE Exynos_FlushInputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer);\r
+OMX_ERRORTYPE Exynos_FlushOutputBufferReturn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *dataBuffer);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif\r
+\r
diff --git a/component/video/enc/h264/Android.mk b/component/video/enc/h264/Android.mk
new file mode 100644 (file)
index 0000000..9a9174e
--- /dev/null
@@ -0,0 +1,38 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_H264enc.c \
+       library_register.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libOMX.Exynos.AVC.Encoder
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/omx
+
+LOCAL_CFLAGS :=
+
+ifeq ($(BOARD_USE_METADATABUFFERTYPE), true)
+LOCAL_CFLAGS += -DUSE_METADATABUFFERTYPE
+endif
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_Venc libExynosOMX_OSAL libExynosOMX_Basecomponent \
+       libswconverter libExynosVideoApi
+
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libui \
+       libExynosOMX_Resourcemanager libcsc libexynosv4l2 libion_exynos
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/video/enc \
+       hardware/samsung_slsi/exynos5/include \
+       hardware/samsung_slsi/exynos5/libcsc \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/component/video/enc/h264/Exynos_OMX_H264enc.c b/component/video/enc/h264/Exynos_OMX_H264enc.c
new file mode 100644 (file)
index 0000000..1e110b0
--- /dev/null
@@ -0,0 +1,2354 @@
+/*
+ *
+ * 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_H264enc.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_OMX_Basecomponent.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Venc.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Thread.h"
+#include "Exynos_OSAL_Android.h"
+#include "library_register.h"
+#include "Exynos_OMX_H264enc.h"
+#include "ExynosVideoApi.h"
+#include "Exynos_OSAL_SharedMemory.h"
+#include "Exynos_OSAL_Event.h"
+
+/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
+/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
+#include "csc.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_H264_ENC"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+/* H.264 Encoder Supported Levels & profiles */
+EXYNOS_OMX_VIDEO_PROFILELEVEL supportedAVCProfileLevels[] ={
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel1b},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel11},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel12},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel13},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel2},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel21},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel22},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel3},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel31},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel32},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel4},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel41},
+    {OMX_VIDEO_AVCProfileBaseline, OMX_VIDEO_AVCLevel42},
+
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel1b},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel11},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel12},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel13},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel2},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel21},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel22},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel3},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel31},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel32},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel4},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel41},
+    {OMX_VIDEO_AVCProfileMain, OMX_VIDEO_AVCLevel42},
+
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel1b},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel11},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel12},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel13},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel2},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel21},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel22},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel3},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel31},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel32},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel4},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel41},
+    {OMX_VIDEO_AVCProfileHigh, OMX_VIDEO_AVCLevel42}};
+
+static OMX_U32 OMXAVCProfileToProfileIDC(OMX_VIDEO_AVCPROFILETYPE profile)
+{
+    OMX_U32 ret = 0;
+
+    if (profile == OMX_VIDEO_AVCProfileBaseline)
+        ret = 0;
+    else if (profile == OMX_VIDEO_AVCProfileMain)
+        ret = 2;
+    else if (profile == OMX_VIDEO_AVCProfileHigh)
+        ret = 4;
+
+    return ret;
+}
+
+static OMX_U32 OMXAVCLevelToLevelIDC(OMX_VIDEO_AVCLEVELTYPE level)
+{
+    OMX_U32 ret = 11; //default OMX_VIDEO_AVCLevel4
+
+    if (level == OMX_VIDEO_AVCLevel1)
+        ret = 0;
+    else if (level == OMX_VIDEO_AVCLevel1b)
+        ret = 1;
+    else if (level == OMX_VIDEO_AVCLevel11)
+        ret = 2;
+    else if (level == OMX_VIDEO_AVCLevel12)
+        ret = 3;
+    else if (level == OMX_VIDEO_AVCLevel13)
+        ret = 4;
+    else if (level == OMX_VIDEO_AVCLevel2)
+        ret = 5;
+    else if (level == OMX_VIDEO_AVCLevel21)
+        ret = 6;
+    else if (level == OMX_VIDEO_AVCLevel22)
+        ret = 7;
+    else if (level == OMX_VIDEO_AVCLevel3)
+        ret = 8;
+    else if (level == OMX_VIDEO_AVCLevel31)
+        ret = 9;
+    else if (level == OMX_VIDEO_AVCLevel32)
+        ret = 10;
+    else if (level == OMX_VIDEO_AVCLevel4)
+        ret = 11;
+    else if (level == OMX_VIDEO_AVCLevel41)
+        ret = 12;
+    else if (level == OMX_VIDEO_AVCLevel42)
+        ret = 13;
+
+    return ret;
+}
+
+static OMX_U8 *FindDelimiter(OMX_U8 *pBuffer, OMX_U32 size)
+{
+    OMX_U32 i;
+
+    for (i = 0; i < size - 3; i++) {
+        if ((pBuffer[i] == 0x00)   &&
+            (pBuffer[i + 1] == 0x00) &&
+            (pBuffer[i + 2] == 0x00) &&
+            (pBuffer[i + 3] == 0x01))
+            return (pBuffer + i);
+    }
+
+    return NULL;
+}
+
+static void Print_H264Enc_Param(ExynosVideoEncParam *pEncParam)
+{
+    ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam;
+    ExynosVideoEncH264Param   *pH264Param   = &pEncParam->codecParam.h264;
+
+    /* common parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth             : %d", pCommonParam->SourceWidth);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight            : %d", pCommonParam->SourceHeight);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod               : %d", pCommonParam->IDRPeriod);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode               : %d", pCommonParam->SliceMode);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh    : %d", pCommonParam->RandomIntraMBRefresh);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate                 : %d", pCommonParam->Bitrate);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp                 : %d", pCommonParam->FrameQp);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P               : %d", pCommonParam->FrameQp_P);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax              : %d", pCommonParam->QSCodeMax);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin               : %d", pCommonParam->QSCodeMin);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn            : %d", pCommonParam->PadControlOn);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal              : %d", pCommonParam->LumaPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal                : %d", pCommonParam->CbPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal                : %d", pCommonParam->CrPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap                : %d", pCommonParam->FrameMap);
+
+    /* H.264 specific parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ProfileIDC              : %d", pH264Param->ProfileIDC);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LevelIDC                : %d", pH264Param->LevelIDC);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_B               : %d", pH264Param->FrameQp_B);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameRate               : %d", pH264Param->FrameRate);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceArgument           : %d", pH264Param->SliceArgument);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NumberBFrames           : %d", pH264Param->NumberBFrames);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NumberReferenceFrames   : %d", pH264Param->NumberReferenceFrames);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NumberRefForPframes     : %d", pH264Param->NumberRefForPframes);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LoopFilterDisable       : %d", pH264Param->LoopFilterDisable);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LoopFilterAlphaC0Offset : %d", pH264Param->LoopFilterAlphaC0Offset);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LoopFilterBetaOffset    : %d", pH264Param->LoopFilterBetaOffset);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SymbolMode              : %d", pH264Param->SymbolMode);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PictureInterlace        : %d", pH264Param->PictureInterlace);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Transform8x8Mode        : %d", pH264Param->Transform8x8Mode);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "DarkDisable             : %d", pH264Param->DarkDisable);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SmoothDisable           : %d", pH264Param->SmoothDisable);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "StaticDisable           : %d", pH264Param->StaticDisable);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ActivityDisable         : %d", pH264Param->ActivityDisable);
+
+    /* rate control related parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl    : %d", pCommonParam->EnableFRMRateControl);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl     : %d", pCommonParam->EnableMBRateControl);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf             : %d", pCommonParam->CBRPeriodRf);
+}
+
+static void Set_H264Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc          = NULL;
+    EXYNOS_MFC_H264ENC_HANDLE     *pMFCH264Handle    = NULL;
+
+    ExynosVideoEncParam       *pEncParam    = NULL;
+    ExynosVideoEncCommonParam *pCommonParam = NULL;
+    ExynosVideoEncH264Param   *pH264Param   = NULL;
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    pMFCH264Handle = &pH264Enc->hMFCH264Handle;
+    pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    pEncParam = &pMFCH264Handle->encParam;
+    pCommonParam = &pEncParam->commonParam;
+    pH264Param = &pEncParam->codecParam.h264;
+    pEncParam->eCompressionFormat = VIDEO_CODING_AVC;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat);
+
+    /* common parameters */
+    pCommonParam->SourceWidth  = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
+    pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
+    pCommonParam->IDRPeriod    = pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames + 1;
+    pCommonParam->SliceMode    = 0;
+    pCommonParam->RandomIntraMBRefresh = 0;
+    pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
+    pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
+    pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
+    pCommonParam->QSCodeMax    = 51;
+    pCommonParam->QSCodeMin    = 10;
+    pCommonParam->PadControlOn = 0;    /* 0: disable, 1: enable */
+    pCommonParam->LumaPadVal   = 0;
+    pCommonParam->CbPadVal     = 0;
+    pCommonParam->CrPadVal     = 0;
+
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        if (pVideoEnc->ANBColorFormat == OMX_COLOR_FormatYUV420SemiPlanar)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+    } else {
+        switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
+        case OMX_COLOR_FormatYUV420SemiPlanar:
+        case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_CSC_InputData */
+#ifdef USE_METADATABUFFERTYPE
+        case OMX_COLOR_FormatAndroidOpaque:
+#endif
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+            break;
+        case OMX_SEC_COLOR_FormatNV21Linear:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
+            break;
+        case OMX_SEC_COLOR_FormatNV12Tiled:
+        default:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+            break;
+        }
+    }
+
+    /* H.264 specific parameters */
+    pH264Param->ProfileIDC   = OMXAVCProfileToProfileIDC(pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].eProfile);    /*0: OMX_VIDEO_AVCProfileMain */
+    pH264Param->LevelIDC     = OMXAVCLevelToLevelIDC(pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].eLevel);    /*40: OMX_VIDEO_AVCLevel4 */
+    pH264Param->FrameQp_B    = pVideoEnc->quantization.nQpB;
+    pH264Param->FrameRate    = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
+    pH264Param->SliceArgument = 0;    /* Slice mb/byte size number */
+    pH264Param->NumberBFrames = 0;    /* 0 ~ 2 */
+    pH264Param->NumberReferenceFrames = 1;
+    pH264Param->NumberRefForPframes   = 1;
+    pH264Param->LoopFilterDisable     = 1;    /* 1: Loop Filter Disable, 0: Filter Enable */
+    pH264Param->LoopFilterAlphaC0Offset = 0;
+    pH264Param->LoopFilterBetaOffset    = 0;
+    pH264Param->SymbolMode       = 0;    /* 0: CAVLC, 1: CABAC */
+    pH264Param->PictureInterlace = 0;
+    pH264Param->Transform8x8Mode = 0;    /* 0: 4x4, 1: allow 8x8 */
+    pH264Param->DarkDisable     = 1;
+    pH264Param->SmoothDisable   = 1;
+    pH264Param->StaticDisable   = 1;
+    pH264Param->ActivityDisable = 1;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]);
+    /* rate control related parameters */
+    switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) {
+    case OMX_Video_ControlRateDisable:
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode DBR");
+        pCommonParam->EnableFRMRateControl = 0;    /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 0;    /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 100;
+        break;
+    case OMX_Video_ControlRateConstant:
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR");
+        pCommonParam->EnableFRMRateControl = 1;    /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 1;    /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 9;
+        break;
+    case OMX_Video_ControlRateVariable:
+    default: /*Android default */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
+        pCommonParam->EnableFRMRateControl = 1;    /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 1;    /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 100;
+        break;
+    }
+
+    Print_H264Enc_Param(pEncParam);
+}
+
+static void Change_H264Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc          = NULL;
+    EXYNOS_MFC_H264ENC_HANDLE     *pMFCH264Handle    = NULL;
+
+    ExynosVideoEncOps         *pEncOps      = NULL;
+    ExynosVideoEncParam       *pEncParam    = NULL;
+    ExynosVideoEncCommonParam *pCommonParam = NULL;
+    ExynosVideoEncH264Param   *pH264Param   = NULL;
+
+    int setParam = 0;
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    pMFCH264Handle = &pH264Enc->hMFCH264Handle;
+    pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pEncOps = pMFCH264Handle->pEncOps;
+
+    pEncParam = &pMFCH264Handle->encParam;
+    pCommonParam = &pEncParam->commonParam;
+    pH264Param = &pEncParam->codecParam.h264;
+
+    if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) {
+        setParam = VIDEO_FRAME_I;
+        pEncOps->Set_FrameType(pH264Enc->hMFCH264Handle.hMFCHandle, setParam);
+        pVideoEnc->IntraRefreshVOP = OMX_FALSE;
+    }
+    if (pCommonParam->IDRPeriod != (int)pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames + 1) {
+        setParam = pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames + 1;
+        pEncOps->Set_IDRPeriod(pH264Enc->hMFCH264Handle.hMFCHandle, setParam);
+    }
+    if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) {
+        setParam = pExynosOutputPort->portDefinition.format.video.nBitrate;
+        pEncOps->Set_BitRate(pH264Enc->hMFCH264Handle.hMFCHandle, setParam);
+    }
+    if (pH264Param->FrameRate != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) {
+        setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
+        pEncOps->Set_FrameRate(pH264Enc->hMFCH264Handle.hMFCHandle, setParam);
+    }
+
+    Set_H264Enc_Param(pExynosComponent);
+}
+
+OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[])
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, OMX_PTR *pVirtAddr, OMX_U32 *dataSize)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    ExynosVideoBuffer  *pCodecBuffer;
+
+    if (codecBuffer == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
+
+    if (pVirtAddr != NULL)
+        *pVirtAddr = pCodecBuffer->planes[0].addr;
+
+    if (dataSize != NULL)
+        *dataSize = pCodecBuffer->planes[0].allocSize;
+
+    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecOpen(EXYNOS_H264ENC_HANDLE *pH264Enc)
+{
+    OMX_ERRORTYPE           ret = OMX_ErrorNone;
+
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pH264Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    /* alloc ops structure */
+    pEncOps = (ExynosVideoEncOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncOps));
+    pInbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps));
+    pOutbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps));
+
+    if ((pEncOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate encoder ops buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pH264Enc->hMFCH264Handle.pEncOps = pEncOps;
+    pH264Enc->hMFCH264Handle.pInbufOps = pInbufOps;
+    pH264Enc->hMFCH264Handle.pOutbufOps = pOutbufOps;
+
+    /* function pointer mapping */
+    pEncOps->nSize = sizeof(ExynosVideoEncOps);
+    pInbufOps->nSize = sizeof(ExynosVideoEncBufferOps);
+    pOutbufOps->nSize = sizeof(ExynosVideoEncBufferOps);
+
+    Exynos_Video_Register_Encoder(pEncOps, pInbufOps, pOutbufOps);
+
+    /* check mandatory functions for encoder ops */
+    if ((pEncOps->Init == NULL) || (pEncOps->Finalize == NULL) ||
+        (pEncOps->Set_FrameTag == NULL) || (pEncOps->Get_FrameTag == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* check mandatory functions for buffer ops */
+    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
+        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
+        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
+        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
+        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* alloc context, open, querycap */
+    pH264Enc->hMFCH264Handle.hMFCHandle = pH264Enc->hMFCH264Handle.pEncOps->Init(V4L2_MEMORY_DMABUF);
+    if (pH264Enc->hMFCH264Handle.hMFCHandle == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pEncOps != NULL) {
+            Exynos_OSAL_Free(pEncOps);
+            pH264Enc->hMFCH264Handle.pEncOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pH264Enc->hMFCH264Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pH264Enc->hMFCH264Handle.pOutbufOps = NULL;
+        }
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecClose(EXYNOS_H264ENC_HANDLE *pH264Enc)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pH264Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+
+    if (hMFCHandle != NULL) {
+        pEncOps->Finalize(hMFCHandle);
+        hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle = NULL;
+    }
+    if (pOutbufOps != NULL) {
+        Exynos_OSAL_Free(pOutbufOps);
+        pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps = NULL;
+    }
+    if (pInbufOps != NULL) {
+        Exynos_OSAL_Free(pInbufOps);
+        pInbufOps = pH264Enc->hMFCH264Handle.pInbufOps = NULL;
+    }
+    if (pEncOps != NULL) {
+        Exynos_OSAL_Free(pEncOps);
+        pEncOps = pH264Enc->hMFCH264Handle.pEncOps = NULL;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_H264ENC_HANDLE   *pH264Enc = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoEnc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pH264Enc = (EXYNOS_H264ENC_HANDLE *)pVideoEnc->hCodecHandle;
+    if (pH264Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX)
+        pInbufOps->Run(hMFCHandle);
+    else if (nPortIndex == OUTPUT_PORT_INDEX)
+        pOutbufOps->Run(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_H264ENC_HANDLE   *pH264Enc = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoEnc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pH264Enc = (EXYNOS_H264ENC_HANDLE *)pVideoEnc->hCodecHandle;
+    if (pH264Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+
+    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
+        pInbufOps->Stop(hMFCHandle);
+    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
+        pOutbufOps->Stop(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_H264ENC_HANDLE   *pH264Enc = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoEnc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pH264Enc = (EXYNOS_H264ENC_HANDLE *)pVideoEnc->hCodecHandle;
+    if (pH264Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX) {
+        if (pH264Enc->bSourceStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pH264Enc->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    if (nPortIndex == OUTPUT_PORT_INDEX) {
+        if (pH264Enc->bDestinationStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pH264Enc->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    int i, nOutbufs;
+
+    ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+
+    FunctionIn();
+
+    if ((nPortIndex == INPUT_PORT_INDEX) &&
+        (pH264Enc->bSourceStart == OMX_TRUE)) {
+        Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
+
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++)  {
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+
+            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
+        }
+
+        pInbufOps->Clear_Queue(hMFCHandle);
+    } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
+               (pH264Enc->bDestinationStart == OMX_TRUE)) {
+        OMX_U32 dataLen[2] = {0, 0};
+        ExynosVideoBuffer *pBuffer = NULL;
+
+        Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
+
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
+            Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncOutputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncOutputBuffer[i]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+        }
+        pOutbufOps->Clear_Queue(hMFCHandle);
+    } else {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_MFC_H264ENC_HANDLE     *pMFCH264Handle    = &pH264Enc->hMFCH264Handle;
+    void                          *hMFCHandle = pMFCH264Handle->hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32                        oneFrameSize = pSrcInputData->dataLen;
+
+    ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+    ExynosVideoEncParam     *pEncParam    = NULL;
+
+    ExynosVideoGeometry      bufferConf;
+    OMX_U32                  inputBufferNumber = 0;
+    int i, nOutbufs;
+
+    FunctionIn();
+
+    if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
+
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    Set_H264Enc_Param(pExynosComponent);
+    pEncParam = &pMFCH264Handle->encParam;
+    if (pEncOps->Set_EncParam) {
+        if(pEncOps->Set_EncParam(pH264Enc->hMFCH264Handle.hMFCHandle, pEncParam) != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    /* input buffer info: only 3 config values needed */
+    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
+    bufferConf.eColorFormat = pEncParam->commonParam.FrameMap;//VIDEO_COLORFORMAT_NV12;
+    bufferConf.nFrameWidth = pExynosInputPort->portDefinition.format.video.nFrameWidth;
+    bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight;
+    pInbufOps->Set_Shareable(hMFCHandle);
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        inputBufferNumber = MAX_INPUTBUFFER_NUM_DYNAMIC;
+    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* should be done before prepare input buffer */
+        if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    /* set input buffer geometry */
+    if (pInbufOps->Set_Geometry) {
+        if (pInbufOps->Set_Geometry(hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    /* setup input buffer */
+    if (pInbufOps->Setup(hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
+    int plane;
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register input buffer */
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                planes[plane].addr = pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane];
+                planes[plane].allocSize = pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[plane];
+                planes[plane].fd = pVideoEnc->pMFCEncInputBuffer[i]->fd[plane];
+            }
+            if (pInbufOps->Register(hMFCHandle, planes, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
+            /*************/
+            /*    TBD    */
+            /*************/
+            /* Does not require any actions. */
+        } else {
+            ret = OMX_ErrorNotImplemented;
+            goto EXIT;
+        }
+    }
+
+    pH264Enc->hMFCH264Handle.bConfiguredMFCSrc = OMX_TRUE;
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_MFC_H264ENC_HANDLE     *pMFCH264Handle    = &pH264Enc->hMFCH264Handle;
+    void                          *hMFCHandle = pMFCH264Handle->hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+    ExynosVideoGeometry      bufferConf;
+    int i, nOutbufs;
+
+    FunctionIn();
+
+    int OutBufferSize = pExynosOutputPort->portDefinition.format.video.nFrameWidth * pExynosOutputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
+    /* set geometry for output (dst) */
+    if (pOutbufOps->Set_Geometry) {
+        /* output buffer info: only 2 config values needed */
+        bufferConf.eCompressionFormat = VIDEO_CODING_AVC;
+        bufferConf.nSizeImage = OutBufferSize;
+
+        if (pOutbufOps->Set_Geometry(pH264Enc->hMFCH264Handle.hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    /* should be done before prepare output buffer */
+    if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pOutbufOps->Set_Shareable(hMFCHandle);
+    int SetupBufferNumber = 0;
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
+        SetupBufferNumber = MFC_OUTPUT_BUFFER_NUM_MAX;
+    else
+        SetupBufferNumber = pExynosOutputPort->portDefinition.nBufferCountActual;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SetupBufferNumber:%d", SetupBufferNumber);
+
+    if (pOutbufOps->Setup(pH264Enc->hMFCH264Handle.hMFCHandle, SetupBufferNumber) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0};
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register input buffer */
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            ExynosVideoPlane plane;
+            pVideoEnc->pMFCEncOutputBuffer[i] = (CODEC_ENC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
+            pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] =
+                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, OutBufferSize, NORMAL_MEMORY);
+            if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] == NULL) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pVideoEnc->pMFCEncOutputBuffer[i]->fd[0] =
+                Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0]);
+            pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[0] = OutBufferSize;
+
+            plane.addr = pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0];
+            plane.fd = pVideoEnc->pMFCEncOutputBuffer[i]->fd[0];
+            plane.allocSize = pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[0];
+
+            if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr,
+                                (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+        }
+    } else if ((pExynosOutputPort->bufferProcessType & BUFFER_SHARE) == BUFFER_SHARE) {
+        /* Register input buffer */
+        /*************/
+        /*    TBD    */
+        /*************/
+        ExynosVideoPlane plane;
+        for (i = 0; i < pExynosOutputPort->portDefinition.nBufferCountActual; i++) {
+            plane.addr = pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
+            plane.fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[0];
+            plane.allocSize = OutBufferSize;
+            if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer,
+                                   (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+        }
+    }
+
+    /* start header encoding */
+    if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        ExynosVideoBuffer *pVideoBuffer = NULL;
+
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == OMX_ErrorNone) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pOutbufOps->Dequeue", __FUNCTION__, __LINE__);
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "dst:0x%x, src:0x%x, dataSize:%d",
+                            OMXBuffer->pBuffer,
+                            pVideoBuffer->planes[0].addr,
+                            pVideoBuffer->planes[0].dataSize);
+        Exynos_OSAL_Memcpy(OMXBuffer->pBuffer, pVideoBuffer->planes[0].addr, pVideoBuffer->planes[0].dataSize);
+        OMXBuffer->nFilledLen = pVideoBuffer->planes[0].dataSize;
+        OMXBuffer->nOffset = 0;
+        OMXBuffer->nTimeStamp = 0;
+        OMXBuffer->nFlags |= OMX_BUFFERFLAG_CODECCONFIG;
+        OMXBuffer->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
+
+        pVideoEnc->bFirstOutput = OMX_TRUE;
+        ret = OMX_ErrorNone;
+
+        H264CodecStop(pOMXComponent, OUTPUT_PORT_INDEX);
+    }
+    pH264Enc->hMFCH264Handle.bConfiguredMFCDst = OMX_TRUE;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_GetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR     pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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 (nParamIndex) {
+    case OMX_IndexParamVideoAvc:
+    {
+        OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = NULL;
+        EXYNOS_H264ENC_HANDLE   *pH264Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstAVCComponent->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcAVCComponent = &pH264Enc->AVCComponent[pDstAVCComponent->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstAVCComponent, pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H264_ENC_ROLE);
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelQuerySupported:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure;
+        EXYNOS_OMX_VIDEO_PROFILELEVEL *pProfileLevel = NULL;
+        OMX_U32 maxProfileLevelNum = 0;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pProfileLevel = supportedAVCProfileLevels;
+        maxProfileLevelNum = sizeof(supportedAVCProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
+
+        if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
+            ret = OMX_ErrorNoMore;
+            goto EXIT;
+        }
+
+        pProfileLevel += pDstProfileLevel->nProfileIndex;
+        pDstProfileLevel->eProfile = pProfileLevel->profile;
+        pDstProfileLevel->eLevel = pProfileLevel->level;
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelCurrent:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE*)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = NULL;
+        EXYNOS_H264ENC_HANDLE *pH264Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcAVCComponent = &pH264Enc->AVCComponent[pDstProfileLevel->nPortIndex];
+
+        pDstProfileLevel->eProfile = pSrcAVCComponent->eProfile;
+        pDstProfileLevel->eLevel = pSrcAVCComponent->eLevel;
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
+        EXYNOS_H264ENC_HANDLE *pH264Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcErrorCorrectionType = &pH264Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoEncodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_SetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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_IndexParamVideoAvc:
+    {
+        OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = NULL;
+        OMX_VIDEO_PARAM_AVCTYPE *pSrcAVCComponent = (OMX_VIDEO_PARAM_AVCTYPE *)pComponentParameterStructure;
+        EXYNOS_H264ENC_HANDLE   *pH264Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcAVCComponent->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstAVCComponent = &pH264Enc->AVCComponent[pSrcAVCComponent->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstAVCComponent, pSrcAVCComponent, sizeof(OMX_VIDEO_PARAM_AVCTYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+
+        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H264_ENC_ROLE)) {
+            pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+        } else {
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelCurrent:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_AVCTYPE *pDstAVCComponent = NULL;
+        EXYNOS_H264ENC_HANDLE *pH264Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+
+        if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+
+        pDstAVCComponent = &pH264Enc->AVCComponent[pSrcProfileLevel->nPortIndex];
+        pDstAVCComponent->eProfile = pSrcProfileLevel->eProfile;
+        pDstAVCComponent->eLevel = pSrcProfileLevel->eLevel;
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
+        EXYNOS_H264ENC_HANDLE *pH264Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstErrorCorrectionType = &pH264Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoEncodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_GetConfig(
+    OMX_HANDLETYPE hComponent,
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+    EXYNOS_H264ENC_HANDLE    *pH264Enc         = 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;
+    }
+    pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+
+    switch (nIndex) {
+    case OMX_IndexConfigVideoAVCIntraPeriod:
+    {
+        OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pAVCIntraPeriod = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *)pComponentConfigStructure;
+        OMX_U32           portIndex = pAVCIntraPeriod->nPortIndex;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            pAVCIntraPeriod->nIDRPeriod = pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames + 1;
+            pAVCIntraPeriod->nPFrames = pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames;
+        }
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoEncodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_SetConfig(
+    OMX_HANDLETYPE hComponent,
+    OMX_INDEXTYPE nIndex,
+    OMX_PTR pComponentConfigStructure)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc         = 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;
+    }
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+
+    switch (nIndex) {
+    case OMX_IndexConfigVideoIntraPeriod:
+    {
+        EXYNOS_OMX_VIDEOENC_COMPONENT *pVEncBase = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);
+        OMX_U32 nPFrames = (*((OMX_U32 *)pComponentConfigStructure)) - 1;
+
+        pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
+
+        ret = OMX_ErrorNone;
+    }
+        break;
+    case OMX_IndexConfigVideoAVCIntraPeriod:
+    {
+        OMX_VIDEO_CONFIG_AVCINTRAPERIOD *pAVCIntraPeriod = (OMX_VIDEO_CONFIG_AVCINTRAPERIOD *)pComponentConfigStructure;
+        OMX_U32           portIndex = pAVCIntraPeriod->nPortIndex;
+
+        if ((portIndex != OUTPUT_PORT_INDEX)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        } else {
+            if (pAVCIntraPeriod->nIDRPeriod == (pAVCIntraPeriod->nPFrames + 1))
+                pH264Enc->AVCComponent[OUTPUT_PORT_INDEX].nPFrames = pAVCIntraPeriod->nPFrames;
+            else {
+                ret = OMX_ErrorBadParameter;
+                goto EXIT;
+            }
+        }
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoEncodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    if (ret == OMX_ErrorNone)
+        pVideoEnc->configChange = OMX_TRUE;
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_GetExtensionIndex(
+    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;
+    }
+    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD) == 0) {
+        *pIndexType = OMX_IndexConfigVideoIntraPeriod;
+        ret = OMX_ErrorNone;
+    } else {
+        ret = Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_ComponentRoleEnum(OMX_HANDLETYPE hComponent, OMX_U8 *cRole, OMX_U32 nIndex)
+{
+    OMX_ERRORTYPE               ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (cRole == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (nIndex == (MAX_COMPONENT_ROLE_NUM-1)) {
+        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H264_ENC_ROLE);
+        ret = OMX_ErrorNone;
+    } else {
+        ret = OMX_ErrorNoMore;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Init */
+OMX_ERRORTYPE Exynos_H264Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_H264ENC_HANDLE    *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;;
+    EXYNOS_MFC_H264ENC_HANDLE     *pMFCH264Handle    = &pH264Enc->hMFCH264Handle;
+    OMX_PTR                   hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    OMX_COLOR_FORMATTYPE      eColorFormat;
+
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+
+    CSC_METHOD csc_method = CSC_METHOD_SW;
+    int i = 0;
+
+    FunctionIn();
+
+    pH264Enc->hMFCH264Handle.bConfiguredMFCSrc = OMX_FALSE;
+    pH264Enc->hMFCH264Handle.bConfiguredMFCDst = OMX_FALSE;
+    pVideoEnc->bFirstOutput = OMX_FALSE;
+    pExynosComponent->bUseFlagEOF = OMX_TRUE;
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+
+    eColorFormat = pExynosInputPort->portDefinition.format.video.eColorFormat;
+    if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
+        if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
+            pExynosInputPort->bufferProcessType = BUFFER_COPY;
+        } else {
+            pExynosInputPort->bufferProcessType = BUFFER_SHARE;
+        }
+    } else {
+        pExynosInputPort->bufferProcessType = BUFFER_COPY;
+    }
+
+    /* H.264 Codec Open */
+    ret = H264CodecOpen(pH264Enc);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+
+    if ((pExynosInputPort->bStoreMetaData != OMX_TRUE) &&
+        (eColorFormat != OMX_COLOR_FormatAndroidOpaque)) {
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
+            Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+
+            for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+                pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
+                /* Use ION Allocator */
+                /*Alloc Y-Buffer */
+                pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
+                pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+                pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
+                /*Alloc C-Buffer */
+                pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
+                pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+                pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
+
+                pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
+
+                if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) ||
+                    (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+
+                /* MFC input buffers are 1 plane. */
+                pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
+                pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
+                pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
+
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+
+                Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
+            }
+        } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+            /*************/
+            /*    TBD    */
+            /*************/
+            /* Does not require any actions. */
+        }
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
+        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    pH264Enc->bSourceStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pH264Enc->hSourceStartEvent);
+    pH264Enc->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pH264Enc->hDestinationStartEvent);
+
+    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
+    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
+    pH264Enc->hMFCH264Handle.indexTimestamp = 0;
+    pH264Enc->hMFCH264Handle.outputIndexTimestamp = 0;
+
+    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+
+#if 0//defined(USE_CSC_GSCALER)
+    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
+#endif
+    pVideoEnc->csc_handle = csc_init(csc_method);
+    if (pVideoEnc->csc_handle == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    pVideoEnc->csc_set_format = OMX_FALSE;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Terminate */
+OMX_ERRORTYPE Exynos_H264Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_H264ENC_HANDLE    *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    OMX_PTR                hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+
+    ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+
+    int i = 0, plane = 0;
+
+    FunctionIn();
+
+    if (pVideoEnc->csc_handle != NULL) {
+        csc_deinit(pVideoEnc->csc_handle);
+        pVideoEnc->csc_handle = NULL;
+    }
+
+    Exynos_OSAL_SignalTerminate(pH264Enc->hDestinationStartEvent);
+    pH264Enc->hDestinationStartEvent = NULL;
+    pH264Enc->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalTerminate(pH264Enc->hSourceStartEvent);
+    pH264Enc->hSourceStartEvent = NULL;
+    pH264Enc->bSourceStart = OMX_FALSE;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoEnc->pMFCEncOutputBuffer[i] != NULL) {
+                if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] != NULL)
+                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0]);
+                Exynos_OSAL_Free(pVideoEnc->pMFCEncOutputBuffer[i]);
+                pVideoEnc->pMFCEncOutputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) {
+                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                    if (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane] != NULL)
+                        Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]);
+                }
+                Exynos_OSAL_Free(pVideoEnc->pMFCEncInputBuffer[i]);
+                pVideoEnc->pMFCEncInputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+    H264CodecClose(pH264Enc);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE               ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
+    ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+    int i;
+
+    FunctionIn();
+
+    if (pH264Enc->hMFCH264Handle.bConfiguredMFCSrc == OMX_FALSE) {
+        ret = H264CodecSrcSetup(pOMXComponent, pSrcInputData);
+        if ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)
+            goto EXIT;
+    }
+    if (pH264Enc->hMFCH264Handle.bConfiguredMFCDst == OMX_FALSE) {
+        ret = H264CodecDstSetup(pOMXComponent);
+    }
+
+    if ((pSrcInputData->dataLen >= 0) ||
+        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
+        OMX_U32 pMFCYUVDataSize[MFC_INPUT_BUFFER_PLANE]  = {NULL, NULL};
+        ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
+        int plane;
+
+        pExynosComponent->timeStamp[pH264Enc->hMFCH264Handle.indexTimestamp] = pSrcInputData->timeStamp;
+        pExynosComponent->nFlags[pH264Enc->hMFCH264Handle.indexTimestamp] = pSrcInputData->nFlags;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pH264Enc->hMFCH264Handle.indexTimestamp, pSrcInputData->nFlags);
+        pEncOps->Set_FrameTag(hMFCHandle, pH264Enc->hMFCH264Handle.indexTimestamp);
+        pH264Enc->hMFCH264Handle.indexTimestamp++;
+        pH264Enc->hMFCH264Handle.indexTimestamp %= MAX_TIMESTAMP;
+
+        /* queue work for input buffer */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Exynos_H264Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize, pSrcInputData->bufferHeader);
+        pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
+        pMFCYUVDataSize[1] = pMFCYUVDataSize[0] / 2;
+
+#ifdef USE_METADATABUFFERTYPE
+        nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
+                            ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
+        nAllocLen[1] = ALIGN(nAllocLen[0]/2,256);
+
+        if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+            (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+            codecReturn = pInbufOps->ExtensionEnqueue(hMFCHandle,
+                                        (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                        (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.fd,
+                                        (unsigned int *)nAllocLen, (unsigned int *)pMFCYUVDataSize,
+                                        MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        } else {
+            codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                        (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        }
+#else
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                    (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+#endif
+        if (codecReturn != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__, __LINE__);
+            ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
+            goto EXIT;
+        }
+        H264CodecStart(pOMXComponent, INPUT_PORT_INDEX);
+        if (pH264Enc->bSourceStart == OMX_FALSE) {
+            pH264Enc->bSourceStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pH264Enc->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+        if (pH264Enc->bDestinationStart == OMX_FALSE) {
+            pH264Enc->bDestinationStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pH264Enc->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoBuffer        videoBuffer;
+
+    FunctionIn();
+
+    if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+        (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+        if (pInbufOps->ExtensionDequeue(hMFCHandle, &videoBuffer) == VIDEO_ERROR_NONE)
+            pVideoBuffer = &videoBuffer;
+        else
+            pVideoBuffer = NULL;
+    } else {
+        pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+    }
+
+    pSrcOutputData->dataLen       = 0;
+    pSrcOutputData->usedDataLen   = 0;
+    pSrcOutputData->remainDataLen = 0;
+    pSrcOutputData->nFlags    = 0;
+    pSrcOutputData->timeStamp = 0;
+
+    if (pVideoBuffer == NULL) {
+        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
+        pSrcOutputData->allocSize  = 0;
+        pSrcOutputData->pPrivate = NULL;
+        pSrcOutputData->bufferHeader = NULL;
+    } else {
+        int plane = 0;
+        for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+            pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
+            pSrcOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
+        }
+        pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize +
+                                        pVideoBuffer->planes[1].allocSize +
+                                        pVideoBuffer->planes[2].allocSize;
+
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            int i = 0;
+            while (pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[0] != pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]) {
+                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - Lost buffer", __FUNCTION__, __LINE__);
+                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
+                    goto EXIT;
+                }
+                i++;
+            }
+            pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
+            pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i];
+        }
+
+        /* For Share Buffer */
+        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+    OMX_U32 dataLen = 0;
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+
+    FunctionIn();
+
+    if (pDstInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer,
+                     (unsigned int *)&dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
+
+    if (codecReturn != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pOutbufOps->Enqueue", __FUNCTION__, __LINE__);
+        ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
+        goto EXIT;
+    }
+    H264CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pH264Enc->hMFCH264Handle.hMFCHandle;
+    ExynosVideoEncOps       *pEncOps    = pH264Enc->hMFCH264Handle.pEncOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
+    ExynosVideoGeometry bufferGeometry;
+    OMX_S32 indexTimestamp = 0;
+
+    FunctionIn();
+
+    if (pH264Enc->bDestinationStart == OMX_FALSE) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    pH264Enc->hMFCH264Handle.outputIndexTimestamp++;
+    pH264Enc->hMFCH264Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
+
+    pDstOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
+    pDstOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
+    pDstOutputData->allocSize   = pVideoBuffer->planes[0].allocSize;
+    pDstOutputData->dataLen     = pVideoBuffer->planes[0].dataSize;
+    pDstOutputData->remainDataLen = pVideoBuffer->planes[0].dataSize;
+    pDstOutputData->usedDataLen = 0;
+    pDstOutputData->pPrivate = pVideoBuffer;
+    /* For Share Buffer */
+    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
+
+    if (pVideoEnc->bFirstOutput == OMX_FALSE) {
+        OMX_U8 *p = NULL;
+        int iSpsSize = 0;
+        int iPpsSize = 0;
+
+        /* Calculate sps/pps size if needed */
+        p = FindDelimiter((OMX_U8 *)(pDstOutputData->buffer.singlePlaneBuffer.dataBuffer + 4),
+                            pDstOutputData->dataLen - 4);
+
+        iSpsSize = (unsigned int)p - (unsigned int)pDstOutputData->buffer.singlePlaneBuffer.dataBuffer;
+        pH264Enc->hMFCH264Handle.headerData.pHeaderSPS =
+            (OMX_PTR)pDstOutputData->buffer.singlePlaneBuffer.dataBuffer;
+        pH264Enc->hMFCH264Handle.headerData.SPSLen = iSpsSize;
+
+        iPpsSize = pDstOutputData->dataLen - iSpsSize;
+        pH264Enc->hMFCH264Handle.headerData.pHeaderPPS =
+            (OMX_U8 *)pDstOutputData->buffer.singlePlaneBuffer.dataBuffer + iSpsSize;
+        pH264Enc->hMFCH264Handle.headerData.PPSLen = iPpsSize;
+
+        pDstOutputData->timeStamp = 0;
+        pDstOutputData->nFlags |= OMX_BUFFERFLAG_CODECCONFIG;
+        pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+        pVideoEnc->bFirstOutput = OMX_TRUE;
+    } else {
+        indexTimestamp = pEncOps->Get_FrameTag(pH264Enc->hMFCH264Handle.hMFCHandle);
+        if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pH264Enc->hMFCH264Handle.outputIndexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[pH264Enc->hMFCH264Handle.outputIndexTimestamp];
+        } else {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
+        }
+
+        pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+        if (pVideoBuffer->frameType == VIDEO_FRAME_I)
+            pDstOutputData->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
+    }
+
+    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
+        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%x displayStatus:%d, nFlags0x%x", pExynosComponent, displayStatus, pDstOutputData->nFlags);
+        pDstOutputData->remainDataLen = 0;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_H264ENC_HANDLE    *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    ret = Exynos_H264Enc_SrcIn(pOMXComponent, pSrcInputData);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcIn -> event is thrown to client", __FUNCTION__, __LINE__);
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_H264ENC_HANDLE    *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+    }
+    if ((pH264Enc->bSourceStart == OMX_FALSE) &&
+       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
+        Exynos_OSAL_SignalWait(pH264Enc->hSourceStartEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pH264Enc->hSourceStartEvent);
+    }
+
+    ret = Exynos_H264Enc_SrcOut(pOMXComponent, pSrcOutputData);
+    if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcOut -> event is thrown to client", __FUNCTION__, __LINE__);
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_H264ENC_HANDLE    *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if ((pH264Enc->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pH264Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pH264Enc->hDestinationStartEvent);
+        }
+    }
+    if (pH264Enc->hMFCH264Handle.bConfiguredMFCDst == OMX_TRUE) {
+        ret = Exynos_H264Enc_DstIn(pOMXComponent, pDstInputData);
+        if (ret != OMX_ErrorNone) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstIn -> event is thrown to client", __FUNCTION__, __LINE__);
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+        }
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_H264Enc_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_H264ENC_HANDLE    *pH264Enc = (EXYNOS_H264ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((pH264Enc->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pH264Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pH264Enc->hDestinationStartEvent);
+        }
+    }
+    ret = Exynos_H264Enc_DstOut(pOMXComponent, pDstOutputData);
+    if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstOut -> event is thrown to client", __FUNCTION__, __LINE__);
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
+    EXYNOS_H264ENC_HANDLE         *pH264Enc         = NULL;
+    int i = 0;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (componentName == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H264_ENC, componentName) != 0) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, componentName:%s, Line:%d", componentName, __LINE__);
+        goto EXIT;
+    }
+
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_VideoEncodeComponentInit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pExynosComponent->codecType = HW_VIDEO_ENC_CODEC;
+
+    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
+    if (pExynosComponent->componentName == NULL) {
+        Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
+
+    pH264Enc = Exynos_OSAL_Malloc(sizeof(EXYNOS_H264ENC_HANDLE));
+    if (pH264Enc == NULL) {
+        Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInsufficientResources, Line:%d", __LINE__);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pH264Enc, 0, sizeof(EXYNOS_H264ENC_HANDLE));
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pVideoEnc->hCodecHandle = (OMX_HANDLETYPE)pH264Enc;
+    pVideoEnc->quantization.nQpI = 20;
+    pVideoEnc->quantization.nQpP = 20;
+    pVideoEnc->quantization.nQpB = 20;
+
+    Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H264_ENC);
+    /* Set componentVersion */
+    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
+    /* Set specVersion */
+    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_COPY;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nStride = 0; /*DEFAULT_FRAME_WIDTH;*/
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingAVC;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/avc");
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_SHARE;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    for(i = 0; i < ALL_PORT_NUM; i++) {
+        INIT_SET_SIZE_VERSION(&pH264Enc->AVCComponent[i], OMX_VIDEO_PARAM_AVCTYPE);
+        pH264Enc->AVCComponent[i].nPortIndex = i;
+        pH264Enc->AVCComponent[i].eProfile   = OMX_VIDEO_AVCProfileBaseline;
+        pH264Enc->AVCComponent[i].eLevel     = OMX_VIDEO_AVCLevel31;
+
+        pH264Enc->AVCComponent[i].nPFrames = 20;
+    }
+
+    pOMXComponent->GetParameter      = &Exynos_H264Enc_GetParameter;
+    pOMXComponent->SetParameter      = &Exynos_H264Enc_SetParameter;
+    pOMXComponent->GetConfig         = &Exynos_H264Enc_GetConfig;
+    pOMXComponent->SetConfig         = &Exynos_H264Enc_SetConfig;
+    pOMXComponent->GetExtensionIndex = &Exynos_H264Enc_GetExtensionIndex;
+    pOMXComponent->ComponentRoleEnum = &Exynos_H264Enc_ComponentRoleEnum;
+    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
+
+    pExynosComponent->exynos_codec_componentInit      = &Exynos_H264Enc_Init;
+    pExynosComponent->exynos_codec_componentTerminate = &Exynos_H264Enc_Terminate;
+
+    pVideoEnc->exynos_codec_srcInputProcess  = &Exynos_H264Enc_srcInputBufferProcess;
+    pVideoEnc->exynos_codec_srcOutputProcess = &Exynos_H264Enc_srcOutputBufferProcess;
+    pVideoEnc->exynos_codec_dstInputProcess  = &Exynos_H264Enc_dstInputBufferProcess;
+    pVideoEnc->exynos_codec_dstOutputProcess = &Exynos_H264Enc_dstOutputBufferProcess;
+
+    pVideoEnc->exynos_codec_start         = &H264CodecStart;
+    pVideoEnc->exynos_codec_stop          = &H264CodecStop;
+    pVideoEnc->exynos_codec_bufferProcessRun = &H264CodecOutputBufferProcessRun;
+    pVideoEnc->exynos_codec_enqueueAllBuffer = &H264CodecEnQueueAllBuffer;
+
+    pVideoEnc->exynos_checkInputFrame        = NULL;
+    pVideoEnc->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
+    pVideoEnc->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
+
+    pVideoEnc->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
+    if (pVideoEnc->hSharedMemory == NULL) {
+        Exynos_OSAL_Free(pH264Enc);
+        pH264Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
+        Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pExynosComponent->currentState = OMX_StateLoaded;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE          *pOMXComponent = NULL;
+    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_H264ENC_HANDLE      *pH264Enc         = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_SharedMemory_Close(pVideoEnc->hSharedMemory);
+
+    Exynos_OSAL_Free(pExynosComponent->componentName);
+    pExynosComponent->componentName = NULL;
+
+    pH264Enc = (EXYNOS_H264ENC_HANDLE *)pVideoEnc->hCodecHandle;
+    if (pH264Enc != NULL) {
+        Exynos_OSAL_Free(pH264Enc);
+        pH264Enc = pVideoEnc->hCodecHandle = NULL;
+    }
+
+    ret = Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/video/enc/h264/Exynos_OMX_H264enc.h b/component/video/enc/h264/Exynos_OMX_H264enc.h
new file mode 100644 (file)
index 0000000..4e66be6
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ *
+ * 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_H264enc.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_H264_ENC_COMPONENT
+#define EXYNOS_OMX_H264_ENC_COMPONENT
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "OMX_Video.h"
+
+typedef struct _EXTRA_DATA
+{
+    OMX_PTR pHeaderSPS;
+    OMX_U32 SPSLen;
+    OMX_PTR pHeaderPPS;
+    OMX_U32 PPSLen;
+} EXTRA_DATA;
+
+typedef struct _EXYNOS_MFC_H264ENC_HANDLE
+{
+    OMX_HANDLETYPE hMFCHandle;
+
+    OMX_U32 indexTimestamp;
+    OMX_U32 outputIndexTimestamp;
+    OMX_BOOL bConfiguredMFCSrc;
+    OMX_BOOL bConfiguredMFCDst;
+    EXTRA_DATA headerData;
+
+    ExynosVideoDecOps *pEncOps;
+    ExynosVideoDecBufferOps *pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps;
+    ExynosVideoEncParam      encParam;
+} EXYNOS_MFC_H264ENC_HANDLE;
+
+typedef struct _EXYNOS_H264ENC_HANDLE
+{
+    /* OMX Codec specific */
+    OMX_VIDEO_PARAM_AVCTYPE AVCComponent[ALL_PORT_NUM];
+    OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType[ALL_PORT_NUM];
+
+    /* SEC MFC Codec specific */
+    EXYNOS_MFC_H264ENC_HANDLE hMFCH264Handle;
+
+    OMX_BOOL bSourceStart;
+    OMX_BOOL bDestinationStart;
+    OMX_HANDLETYPE hSourceStartEvent;
+    OMX_HANDLETYPE hDestinationStartEvent;
+} EXYNOS_H264ENC_HANDLE;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName);
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/video/enc/h264/library_register.c b/component/video/enc/h264/library_register.c
new file mode 100644 (file)
index 0000000..c8afbd6
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *
+ * 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        library_register.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 <dlfcn.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_ETC.h"
+#include "library_register.h"
+#include "Exynos_OSAL_Log.h"
+
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(ExynosRegisterComponentType **exynosComponents)
+{
+    FunctionIn();
+
+    if (exynosComponents == NULL)
+        goto EXIT;
+
+    /* component 1 - video decoder H.264 */
+    Exynos_OSAL_Strcpy(exynosComponents[0]->componentName, EXYNOS_OMX_COMPONENT_H264_ENC);
+    Exynos_OSAL_Strcpy(exynosComponents[0]->roles[0], EXYNOS_OMX_COMPONENT_H264_ENC_ROLE);
+    exynosComponents[0]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+EXIT:
+    FunctionOut();
+
+    return MAX_COMPONENT_NUM;
+}
+
diff --git a/component/video/enc/h264/library_register.h b/component/video/enc/h264/library_register.h
new file mode 100644 (file)
index 0000000..b05475f
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *
+ * 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        library_register.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_H264_REG
+#define EXYNOS_OMX_H264_REG
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "Exynos_OMX_Component_Register.h"
+
+
+#define OSCL_EXPORT_REF __attribute__((visibility("default")))
+#define MAX_COMPONENT_NUM       1
+#define MAX_COMPONENT_ROLE_NUM  1
+
+/* H.264 */
+#define EXYNOS_OMX_COMPONENT_H264_ENC "OMX.Exynos.AVC.Encoder"
+#define EXYNOS_OMX_COMPONENT_H264_ENC_ROLE "video_encoder.avc"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(ExynosRegisterComponentType **exynosComponents);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
+
diff --git a/component/video/enc/mpeg4/Android.mk b/component/video/enc/mpeg4/Android.mk
new file mode 100644 (file)
index 0000000..dbd44f5
--- /dev/null
@@ -0,0 +1,37 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_Mpeg4enc.c \
+       library_register.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libOMX.Exynos.MPEG4.Encoder
+LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/omx
+
+LOCAL_CFLAGS :=
+
+ifeq ($(BOARD_USE_METADATABUFFERTYPE), true)
+LOCAL_CFLAGS += -DUSE_METADATABUFFERTYPE
+endif
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_Venc libExynosOMX_OSAL libExynosOMX_Basecomponent \
+       libswconverter libExynosVideoApi
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils libui \
+       libExynosOMX_Resourcemanager libcsc libexynosv4l2 libion_exynos
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/core \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/video/enc \
+       hardware/samsung_slsi/exynos5/include \
+       hardware/samsung_slsi/exynos5/libcsc \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c b/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c
new file mode 100644 (file)
index 0000000..0299b43
--- /dev/null
@@ -0,0 +1,2589 @@
+/*
+ *
+ * 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_Mpeg4enc.c
+ * @brief
+ * @author      Yunji Kim (yunji.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_OMX_Basecomponent.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Venc.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OSAL_Thread.h"
+#include "Exynos_OSAL_Android.h"
+#include "library_register.h"
+#include "Exynos_OMX_Mpeg4enc.h"
+#include "ExynosVideoApi.h"
+#include "Exynos_OSAL_SharedMemory.h"
+#include "Exynos_OSAL_Event.h"
+
+/* To use CSC_METHOD_HW in EXYNOS OMX, gralloc should allocate physical memory using FIMC */
+/* It means GRALLOC_USAGE_HW_FIMC1 should be set on Native Window usage */
+#include "csc.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_MPEG4_ENC"
+#define EXYNOS_LOG_OFF
+//#define EXYNOS_TRACE_ON
+#include "Exynos_OSAL_Log.h"
+
+/* MPEG4 Encoder Supported Levels & profiles */
+EXYNOS_OMX_VIDEO_PROFILELEVEL supportedMPEG4ProfileLevels[] ={
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level0b},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level1},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level2},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level3},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level4a},
+    {OMX_VIDEO_MPEG4ProfileSimple, OMX_VIDEO_MPEG4Level5},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level0b},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level1},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level2},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level3},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level4a},
+    {OMX_VIDEO_MPEG4ProfileAdvancedSimple, OMX_VIDEO_MPEG4Level5}};
+
+/* H.263 Encoder Supported Levels & profiles */
+EXYNOS_OMX_VIDEO_PROFILELEVEL supportedH263ProfileLevels[] = {
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level10},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level20},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level30},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level40},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level45},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level50},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level60},
+    {OMX_VIDEO_H263ProfileBaseline, OMX_VIDEO_H263Level70}};
+
+static OMX_U32 OMXMpeg4ProfileToMFCProfile(OMX_VIDEO_MPEG4PROFILETYPE profile)
+{
+    OMX_U32 ret;
+
+    switch (profile) {
+    case OMX_VIDEO_MPEG4ProfileSimple:
+        ret = 0;
+        break;
+    case OMX_VIDEO_MPEG4ProfileAdvancedSimple:
+        ret = 1;
+        break;
+    default:
+        ret = 0;
+    };
+
+    return ret;
+}
+
+static OMX_U32 OMXMpeg4LevelToMFCLevel(OMX_VIDEO_MPEG4LEVELTYPE level)
+{
+    OMX_U32 ret;
+
+    switch (level) {
+    case OMX_VIDEO_MPEG4Level0:
+        ret = 0;
+        break;
+    case OMX_VIDEO_MPEG4Level0b:
+        ret = 1;
+        break;
+    case OMX_VIDEO_MPEG4Level1:
+        ret = 2;
+        break;
+    case OMX_VIDEO_MPEG4Level2:
+        ret = 3;
+        break;
+    case OMX_VIDEO_MPEG4Level3:
+        ret = 4;
+        break;
+    case OMX_VIDEO_MPEG4Level4:
+    case OMX_VIDEO_MPEG4Level4a:
+        ret = 6;
+        break;
+    case OMX_VIDEO_MPEG4Level5:
+        ret = 7;
+        break;
+    default:
+        ret = 0;
+    };
+
+    return ret;
+}
+
+static void Print_Mpeg4Enc_Param(ExynosVideoEncParam *pEncParam)
+{
+    ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam;
+    ExynosVideoEncMpeg4Param  *pMpeg4Param  = &pEncParam->codecParam.mpeg4;
+
+    /* common parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth             : %d", pCommonParam->SourceWidth);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight            : %d", pCommonParam->SourceHeight);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod               : %d", pCommonParam->IDRPeriod);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode               : %d", pCommonParam->SliceMode);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh    : %d", pCommonParam->RandomIntraMBRefresh);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate                 : %d", pCommonParam->Bitrate);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp                 : %d", pCommonParam->FrameQp);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P               : %d", pCommonParam->FrameQp_P);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax               : %d", pCommonParam->QSCodeMax);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin               : %d", pCommonParam->QSCodeMin);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn            : %d", pCommonParam->PadControlOn);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal              : %d", pCommonParam->LumaPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal                : %d", pCommonParam->CbPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal                : %d", pCommonParam->CrPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap                : %d", pCommonParam->FrameMap);
+
+    /* Mpeg4 specific parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ProfileIDC              : %d", pMpeg4Param->ProfileIDC);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LevelIDC                : %d", pMpeg4Param->LevelIDC);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_B               : %d", pMpeg4Param->FrameQp_B);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "TimeIncreamentRes       : %d", pMpeg4Param->TimeIncreamentRes);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "VopTimeIncreament       : %d", pMpeg4Param->VopTimeIncreament);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceArgument           : %d", pMpeg4Param->SliceArgument);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "NumberBFrames           : %d", pMpeg4Param->NumberBFrames);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "DisableQpelME           : %d", pMpeg4Param->DisableQpelME);
+
+    /* rate control related parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl    : %d", pCommonParam->EnableFRMRateControl);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl     : %d", pCommonParam->EnableMBRateControl);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf             : %d", pCommonParam->CBRPeriodRf);
+}
+
+static void Print_H263Enc_Param(ExynosVideoEncParam *pEncParam)
+{
+    ExynosVideoEncCommonParam *pCommonParam = &pEncParam->commonParam;
+    ExynosVideoEncH263Param   *pH263Param   = &pEncParam->codecParam.h263;
+
+    /* common parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceWidth             : %d", pCommonParam->SourceWidth);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SourceHeight            : %d", pCommonParam->SourceHeight);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "IDRPeriod               : %d", pCommonParam->IDRPeriod);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SliceMode               : %d", pCommonParam->SliceMode);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "RandomIntraMBRefresh    : %d", pCommonParam->RandomIntraMBRefresh);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Bitrate                 : %d", pCommonParam->Bitrate);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp                 : %d", pCommonParam->FrameQp);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameQp_P               : %d", pCommonParam->FrameQp_P);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMax               : %d", pCommonParam->QSCodeMax);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "QSCodeMin               : %d", pCommonParam->QSCodeMin);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "PadControlOn            : %d", pCommonParam->PadControlOn);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "LumaPadVal              : %d", pCommonParam->LumaPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CbPadVal                : %d", pCommonParam->CbPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CrPadVal                : %d", pCommonParam->CrPadVal);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameMap                : %d", pCommonParam->FrameMap);
+
+    /* H263 specific parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "FrameRate               : %d", pH263Param->FrameRate);
+
+    /* rate control related parameters */
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableFRMRateControl    : %d", pCommonParam->EnableFRMRateControl);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "EnableMBRateControl     : %d", pCommonParam->EnableMBRateControl);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "CBRPeriodRf             : %d", pCommonParam->CBRPeriodRf);
+}
+
+static void Set_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
+    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
+    EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle;
+
+    ExynosVideoEncParam       *pEncParam    = NULL;
+    ExynosVideoEncCommonParam *pCommonParam = NULL;
+    ExynosVideoEncMpeg4Param  *pMpeg4Param  = NULL;
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pMpeg4Enc = pVideoEnc->hCodecHandle;
+    pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
+    pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    pEncParam    = &pMFCMpeg4Handle->encParam;
+    pCommonParam = &pEncParam->commonParam;
+    pMpeg4Param  = &pEncParam->codecParam.mpeg4;
+    pEncParam->eCompressionFormat = VIDEO_CODING_MPEG4;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat);
+
+    /* common parameters */
+    pCommonParam->SourceWidth  = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
+    pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
+    pCommonParam->IDRPeriod    = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1;
+    pCommonParam->SliceMode    = 0;
+    pCommonParam->RandomIntraMBRefresh = 0;
+    pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
+    pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
+    pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
+    pCommonParam->QSCodeMax    = 30;
+    pCommonParam->QSCodeMin    = 10;
+    pCommonParam->PadControlOn = 0; /* 0: Use boundary pixel, 1: Use the below setting value */
+    pCommonParam->LumaPadVal   = 0;
+    pCommonParam->CbPadVal     = 0;
+    pCommonParam->CrPadVal     = 0;
+
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+    } else {
+        switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
+        case OMX_COLOR_FormatYUV420SemiPlanar:
+        case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_CSC_InputData */
+#ifdef USE_METADATABUFFERTYPE
+        case OMX_COLOR_FormatAndroidOpaque:
+#endif
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+            break;
+        case OMX_SEC_COLOR_FormatNV21Linear:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
+            break;
+        case OMX_SEC_COLOR_FormatNV12Tiled:
+        default:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+            break;
+        }
+    }
+
+    /* Mpeg4 specific parameters */
+    pMpeg4Param->ProfileIDC = OMXMpeg4ProfileToMFCProfile(pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].eProfile);
+    pMpeg4Param->LevelIDC   = OMXMpeg4LevelToMFCLevel(pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].eLevel);
+    pMpeg4Param->FrameQp_B  = pVideoEnc->quantization.nQpB;
+    pMpeg4Param->TimeIncreamentRes = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
+    pMpeg4Param->VopTimeIncreament = 1;
+    pMpeg4Param->SliceArgument = 0; /* MB number or byte number */
+    pMpeg4Param->NumberBFrames = 0; /* 0(not used) ~ 2 */
+    pMpeg4Param->DisableQpelME = 1;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]);
+    /* rate control related parameters */
+    switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) {
+    case OMX_Video_ControlRateDisable:
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode DBR");
+        pCommonParam->EnableFRMRateControl = 0; /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 0; /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 100;
+        break;
+    case OMX_Video_ControlRateConstant:
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR");
+        pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 9;
+        break;
+    case OMX_Video_ControlRateVariable:
+    default: /*Android default */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
+        pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 100;
+        break;
+    }
+
+    Print_Mpeg4Enc_Param(pEncParam);
+}
+
+static void Set_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
+    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
+    EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle;
+
+    ExynosVideoEncParam       *pEncParam    = NULL;
+    ExynosVideoEncCommonParam *pCommonParam = NULL;
+    ExynosVideoEncH263Param   *pH263Param   = NULL;
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pMpeg4Enc = pVideoEnc->hCodecHandle;
+    pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
+    pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    pEncParam    = &pMFCMpeg4Handle->encParam;
+    pCommonParam = &pEncParam->commonParam;
+    pH263Param   = &pEncParam->codecParam.h263;
+    pEncParam->eCompressionFormat = VIDEO_CODING_H263;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "eCompressionFormat: %d", pEncParam->eCompressionFormat);
+
+    /* common parameters */
+    pCommonParam->SourceWidth  = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
+    pCommonParam->SourceHeight = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
+    pCommonParam->IDRPeriod    = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1;
+    pCommonParam->SliceMode    = 0;
+    pCommonParam->RandomIntraMBRefresh = 0;
+    pCommonParam->Bitrate      = pExynosOutputPort->portDefinition.format.video.nBitrate;
+    pCommonParam->FrameQp      = pVideoEnc->quantization.nQpI;
+    pCommonParam->FrameQp_P    = pVideoEnc->quantization.nQpP;
+    pCommonParam->QSCodeMax    = 30;
+    pCommonParam->QSCodeMin    = 10;
+    pCommonParam->PadControlOn = 0; /* 0: Use boundary pixel, 1: Use the below setting value */
+    pCommonParam->LumaPadVal   = 0;
+    pCommonParam->CbPadVal     = 0;
+    pCommonParam->CrPadVal     = 0;
+
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV21Linear)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+        if (pVideoEnc->ANBColorFormat == OMX_SEC_COLOR_FormatNV12Tiled)
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+    } else {
+        switch ((EXYNOS_OMX_COLOR_FORMATTYPE)pExynosInputPort->portDefinition.format.video.eColorFormat) {
+        case OMX_COLOR_FormatYUV420SemiPlanar:
+        case OMX_COLOR_FormatYUV420Planar: /* Converted to NV12 in Exynos_CSC_InputData */
+#ifdef USE_METADATABUFFERTYPE
+        case OMX_COLOR_FormatAndroidOpaque:
+#endif
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12;
+            break;
+        case OMX_SEC_COLOR_FormatNV21Linear:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV21;
+            break;
+        case OMX_SEC_COLOR_FormatNV12Tiled:
+        default:
+            pCommonParam->FrameMap = VIDEO_COLORFORMAT_NV12_TILED;
+            break;
+        }
+    }
+
+    /* H263 specific parameters */
+    pH263Param->FrameRate            = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]: 0x%x", pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]);
+    /* rate control related parameters */
+    switch (pVideoEnc->eControlRate[OUTPUT_PORT_INDEX]) {
+    case OMX_Video_ControlRateDisable:
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode DBR");
+        pCommonParam->EnableFRMRateControl = 0; /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 0; /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 100;
+        break;
+    case OMX_Video_ControlRateConstant:
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode CBR");
+        pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 9;
+        break;
+    case OMX_Video_ControlRateVariable:
+    default: /*Android default */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Video Encode VBR");
+        pCommonParam->EnableFRMRateControl = 1; /* 0: Disable, 1: Frame level RC */
+        pCommonParam->EnableMBRateControl  = 1; /* 0: Disable, 1:MB level RC */
+        pCommonParam->CBRPeriodRf          = 100;
+        break;
+    }
+
+    Print_H263Enc_Param(pEncParam);
+}
+
+static void Change_Mpeg4Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
+    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
+    EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle;
+
+    ExynosVideoEncOps         *pEncOps      = NULL;
+    ExynosVideoEncParam       *pEncParam    = NULL;
+    ExynosVideoEncCommonParam *pCommonParam = NULL;
+    ExynosVideoEncMpeg4Param  *pMpeg4Param  = NULL;
+
+    int setParam = 0;
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pMpeg4Enc = pVideoEnc->hCodecHandle;
+    pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
+    pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pEncOps = pMFCMpeg4Handle->pEncOps;
+
+    pEncParam    = &pMFCMpeg4Handle->encParam;
+    pCommonParam = &pEncParam->commonParam;
+    pMpeg4Param  = &pEncParam->codecParam.mpeg4;
+
+    if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) {
+        setParam = VIDEO_FRAME_I;
+        pEncOps->Set_FrameType(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
+        pVideoEnc->IntraRefreshVOP = OMX_FALSE;
+    }
+    if (pCommonParam->IDRPeriod != (int)pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1) {
+        setParam = pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames + 1;
+        pEncOps->Set_IDRPeriod(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
+    }
+    if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) {
+        setParam = pExynosOutputPort->portDefinition.format.video.nBitrate;
+        pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
+    }
+    if (pMpeg4Param->TimeIncreamentRes != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) {
+        setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
+        pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
+    }
+
+    Set_Mpeg4Enc_Param(pExynosComponent);
+}
+
+static void Change_H263Enc_Param(EXYNOS_OMX_BASECOMPONENT *pExynosComponent)
+{
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort  = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc         = NULL;
+    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc         = NULL;
+    EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle;
+
+    ExynosVideoEncOps         *pEncOps      = NULL;
+    ExynosVideoEncParam       *pEncParam    = NULL;
+    ExynosVideoEncCommonParam *pCommonParam = NULL;
+    ExynosVideoEncH263Param   *pH263Param   = NULL;
+
+    int setParam = 0;
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pMpeg4Enc = pVideoEnc->hCodecHandle;
+    pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
+    pExynosInputPort  = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pEncOps = pMFCMpeg4Handle->pEncOps;
+
+    pEncParam    = &pMFCMpeg4Handle->encParam;
+    pCommonParam = &pEncParam->commonParam;
+    pH263Param   = &pEncParam->codecParam.h263;
+
+    if (pVideoEnc->IntraRefreshVOP == OMX_TRUE) {
+        setParam = VIDEO_FRAME_I;
+        pEncOps->Set_FrameType(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
+        pVideoEnc->IntraRefreshVOP = OMX_FALSE;
+    }
+    if (pCommonParam->IDRPeriod != (int)pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1) {
+        setParam = pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames + 1;
+        pEncOps->Set_IDRPeriod(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
+    }
+    if (pCommonParam->Bitrate != (int)pExynosOutputPort->portDefinition.format.video.nBitrate) {
+        setParam = pExynosOutputPort->portDefinition.format.video.nBitrate;
+        pEncOps->Set_BitRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
+    }
+    if (pH263Param->FrameRate != (int)((pExynosOutputPort->portDefinition.format.video.xFramerate) >> 16)) {
+        setParam = (pExynosInputPort->portDefinition.format.video.xFramerate) >> 16;
+        pEncOps->Set_FrameRate(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, setParam);
+    }
+
+    Set_H263Enc_Param(pExynosComponent);
+}
+
+OMX_ERRORTYPE GetCodecInputPrivateData(OMX_PTR codecBuffer, OMX_PTR addr[], OMX_U32 size[])
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE GetCodecOutputPrivateData(OMX_PTR codecBuffer, OMX_PTR *pVirtAddr, OMX_U32 *dataSize)
+{
+    OMX_ERRORTYPE       ret = OMX_ErrorNone;
+    ExynosVideoBuffer  *pCodecBuffer;
+
+    if (codecBuffer == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
+
+    if (pVirtAddr != NULL)
+        *pVirtAddr = pCodecBuffer->planes[0].addr;
+
+    if (dataSize != NULL)
+        *dataSize = pCodecBuffer->planes[0].allocSize;
+
+    pCodecBuffer = (ExynosVideoBuffer *)codecBuffer;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecOpen(EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc)
+{
+    OMX_ERRORTYPE           ret = OMX_ErrorNone;
+
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pMpeg4Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorBadParameter, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    /* alloc ops structure */
+    pEncOps = (ExynosVideoEncOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncOps));
+    pInbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps));
+    pOutbufOps = (ExynosVideoEncBufferOps *)Exynos_OSAL_Malloc(sizeof(ExynosVideoEncBufferOps));
+
+    if ((pEncOps == NULL) || (pInbufOps == NULL) || (pOutbufOps == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate encoder ops buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pMpeg4Enc->hMFCMpeg4Handle.pEncOps = pEncOps;
+    pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = pInbufOps;
+    pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = pOutbufOps;
+
+    /* function pointer mapping */
+    pEncOps->nSize = sizeof(ExynosVideoEncOps);
+    pInbufOps->nSize = sizeof(ExynosVideoEncBufferOps);
+    pOutbufOps->nSize = sizeof(ExynosVideoEncBufferOps);
+
+    Exynos_Video_Register_Encoder(pEncOps, pInbufOps, pOutbufOps);
+
+    /* check mandatory functions for encoder ops */
+    if ((pEncOps->Init == NULL) || (pEncOps->Finalize == NULL) ||
+        (pEncOps->Set_FrameTag == NULL) || (pEncOps->Get_FrameTag == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* check mandatory functions for buffer ops */
+    if ((pInbufOps->Setup == NULL) || (pOutbufOps->Setup == NULL) ||
+        (pInbufOps->Run == NULL) || (pOutbufOps->Run == NULL) ||
+        (pInbufOps->Stop == NULL) || (pOutbufOps->Stop == NULL) ||
+        (pInbufOps->Enqueue == NULL) || (pOutbufOps->Enqueue == NULL) ||
+        (pInbufOps->Dequeue == NULL) || (pOutbufOps->Dequeue == NULL)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Mandatory functions must be supplied");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    /* alloc context, open, querycap */
+    pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.pEncOps->Init(V4L2_MEMORY_DMABUF);
+    if (pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to allocate context buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    if (ret != OMX_ErrorNone) {
+        if (pEncOps != NULL) {
+            Exynos_OSAL_Free(pEncOps);
+            pMpeg4Enc->hMFCMpeg4Handle.pEncOps = NULL;
+        }
+        if (pInbufOps != NULL) {
+            Exynos_OSAL_Free(pInbufOps);
+            pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = NULL;
+        }
+        if (pOutbufOps != NULL) {
+            Exynos_OSAL_Free(pOutbufOps);
+            pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = NULL;
+        }
+    }
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecClose(EXYNOS_MPEG4ENC_HANDLE *pMpeg4Enc)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+
+    FunctionIn();
+
+    if (pMpeg4Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+
+    if (hMFCHandle != NULL) {
+        pEncOps->Finalize(hMFCHandle);
+        hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle = NULL;
+    }
+    if (pOutbufOps != NULL) {
+        Exynos_OSAL_Free(pOutbufOps);
+        pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps = NULL;
+    }
+    if (pInbufOps != NULL) {
+        Exynos_OSAL_Free(pInbufOps);
+        pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps = NULL;
+    }
+    if (pEncOps != NULL) {
+        Exynos_OSAL_Free(pEncOps);
+        pEncOps = pMpeg4Enc->hMFCMpeg4Handle.pEncOps = NULL;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecStart(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoEnc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
+    if (pMpeg4Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX)
+        pInbufOps->Run(hMFCHandle);
+    else if (nPortIndex == OUTPUT_PORT_INDEX)
+        pOutbufOps->Run(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecStop(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoEnc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
+    if (pMpeg4Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+
+    if ((nPortIndex == INPUT_PORT_INDEX) && (pInbufOps != NULL))
+        pInbufOps->Stop(hMFCHandle);
+    else if ((nPortIndex == OUTPUT_PORT_INDEX) && (pOutbufOps != NULL))
+        pOutbufOps->Stop(hMFCHandle);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecOutputBufferProcessRun(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE            ret = OMX_ErrorNone;
+    void                    *hMFCHandle = NULL;
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
+
+    FunctionIn();
+
+    if (pOMXComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)((EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate)->hComponentHandle;
+    if (pVideoEnc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
+    if (pMpeg4Enc == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+
+    if (nPortIndex == INPUT_PORT_INDEX) {
+        if (pMpeg4Enc->bSourceStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pMpeg4Enc->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    if (nPortIndex == OUTPUT_PORT_INDEX) {
+        if (pMpeg4Enc->bDestinationStart == OMX_FALSE) {
+            Exynos_OSAL_SignalSet(pMpeg4Enc->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32 nPortIndex)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    int i, nOutbufs;
+
+    ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+
+    FunctionIn();
+
+    if ((nPortIndex == INPUT_PORT_INDEX) &&
+        (pMpeg4Enc->bSourceStart == OMX_TRUE)) {
+        Exynos_CodecBufferReset(pExynosComponent, INPUT_PORT_INDEX);
+
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++)  {
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+
+            Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
+        }
+
+        pInbufOps->Clear_Queue(hMFCHandle);
+    } else if ((nPortIndex == OUTPUT_PORT_INDEX) &&
+               (pMpeg4Enc->bDestinationStart == OMX_TRUE)) {
+        OMX_U32 dataLen[2] = {0, 0};
+        ExynosVideoBuffer *pBuffer = NULL;
+
+        Exynos_CodecBufferReset(pExynosComponent, OUTPUT_PORT_INDEX);
+
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            pOutbufOps->Get_Buffer(hMFCHandle, i, &pBuffer);
+            Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, (OMX_PTR)pBuffer);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncOutputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncOutputBuffer[i]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+        }
+        pOutbufOps->Clear_Queue(hMFCHandle);
+    } else {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
+    void                          *hMFCHandle = pMFCMpeg4Handle->hMFCHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32                     oneFrameSize = pSrcInputData->dataLen;
+
+    ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+    ExynosVideoEncParam     *pEncParam    = NULL;
+
+    ExynosVideoGeometry      bufferConf;
+    OMX_U32                  inputBufferNumber = 0;
+    int i, nOutbufs;
+
+    FunctionIn();
+
+    if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == NULL) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        OMXBuffer->nTimeStamp = pSrcInputData->timeStamp;
+        OMXBuffer->nFlags = pSrcInputData->nFlags;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
+
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
+        Set_Mpeg4Enc_Param(pExynosComponent);
+    else
+        Set_H263Enc_Param(pExynosComponent);
+
+    pEncParam = &pMFCMpeg4Handle->encParam;
+    if (pEncOps->Set_EncParam) {
+        if(pEncOps->Set_EncParam(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, pEncParam) != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    /* input buffer info: only 3 config values needed */
+    Exynos_OSAL_Memset(&bufferConf, 0, sizeof(bufferConf));
+    bufferConf.eColorFormat = pEncParam->commonParam.FrameMap;//VIDEO_COLORFORMAT_NV12;
+    bufferConf.nFrameWidth = pExynosInputPort->portDefinition.format.video.nFrameWidth;
+    bufferConf.nFrameHeight = pExynosInputPort->portDefinition.format.video.nFrameHeight;
+    pInbufOps->Set_Shareable(hMFCHandle);
+    if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        inputBufferNumber = MAX_INPUTBUFFER_NUM_DYNAMIC;
+    } else if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        inputBufferNumber = MFC_INPUT_BUFFER_NUM_MAX;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* should be done before prepare input buffer */
+        if (pInbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    /* set input buffer geometry */
+    if (pInbufOps->Set_Geometry) {
+        if (pInbufOps->Set_Geometry(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for input buffer");
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    /* setup input buffer */
+    if (pInbufOps->Setup(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, inputBufferNumber) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup input buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
+    int plane;
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register input buffer */
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                planes[plane].addr = pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane];
+                planes[plane].allocSize = pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[plane];
+                planes[plane].fd = pVideoEnc->pMFCEncInputBuffer[i]->fd[plane];
+            }
+            if (pInbufOps->Register(hMFCHandle, planes, MFC_INPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+        }
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
+            /*************/
+            /*    TBD    */
+            /*************/
+            /* Does not require any actions. */
+        } else {
+            ret = OMX_ErrorNotImplemented;
+            goto EXIT;
+        }
+    }
+
+    pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE;
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
+    void                          *hMFCHandle = pMFCMpeg4Handle->hMFCHandle;
+    EXYNOS_OMX_BASEPORT           *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT           *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+    ExynosVideoGeometry      bufferConf;
+    int i, nOutbufs;
+
+    FunctionIn();
+
+    int OutBufferSize = pExynosOutputPort->portDefinition.format.video.nFrameWidth * pExynosOutputPort->portDefinition.format.video.nFrameHeight * 3 / 2;
+    /* set geometry for output (dst) */
+    if (pOutbufOps->Set_Geometry) {
+        /* only 2 config values needed */
+        if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
+            bufferConf.eCompressionFormat = VIDEO_CODING_MPEG4;
+        else
+            bufferConf.eCompressionFormat = VIDEO_CODING_H263;
+        bufferConf.nSizeImage = OutBufferSize;
+
+        if (pOutbufOps->Set_Geometry(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, &bufferConf) != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to set geometry for output buffer");
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    /* should be done before prepare output buffer */
+    if (pOutbufOps->Enable_Cacheable) {
+        if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) {
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    if (pOutbufOps->Set_Shareable) {
+        pOutbufOps->Set_Shareable(hMFCHandle);
+    }
+    int SetupBufferNumber = 0;
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY)
+        SetupBufferNumber = MFC_OUTPUT_BUFFER_NUM_MAX;
+    else
+        SetupBufferNumber = pExynosOutputPort->portDefinition.nBufferCountActual;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SetupBufferNumber:%d", SetupBufferNumber);
+
+    if (pOutbufOps->Setup(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle, SetupBufferNumber) != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to setup output buffer");
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0};
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        /* Register input buffer */
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            ExynosVideoPlane plane;
+            pVideoEnc->pMFCEncOutputBuffer[i] = (CODEC_ENC_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
+            pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] =
+                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, OutBufferSize, NORMAL_MEMORY);
+            if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] == NULL) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pVideoEnc->pMFCEncOutputBuffer[i]->fd[0] =
+                Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0]);
+            pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[0] = OutBufferSize;
+
+            plane.addr = pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0];
+            plane.fd = pVideoEnc->pMFCEncOutputBuffer[i]->fd[0];
+            plane.allocSize = pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize[0];
+
+            if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register output buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr,
+                                (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+        }
+    } else if ((pExynosOutputPort->bufferProcessType & BUFFER_SHARE) == BUFFER_SHARE) {
+        /* Register input buffer */
+        /*************/
+        /*    TBD    */
+        /*************/
+        ExynosVideoPlane plane;
+        for (i = 0; i < pExynosOutputPort->portDefinition.nBufferCountActual; i++) {
+            plane.addr = pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer;
+            plane.fd = pExynosOutputPort->extendBufferHeader[i].buf_fd[0];
+            plane.allocSize = OutBufferSize;
+            if (pOutbufOps->Register(hMFCHandle, &plane, MFC_OUTPUT_BUFFER_PLANE) != VIDEO_ERROR_NONE) {
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
+                ret = OMX_ErrorInsufficientResources;
+                goto EXIT;
+            }
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer,
+                                   (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+        }
+    }
+
+    /* start header encoding */
+    if (pOutbufOps->Run) {
+        if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to run output buffer");
+            ret = OMX_ErrorInsufficientResources;
+            goto EXIT;
+        }
+    }
+
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        OMX_BUFFERHEADERTYPE *OMXBuffer = NULL;
+        ExynosVideoBuffer *pVideoBuffer = NULL;
+
+        OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent);
+        if (OMXBuffer == OMX_ErrorNone) {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pOutbufOps->Dequeue", __FUNCTION__, __LINE__);
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "dst:0x%x, src:0x%x, dataSize:%d",
+                            OMXBuffer->pBuffer,
+                            pVideoBuffer->planes[0].addr,
+                            pVideoBuffer->planes[0].dataSize);
+        Exynos_OSAL_Memcpy(OMXBuffer->pBuffer, pVideoBuffer->planes[0].addr, pVideoBuffer->planes[0].dataSize);
+        OMXBuffer->nFilledLen = pVideoBuffer->planes[0].dataSize;
+        OMXBuffer->nOffset = 0;
+        OMXBuffer->nTimeStamp = 0;
+        OMXBuffer->nFlags |= OMX_BUFFERFLAG_CODECCONFIG;
+        OMXBuffer->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+        Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer);
+
+        pVideoEnc->bFirstOutput = OMX_TRUE;
+        ret = OMX_ErrorNone;
+
+        Mpeg4CodecStop(pOMXComponent, OUTPUT_PORT_INDEX);
+    }
+    pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_TRUE;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_GetParameter(
+    OMX_IN    OMX_HANDLETYPE hComponent,
+    OMX_IN    OMX_INDEXTYPE  nParamIndex,
+    OMX_INOUT OMX_PTR        pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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 (nParamIndex) {
+    case OMX_IndexParamVideoMpeg4:
+    {
+        OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = NULL;
+        EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstMpeg4Component->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstMpeg4Component->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
+    }
+        break;
+    case OMX_IndexParamVideoH263:
+    {
+        OMX_VIDEO_PARAM_H263TYPE  *pDstH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_H263TYPE  *pSrcH263Component = NULL;
+        EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstH263Component->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcH263Component = &pMpeg4Enc->h263Component[pDstH263Component->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_S32 codecType;
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE *)pComponentParameterStructure;
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
+        if (codecType == CODEC_TYPE_MPEG4)
+            Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
+        else
+            Exynos_OSAL_Strcpy((char *)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelQuerySupported:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
+        EXYNOS_OMX_VIDEO_PROFILELEVEL    *pProfileLevel = NULL;
+        OMX_U32                           maxProfileLevelNum = 0;
+        OMX_S32                           codecType;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
+        if (codecType == CODEC_TYPE_MPEG4) {
+            pProfileLevel = supportedMPEG4ProfileLevels;
+            maxProfileLevelNum = sizeof(supportedMPEG4ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
+        } else {
+            pProfileLevel = supportedH263ProfileLevels;
+            maxProfileLevelNum = sizeof(supportedH263ProfileLevels) / sizeof(EXYNOS_OMX_VIDEO_PROFILELEVEL);
+        }
+
+        if (pDstProfileLevel->nProfileIndex >= maxProfileLevelNum) {
+            ret = OMX_ErrorNoMore;
+            goto EXIT;
+        }
+
+        pProfileLevel += pDstProfileLevel->nProfileIndex;
+        pDstProfileLevel->eProfile = pProfileLevel->profile;
+        pDstProfileLevel->eLevel = pProfileLevel->level;
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelCurrent:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pDstProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_MPEG4TYPE        *pSrcMpeg4Component = NULL;
+        OMX_VIDEO_PARAM_H263TYPE         *pSrcH263Component = NULL;
+        EXYNOS_MPEG4ENC_HANDLE           *pMpeg4Enc = NULL;
+        OMX_S32                           codecType;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType;
+        if (codecType == CODEC_TYPE_MPEG4) {
+            pSrcMpeg4Component = &pMpeg4Enc->mpeg4Component[pDstProfileLevel->nPortIndex];
+            pDstProfileLevel->eProfile = pSrcMpeg4Component->eProfile;
+            pDstProfileLevel->eLevel = pSrcMpeg4Component->eLevel;
+        } else {
+            pSrcH263Component = &pMpeg4Enc->h263Component[pDstProfileLevel->nPortIndex];
+            pDstProfileLevel->eProfile = pSrcH263Component->eProfile;
+            pDstProfileLevel->eLevel = pSrcH263Component->eLevel;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = NULL;
+        EXYNOS_MPEG4ENC_HANDLE              *pMpeg4Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pDstErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pDstErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pSrcErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoEncodeGetParameter(hComponent, nParamIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_SetParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentParameterStructure)
+{
+    OMX_ERRORTYPE             ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE        *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL || pComponentParameterStructure == 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_IndexParamVideoMpeg4:
+    {
+        OMX_VIDEO_PARAM_MPEG4TYPE *pDstMpeg4Component = NULL;
+        OMX_VIDEO_PARAM_MPEG4TYPE *pSrcMpeg4Component = (OMX_VIDEO_PARAM_MPEG4TYPE *)pComponentParameterStructure;
+        EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcMpeg4Component->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcMpeg4Component->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstMpeg4Component, pSrcMpeg4Component, sizeof(OMX_VIDEO_PARAM_MPEG4TYPE));
+    }
+        break;
+    case OMX_IndexParamVideoH263:
+    {
+        OMX_VIDEO_PARAM_H263TYPE *pDstH263Component = NULL;
+        OMX_VIDEO_PARAM_H263TYPE *pSrcH263Component = (OMX_VIDEO_PARAM_H263TYPE *)pComponentParameterStructure;
+        EXYNOS_MPEG4ENC_HANDLE   *pMpeg4Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcH263Component->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstH263Component = &pMpeg4Enc->h263Component[pSrcH263Component->nPortIndex];
+
+        Exynos_OSAL_Memcpy(pDstH263Component, pSrcH263Component, sizeof(OMX_VIDEO_PARAM_H263TYPE));
+    }
+        break;
+    case OMX_IndexParamStandardComponentRole:
+    {
+        OMX_PARAM_COMPONENTROLETYPE *pComponentRole = (OMX_PARAM_COMPONENTROLETYPE*)pComponentParameterStructure;
+
+        ret = Exynos_OMX_Check_SizeVersion(pComponentRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if ((pExynosComponent->currentState != OMX_StateLoaded) && (pExynosComponent->currentState != OMX_StateWaitForResources)) {
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+
+        if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE)) {
+            pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+            //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_MPEG4;
+        } else if (!Exynos_OSAL_Strcmp((char*)pComponentRole->cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE)) {
+            pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX].portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
+            //((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType = CODEC_TYPE_H263;
+        } else {
+            ret = OMX_ErrorBadParameter;
+            goto EXIT;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoProfileLevelCurrent:
+    {
+        OMX_VIDEO_PARAM_PROFILELEVELTYPE *pSrcProfileLevel = (OMX_VIDEO_PARAM_PROFILELEVELTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_MPEG4TYPE        *pDstMpeg4Component = NULL;
+        OMX_VIDEO_PARAM_H263TYPE         *pDstH263Component = NULL;
+        EXYNOS_MPEG4ENC_HANDLE           *pMpeg4Enc = NULL;
+        OMX_S32                           codecType;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcProfileLevel, sizeof(OMX_VIDEO_PARAM_PROFILELEVELTYPE));
+        if (ret != OMX_ErrorNone)
+            goto EXIT;
+
+        if (pSrcProfileLevel->nPortIndex >= ALL_PORT_NUM) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        codecType = pMpeg4Enc->hMFCMpeg4Handle.codecType;
+        if (codecType == CODEC_TYPE_MPEG4) {
+            /*
+             * To do: Check validity of profile & level parameters
+             */
+
+            pDstMpeg4Component = &pMpeg4Enc->mpeg4Component[pSrcProfileLevel->nPortIndex];
+            pDstMpeg4Component->eProfile = pSrcProfileLevel->eProfile;
+            pDstMpeg4Component->eLevel = pSrcProfileLevel->eLevel;
+        } else {
+            /*
+             * To do: Check validity of profile & level parameters
+             */
+
+            pDstH263Component = &pMpeg4Enc->h263Component[pSrcProfileLevel->nPortIndex];
+            pDstH263Component->eProfile = pSrcProfileLevel->eProfile;
+            pDstH263Component->eLevel = pSrcProfileLevel->eLevel;
+        }
+    }
+        break;
+    case OMX_IndexParamVideoErrorCorrection:
+    {
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pSrcErrorCorrectionType = (OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *)pComponentParameterStructure;
+        OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE *pDstErrorCorrectionType = NULL;
+        EXYNOS_MPEG4ENC_HANDLE              *pMpeg4Enc = NULL;
+
+        ret = Exynos_OMX_Check_SizeVersion(pSrcErrorCorrectionType, sizeof(OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE));
+        if (ret != OMX_ErrorNone) {
+            goto EXIT;
+        }
+
+        if (pSrcErrorCorrectionType->nPortIndex != OUTPUT_PORT_INDEX) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+        pDstErrorCorrectionType = &pMpeg4Enc->errorCorrectionType[OUTPUT_PORT_INDEX];
+
+        pDstErrorCorrectionType->bEnableHEC = pSrcErrorCorrectionType->bEnableHEC;
+        pDstErrorCorrectionType->bEnableResync = pSrcErrorCorrectionType->bEnableResync;
+        pDstErrorCorrectionType->nResynchMarkerSpacing = pSrcErrorCorrectionType->nResynchMarkerSpacing;
+        pDstErrorCorrectionType->bEnableDataPartitioning = pSrcErrorCorrectionType->bEnableDataPartitioning;
+        pDstErrorCorrectionType->bEnableRVLC = pSrcErrorCorrectionType->bEnableRVLC;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoEncodeSetParameter(hComponent, nIndex, pComponentParameterStructure);
+        break;
+    }
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_GetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN 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) {
+    default:
+        ret = Exynos_OMX_VideoEncodeGetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_SetConfig(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_IN OMX_PTR        pComponentConfigStructure)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
+    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = 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;
+    }
+
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)pVideoEnc->hCodecHandle;
+
+    switch (nIndex) {
+    case OMX_IndexConfigVideoIntraPeriod:
+    {
+        OMX_U32 nPFrames = (*((OMX_U32 *)pComponentConfigStructure)) - 1;
+
+        if (pMpeg4Enc->hMFCMpeg4Handle.codecType == CODEC_TYPE_MPEG4)
+            pMpeg4Enc->mpeg4Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
+        else
+            pMpeg4Enc->h263Component[OUTPUT_PORT_INDEX].nPFrames = nPFrames;
+
+        ret = OMX_ErrorNone;
+    }
+        break;
+    default:
+        ret = Exynos_OMX_VideoEncodeSetConfig(hComponent, nIndex, pComponentConfigStructure);
+        break;
+    }
+
+EXIT:
+    if (ret == OMX_ErrorNone)
+        pVideoEnc->configChange = OMX_TRUE;
+
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_GetExtensionIndex(
+    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;
+    }
+    if (Exynos_OSAL_Strcmp(cParameterName, EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD) == 0) {
+        *pIndexType = OMX_IndexConfigVideoIntraPeriod;
+        ret = OMX_ErrorNone;
+    } else {
+        ret = Exynos_OMX_VideoEncodeGetExtensionIndex(hComponent, cParameterName, pIndexType);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_ComponentRoleEnum(
+    OMX_IN  OMX_HANDLETYPE hComponent,
+    OMX_OUT OMX_U8        *cRole,
+    OMX_IN  OMX_U32        nIndex)
+{
+    OMX_ERRORTYPE               ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
+    OMX_S32                     codecType;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (cRole == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (nIndex != (MAX_COMPONENT_ROLE_NUM - 1)) { /* supports only one role */
+        ret = OMX_ErrorNoMore;
+        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;
+    }
+
+    codecType = ((EXYNOS_MPEG4ENC_HANDLE *)(((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle))->hMFCMpeg4Handle.codecType;
+    if (codecType == CODEC_TYPE_MPEG4)
+        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
+    else
+        Exynos_OSAL_Strcpy((char *)cRole, EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Init */
+OMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;;
+    EXYNOS_MFC_MPEG4ENC_HANDLE     *pMFCMpeg4Handle    = &pMpeg4Enc->hMFCMpeg4Handle;
+    OMX_PTR                   hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    OMX_COLOR_FORMATTYPE      eColorFormat;
+
+    ExynosVideoEncOps       *pEncOps    = NULL;
+    ExynosVideoEncBufferOps *pInbufOps  = NULL;
+    ExynosVideoEncBufferOps *pOutbufOps = NULL;
+
+    CSC_METHOD csc_method = CSC_METHOD_SW;
+    int i = 0;
+
+    FunctionIn();
+
+    pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_FALSE;
+    pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst = OMX_FALSE;
+    pVideoEnc->bFirstOutput = OMX_FALSE;
+    pExynosComponent->bUseFlagEOF = OMX_TRUE;
+    pExynosComponent->bSaveFlagEOS = OMX_FALSE;
+
+    eColorFormat = pExynosInputPort->portDefinition.format.video.eColorFormat;
+    if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
+        if (eColorFormat == OMX_COLOR_FormatAndroidOpaque) {
+            pExynosInputPort->bufferProcessType = BUFFER_COPY;
+        } else {
+            pExynosInputPort->bufferProcessType = BUFFER_SHARE;
+        }
+    } else {
+        pExynosInputPort->bufferProcessType = BUFFER_COPY;
+    }
+
+    /* Mpeg4/H.263 Codec Open */
+    ret = Mpeg4CodecOpen(pMpeg4Enc);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+
+    if ((pExynosInputPort->bStoreMetaData != OMX_TRUE) &&
+        (eColorFormat != OMX_COLOR_FormatAndroidOpaque)) {
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID);
+            Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+
+            for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+                pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
+                /* Use ION Allocator */
+                /*Alloc Y-Buffer */
+                pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
+                pVideoEnc->pMFCEncInputBuffer[i]->fd[0] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+                pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
+                /*Alloc C-Buffer */
+                pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
+                pVideoEnc->pMFCEncInputBuffer[i]->fd[1] = Exynos_OSAL_SharedMemory_VirtToION(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+                pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
+
+                pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
+
+                if ((pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0] == NULL) ||
+                    (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1] == NULL)) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
+                    ret = OMX_ErrorInsufficientResources;
+                    goto EXIT;
+                }
+
+                /* MFC input buffers are 1 plane. */
+                pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[2] = NULL;
+                pVideoEnc->pMFCEncInputBuffer[i]->fd[2] = -1;
+                pVideoEnc->pMFCEncInputBuffer[i]->bufferSize[2] = 0;
+
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]);
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[0]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]);
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->pVirAddr[1]: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[1]);
+
+                Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]);
+            }
+        } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+            /*************/
+            /*    TBD    */
+            /*************/
+            /* Does not require any actions. */
+        }
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID);
+        Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    pMpeg4Enc->bSourceStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pMpeg4Enc->hSourceStartEvent);
+    pMpeg4Enc->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalCreate(&pMpeg4Enc->hDestinationStartEvent);
+
+    Exynos_OSAL_Memset(pExynosComponent->timeStamp, -19771003, sizeof(OMX_TICKS) * MAX_TIMESTAMP);
+    Exynos_OSAL_Memset(pExynosComponent->nFlags, 0, sizeof(OMX_U32) * MAX_FLAGS);
+    pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp = 0;
+    pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp = 0;
+
+    pExynosComponent->getAllDelayBuffer = OMX_FALSE;
+
+#if 0//defined(USE_CSC_GSCALER)
+    csc_method = CSC_METHOD_HW; //in case of Use ION buffer.
+#endif
+    pVideoEnc->csc_handle = csc_init(csc_method);
+    if (pVideoEnc->csc_handle == NULL) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+    pVideoEnc->csc_set_format = OMX_FALSE;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+/* MFC Terminate */
+OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle);
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    OMX_PTR                hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+
+    ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+
+    int i = 0, plane = 0;
+
+    FunctionIn();
+
+    if (pVideoEnc->csc_handle != NULL) {
+        csc_deinit(pVideoEnc->csc_handle);
+        pVideoEnc->csc_handle = NULL;
+    }
+
+    Exynos_OSAL_SignalTerminate(pMpeg4Enc->hDestinationStartEvent);
+    pMpeg4Enc->hDestinationStartEvent = NULL;
+    pMpeg4Enc->bDestinationStart = OMX_FALSE;
+    Exynos_OSAL_SignalTerminate(pMpeg4Enc->hSourceStartEvent);
+    pMpeg4Enc->hSourceStartEvent = NULL;
+    pMpeg4Enc->bSourceStart = OMX_FALSE;
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoEnc->pMFCEncOutputBuffer[i] != NULL) {
+                if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] != NULL)
+                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0]);
+                Exynos_OSAL_Free(pVideoEnc->pMFCEncOutputBuffer[i]);
+                pVideoEnc->pMFCEncOutputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosOutputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosOutputPort->codecSemID);
+    } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
+            if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) {
+                for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                    if (pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane] != NULL)
+                        Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[plane]);
+                }
+                Exynos_OSAL_Free(pVideoEnc->pMFCEncInputBuffer[i]);
+                pVideoEnc->pMFCEncInputBuffer[i] = NULL;
+            }
+        }
+
+        Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ);
+        Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID);
+    } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
+        /*************/
+        /*    TBD    */
+        /*************/
+        /* Does not require any actions. */
+    }
+    Mpeg4CodecClose(pMpeg4Enc);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE               ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    EXYNOS_OMX_BASEPORT *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    OMX_U32  oneFrameSize = pSrcInputData->dataLen;
+    ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+    int i;
+
+    FunctionIn();
+
+    if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCSrc == OMX_FALSE) {
+        ret = Mpeg4CodecSrcSetup(pOMXComponent, pSrcInputData);
+        if ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)
+            goto EXIT;
+    }
+    if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_FALSE) {
+        ret = Mpeg4CodecDstSetup(pOMXComponent);
+    }
+
+    if ((pSrcInputData->dataLen >= 0) ||
+        ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
+        OMX_U32 pMFCYUVDataSize[MFC_INPUT_BUFFER_PLANE]  = {NULL, NULL};
+        ExynosVideoPlane planes[MFC_INPUT_BUFFER_PLANE];
+        int plane;
+
+        pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->timeStamp;
+        pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp] = pSrcInputData->nFlags;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "input timestamp %lld us (%.2f secs), Tag: %d, nFlags: 0x%x", pSrcInputData->timeStamp, pSrcInputData->timeStamp / 1E6, pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp, pSrcInputData->nFlags);
+        pEncOps->Set_FrameTag(hMFCHandle, pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp);
+        pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp++;
+        pMpeg4Enc->hMFCMpeg4Handle.indexTimestamp %= MAX_TIMESTAMP;
+
+        /* queue work for input buffer */
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Exynos_Mpeg4Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize, pSrcInputData->bufferHeader);
+        pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
+        pMFCYUVDataSize[1] = pMFCYUVDataSize[0] / 2;
+
+#ifdef USE_METADATABUFFERTYPE
+        nAllocLen[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
+                            ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
+        nAllocLen[1] = ALIGN(nAllocLen[0]/2,256);
+
+        if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+            (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+            codecReturn = pInbufOps->ExtensionEnqueue(hMFCHandle,
+                                        (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                        (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.fd,
+                                        (unsigned int *)nAllocLen, (unsigned int *)pMFCYUVDataSize,
+                                        MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        } else {
+            codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                        (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+        }
+#else
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                    (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+#endif
+        if (codecReturn != VIDEO_ERROR_NONE) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pInbufOps->Enqueue", __FUNCTION__, __LINE__);
+            ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
+            goto EXIT;
+        }
+        Mpeg4CodecStart(pOMXComponent, INPUT_PORT_INDEX);
+        if (pMpeg4Enc->bSourceStart == OMX_FALSE) {
+            pMpeg4Enc->bSourceStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pMpeg4Enc->hSourceStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+        if (pMpeg4Enc->bDestinationStart == OMX_FALSE) {
+            pMpeg4Enc->bDestinationStart = OMX_TRUE;
+            Exynos_OSAL_SignalSet(pMpeg4Enc->hDestinationStartEvent);
+            Exynos_OSAL_SleepMillisec(0);
+        }
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    EXYNOS_OMX_BASEPORT     *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoBuffer        videoBuffer;
+
+    FunctionIn();
+
+    if ((pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+        (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+        if (pInbufOps->ExtensionDequeue(hMFCHandle, &videoBuffer) == VIDEO_ERROR_NONE)
+            pVideoBuffer = &videoBuffer;
+        else
+            pVideoBuffer = NULL;
+    } else {
+        pVideoBuffer = pInbufOps->Dequeue(hMFCHandle);
+    }
+
+    pSrcOutputData->dataLen       = 0;
+    pSrcOutputData->usedDataLen   = 0;
+    pSrcOutputData->remainDataLen = 0;
+    pSrcOutputData->nFlags    = 0;
+    pSrcOutputData->timeStamp = 0;
+
+    if (pVideoBuffer == NULL) {
+        pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
+        pSrcOutputData->allocSize  = 0;
+        pSrcOutputData->pPrivate = NULL;
+        pSrcOutputData->bufferHeader = NULL;
+    } else {
+        int plane = 0;
+        for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+            pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[plane] = pVideoBuffer->planes[plane].addr;
+            pSrcOutputData->buffer.multiPlaneBuffer.fd[plane] = pVideoBuffer->planes[plane].fd;
+        }
+        pSrcOutputData->allocSize = pVideoBuffer->planes[0].allocSize +
+                                        pVideoBuffer->planes[1].allocSize +
+                                        pVideoBuffer->planes[2].allocSize;
+
+        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+            int i = 0;
+            while (pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[0] != pVideoEnc->pMFCEncInputBuffer[i]->pVirAddr[0]) {
+                if (i >= MFC_INPUT_BUFFER_NUM_MAX) {
+                    Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - Lost buffer", __FUNCTION__, __LINE__);
+                    ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
+                    goto EXIT;
+                }
+                i++;
+            }
+            pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
+            pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i];
+        }
+
+        /* For Share Buffer */
+        pSrcOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE*)pVideoBuffer->pPrivate;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+    OMX_U32 dataLen = 0;
+    ExynosVideoErrorType codecReturn = VIDEO_ERROR_NONE;
+
+    FunctionIn();
+
+    if (pDstInputData->buffer.singlePlaneBuffer.dataBuffer == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to find input buffer");
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer,
+                     (unsigned int *)&dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
+
+    if (codecReturn != VIDEO_ERROR_NONE) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - pOutbufOps->Enqueue", __FUNCTION__, __LINE__);
+        ret = (OMX_ERRORTYPE)OMX_ErrorCodecEncode;
+        goto EXIT;
+    }
+    Mpeg4CodecStart(pOMXComponent, OUTPUT_PORT_INDEX);
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE                  ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    EXYNOS_MPEG4ENC_HANDLE         *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    void                          *hMFCHandle = pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle;
+    ExynosVideoEncOps       *pEncOps    = pMpeg4Enc->hMFCMpeg4Handle.pEncOps;
+    ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
+    ExynosVideoBuffer       *pVideoBuffer;
+    ExynosVideoFrameStatusType displayStatus = VIDEO_FRAME_STATUS_UNKNOWN;
+    ExynosVideoGeometry bufferGeometry;
+    OMX_S32 indexTimestamp = 0;
+
+    FunctionIn();
+
+    if (pMpeg4Enc->bDestinationStart == OMX_FALSE) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pVideoBuffer = pOutbufOps->Dequeue(hMFCHandle)) == NULL) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp++;
+    pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
+
+    pDstOutputData->buffer.singlePlaneBuffer.dataBuffer = pVideoBuffer->planes[0].addr;
+    pDstOutputData->buffer.singlePlaneBuffer.fd = pVideoBuffer->planes[0].fd;
+    pDstOutputData->allocSize   = pVideoBuffer->planes[0].allocSize;
+    pDstOutputData->dataLen     = pVideoBuffer->planes[0].dataSize;
+    pDstOutputData->remainDataLen = pVideoBuffer->planes[0].dataSize;
+    pDstOutputData->usedDataLen = 0;
+    pDstOutputData->pPrivate = pVideoBuffer;
+    /* For Share Buffer */
+    pDstOutputData->bufferHeader = (OMX_BUFFERHEADERTYPE *)pVideoBuffer->pPrivate;
+
+    if (pVideoEnc->bFirstOutput == OMX_FALSE) {
+        OMX_U8 *p = NULL;
+
+        pDstOutputData->timeStamp = 0;
+        pDstOutputData->nFlags |= OMX_BUFFERFLAG_CODECCONFIG;
+        pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+        pVideoEnc->bFirstOutput = OMX_TRUE;
+    } else {
+        indexTimestamp = pEncOps->Get_FrameTag(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle);
+        if ((indexTimestamp < 0) || (indexTimestamp >= MAX_TIMESTAMP)) {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[pMpeg4Enc->hMFCMpeg4Handle.outputIndexTimestamp];
+        } else {
+            pDstOutputData->timeStamp = pExynosComponent->timeStamp[indexTimestamp];
+            pDstOutputData->nFlags = pExynosComponent->nFlags[indexTimestamp];
+        }
+
+        pDstOutputData->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
+        if (pVideoBuffer->frameType == VIDEO_FRAME_I)
+            pDstOutputData->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;
+    }
+
+    if ((displayStatus == VIDEO_FRAME_STATUS_CHANGE_RESOL) ||
+        ((pDstOutputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%x displayStatus:%d, nFlags0x%x", pExynosComponent, displayStatus, pDstOutputData->nFlags);
+        pDstOutputData->remainDataLen = 0;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_srcInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    ret = Exynos_Mpeg4Enc_SrcIn(pOMXComponent, pSrcInputData);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcIn -> event is thrown to client", __FUNCTION__, __LINE__);
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_srcOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pSrcOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosInputPort)) || (!CHECK_PORT_POPULATED(pExynosInputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, INPUT_PORT_INDEX)) {
+            ret = OMX_ErrorNone;
+            goto EXIT;
+        }
+    }
+    if ((pMpeg4Enc->bSourceStart == OMX_FALSE) &&
+       (!CHECK_PORT_BEING_FLUSHED(pExynosInputPort))) {
+        Exynos_OSAL_SignalWait(pMpeg4Enc->hSourceStartEvent, DEF_MAX_WAIT_TIME);
+        Exynos_OSAL_SignalReset(pMpeg4Enc->hSourceStartEvent);
+    }
+
+    ret = Exynos_Mpeg4Enc_SrcOut(pOMXComponent, pSrcOutputData);
+    if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - SrcOut -> event is thrown to client", __FUNCTION__, __LINE__);
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_dstInputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstInputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
+        if ((pMpeg4Enc->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pMpeg4Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pMpeg4Enc->hDestinationStartEvent);
+        }
+    }
+    if (pMpeg4Enc->hMFCMpeg4Handle.bConfiguredMFCDst == OMX_TRUE) {
+        ret = Exynos_Mpeg4Enc_DstIn(pOMXComponent, pDstInputData);
+        if (ret != OMX_ErrorNone) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstIn -> event is thrown to client", __FUNCTION__, __LINE__);
+            pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+        }
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_Mpeg4Enc_dstOutputBufferProcess(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA *pDstOutputData)
+{
+    OMX_ERRORTYPE             ret = OMX_ErrorNone;
+    EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    EXYNOS_MPEG4ENC_HANDLE    *pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    EXYNOS_OMX_BASEPORT      *pExynosOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+
+    FunctionIn();
+
+    if ((!CHECK_PORT_ENABLED(pExynosOutputPort)) || (!CHECK_PORT_POPULATED(pExynosOutputPort))) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+    if (OMX_FALSE == Exynos_Check_BufferProcess_State(pExynosComponent, OUTPUT_PORT_INDEX)) {
+        ret = OMX_ErrorNone;
+        goto EXIT;
+    }
+
+    if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
+        if ((pMpeg4Enc->bDestinationStart == OMX_FALSE) &&
+           (!CHECK_PORT_BEING_FLUSHED(pExynosOutputPort))) {
+            Exynos_OSAL_SignalWait(pMpeg4Enc->hDestinationStartEvent, DEF_MAX_WAIT_TIME);
+            Exynos_OSAL_SignalReset(pMpeg4Enc->hDestinationStartEvent);
+        }
+    }
+    ret = Exynos_Mpeg4Enc_DstOut(pOMXComponent, pDstOutputData);
+    if ((ret != OMX_ErrorNone) && (pExynosComponent->currentState == OMX_StateExecuting)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: %d: Failed - DstOut -> event is thrown to client", __FUNCTION__, __LINE__);
+        pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
+                                                pExynosComponent->callbackData,
+                                                OMX_EventError, ret, 0, NULL);
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName)
+{
+    OMX_ERRORTYPE                  ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE             *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT      *pExynosComponent = NULL;
+    EXYNOS_OMX_BASEPORT           *pExynosPort      = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc        = NULL;
+    EXYNOS_MPEG4ENC_HANDLE        *pMpeg4Enc        = NULL;
+    OMX_S32                        codecType        = -1;
+    int i = 0;
+
+    FunctionIn();
+
+    if ((hComponent == NULL) || (componentName == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: parameters are null, ret: %X", __FUNCTION__, ret);
+        goto EXIT;
+    }
+    if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_MPEG4_ENC, componentName) == 0) {
+        codecType = CODEC_TYPE_MPEG4;
+    } else if (Exynos_OSAL_Strcmp(EXYNOS_OMX_COMPONENT_H263_ENC, componentName) == 0) {
+        codecType = CODEC_TYPE_H263;
+    } else {
+        ret = OMX_ErrorBadParameter;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName(%s) error, ret: %X", __FUNCTION__, componentName, ret);
+        goto EXIT;
+    }
+
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    ret = Exynos_OMX_VideoEncodeComponentInit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_VideoDecodeComponentInit error, ret: %X", __FUNCTION__, ret);
+        goto EXIT;
+    }
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pExynosComponent->codecType = HW_VIDEO_ENC_CODEC;
+
+    pExynosComponent->componentName = (OMX_STRING)Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_NAME_SIZE);
+    if (pExynosComponent->componentName == NULL) {
+        Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: componentName alloc error, ret: %X", __FUNCTION__, ret);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pExynosComponent->componentName, 0, MAX_OMX_COMPONENT_NAME_SIZE);
+
+    pMpeg4Enc = Exynos_OSAL_Malloc(sizeof(EXYNOS_MPEG4ENC_HANDLE));
+    if (pMpeg4Enc == NULL) {
+        Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: EXYNOS_MPEG4ENC_HANDLE alloc error, ret: %X", __FUNCTION__, ret);
+        goto EXIT;
+    }
+    Exynos_OSAL_Memset(pMpeg4Enc, 0, sizeof(EXYNOS_MPEG4ENC_HANDLE));
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+    pVideoEnc->hCodecHandle = (OMX_HANDLETYPE)pMpeg4Enc;
+    pMpeg4Enc->hMFCMpeg4Handle.codecType = codecType;
+
+    if (codecType == CODEC_TYPE_MPEG4)
+        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_MPEG4_ENC);
+    else
+        Exynos_OSAL_Strcpy(pExynosComponent->componentName, EXYNOS_OMX_COMPONENT_H263_ENC);
+
+    /* Set componentVersion */
+    pExynosComponent->componentVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->componentVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->componentVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->componentVersion.s.nStep         = STEP_NUMBER;
+    /* Set specVersion */
+    pExynosComponent->specVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER;
+    pExynosComponent->specVersion.s.nVersionMinor = VERSIONMINOR_NUMBER;
+    pExynosComponent->specVersion.s.nRevision     = REVISION_NUMBER;
+    pExynosComponent->specVersion.s.nStep         = STEP_NUMBER;
+
+    /* Input port */
+    pExynosPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nBitrate = 64000;
+    pExynosPort->portDefinition.format.video.xFramerate= (15 << 16);
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_INPUT_BUFFER_SIZE;
+    pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingUnused;
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+    Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "raw/video");
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatYUV420SemiPlanar;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_COPY;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    /* Output port */
+    pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX];
+    pExynosPort->portDefinition.format.video.nFrameWidth = DEFAULT_FRAME_WIDTH;
+    pExynosPort->portDefinition.format.video.nFrameHeight= DEFAULT_FRAME_HEIGHT;
+    pExynosPort->portDefinition.format.video.nBitrate = 64000;
+    pExynosPort->portDefinition.format.video.xFramerate= (15 << 16);
+    pExynosPort->portDefinition.nBufferSize = DEFAULT_VIDEO_OUTPUT_BUFFER_SIZE;
+    if (codecType == CODEC_TYPE_MPEG4) {
+        pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingMPEG4;
+        Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+        Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/mpeg4");
+    } else {
+        pExynosPort->portDefinition.format.video.eCompressionFormat = OMX_VIDEO_CodingH263;
+        Exynos_OSAL_Memset(pExynosPort->portDefinition.format.video.cMIMEType, 0, MAX_OMX_MIMETYPE_SIZE);
+        Exynos_OSAL_Strcpy(pExynosPort->portDefinition.format.video.cMIMEType, "video/h263");
+    }
+    pExynosPort->portDefinition.format.video.pNativeRender = 0;
+    pExynosPort->portDefinition.format.video.bFlagErrorConcealment = OMX_FALSE;
+    pExynosPort->portDefinition.format.video.eColorFormat = OMX_COLOR_FormatUnused;
+    pExynosPort->portDefinition.bEnabled = OMX_TRUE;
+    pExynosPort->bufferProcessType = BUFFER_SHARE;
+    pExynosPort->portWayType = WAY2_PORT;
+
+    if (codecType == CODEC_TYPE_MPEG4) {
+        for(i = 0; i < ALL_PORT_NUM; i++) {
+            INIT_SET_SIZE_VERSION(&pMpeg4Enc->mpeg4Component[i], OMX_VIDEO_PARAM_MPEG4TYPE);
+            pMpeg4Enc->mpeg4Component[i].nPortIndex = i;
+            pMpeg4Enc->mpeg4Component[i].eProfile   = OMX_VIDEO_MPEG4ProfileSimple;
+            pMpeg4Enc->mpeg4Component[i].eLevel     = OMX_VIDEO_MPEG4Level4;
+
+            pMpeg4Enc->mpeg4Component[i].nPFrames = 10;
+            pMpeg4Enc->mpeg4Component[i].nBFrames = 0;          /* No support for B frames */
+            pMpeg4Enc->mpeg4Component[i].nMaxPacketSize = 256;  /* Default value */
+            pMpeg4Enc->mpeg4Component[i].nAllowedPictureTypes =  OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
+            pMpeg4Enc->mpeg4Component[i].bGov = OMX_FALSE;
+
+        }
+    } else {
+        for(i = 0; i < ALL_PORT_NUM; i++) {
+            INIT_SET_SIZE_VERSION(&pMpeg4Enc->h263Component[i], OMX_VIDEO_PARAM_H263TYPE);
+            pMpeg4Enc->h263Component[i].nPortIndex = i;
+            pMpeg4Enc->h263Component[i].eProfile   = OMX_VIDEO_H263ProfileBaseline;
+            pMpeg4Enc->h263Component[i].eLevel     = OMX_VIDEO_H263Level45;
+
+            pMpeg4Enc->h263Component[i].nPFrames = 20;
+            pMpeg4Enc->h263Component[i].nBFrames = 0;          /* No support for B frames */
+            pMpeg4Enc->h263Component[i].bPLUSPTYPEAllowed = OMX_FALSE;
+            pMpeg4Enc->h263Component[i].nAllowedPictureTypes = OMX_VIDEO_PictureTypeI | OMX_VIDEO_PictureTypeP;
+            pMpeg4Enc->h263Component[i].bForceRoundingTypeToZero = OMX_TRUE;
+            pMpeg4Enc->h263Component[i].nPictureHeaderRepetition = 0;
+            pMpeg4Enc->h263Component[i].nGOBHeaderInterval = 0;
+        }
+    }
+
+    pOMXComponent->GetParameter      = &Exynos_Mpeg4Enc_GetParameter;
+    pOMXComponent->SetParameter      = &Exynos_Mpeg4Enc_SetParameter;
+    pOMXComponent->GetConfig         = &Exynos_Mpeg4Enc_GetConfig;
+    pOMXComponent->SetConfig         = &Exynos_Mpeg4Enc_SetConfig;
+    pOMXComponent->GetExtensionIndex = &Exynos_Mpeg4Enc_GetExtensionIndex;
+    pOMXComponent->ComponentRoleEnum = &Exynos_Mpeg4Enc_ComponentRoleEnum;
+    pOMXComponent->ComponentDeInit   = &Exynos_OMX_ComponentDeinit;
+
+    pExynosComponent->exynos_codec_componentInit      = &Exynos_Mpeg4Enc_Init;
+    pExynosComponent->exynos_codec_componentTerminate = &Exynos_Mpeg4Enc_Terminate;
+
+    pVideoEnc->exynos_codec_srcInputProcess  = &Exynos_Mpeg4Enc_srcInputBufferProcess;
+    pVideoEnc->exynos_codec_srcOutputProcess = &Exynos_Mpeg4Enc_srcOutputBufferProcess;
+    pVideoEnc->exynos_codec_dstInputProcess  = &Exynos_Mpeg4Enc_dstInputBufferProcess;
+    pVideoEnc->exynos_codec_dstOutputProcess = &Exynos_Mpeg4Enc_dstOutputBufferProcess;
+
+    pVideoEnc->exynos_codec_start         = &Mpeg4CodecStart;
+    pVideoEnc->exynos_codec_stop          = &Mpeg4CodecStop;
+    pVideoEnc->exynos_codec_bufferProcessRun = &Mpeg4CodecOutputBufferProcessRun;
+    pVideoEnc->exynos_codec_enqueueAllBuffer = &Mpeg4CodecEnQueueAllBuffer;
+
+    pVideoEnc->exynos_checkInputFrame        = NULL;
+    pVideoEnc->exynos_codec_getCodecInputPrivateData  = &GetCodecInputPrivateData;
+    pVideoEnc->exynos_codec_getCodecOutputPrivateData = &GetCodecOutputPrivateData;
+
+    pVideoEnc->hSharedMemory = Exynos_OSAL_SharedMemory_Open();
+    if (pVideoEnc->hSharedMemory == NULL) {
+        Exynos_OSAL_Free(pMpeg4Enc);
+        pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
+        Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    pExynosComponent->currentState = OMX_StateLoaded;
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE               ret              = OMX_ErrorNone;
+    OMX_COMPONENTTYPE          *pOMXComponent    = NULL;
+    EXYNOS_OMX_BASECOMPONENT   *pExynosComponent = NULL;
+    EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = NULL;
+    EXYNOS_MPEG4ENC_HANDLE     *pMpeg4Enc        = NULL;
+
+    FunctionIn();
+
+    if (hComponent == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    pOMXComponent = (OMX_COMPONENTTYPE *)hComponent;
+    pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate;
+    pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
+
+    Exynos_OSAL_SharedMemory_Close(pVideoEnc->hSharedMemory);
+
+    Exynos_OSAL_Free(pExynosComponent->componentName);
+    pExynosComponent->componentName = NULL;
+
+    pMpeg4Enc = (EXYNOS_MPEG4ENC_HANDLE *)((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle;
+    if (pMpeg4Enc != NULL) {
+        Exynos_OSAL_Free(pMpeg4Enc);
+        pMpeg4Enc = ((EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle)->hCodecHandle = NULL;
+    }
+
+    ret = Exynos_OMX_VideoEncodeComponentDeinit(pOMXComponent);
+    if (ret != OMX_ErrorNone) {
+        goto EXIT;
+    }
+
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.h b/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.h
new file mode 100644 (file)
index 0000000..a258587
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ *
+ * 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_Mpeg4enc.h
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_MPEG4_ENC_COMPONENT
+#define EXYNOS_OMX_MPEG4_ENC_COMPONENT
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "OMX_Video.h"
+
+typedef enum _CODEC_TYPE
+{
+    CODEC_TYPE_H263,
+    CODEC_TYPE_MPEG4
+} CODEC_TYPE;
+
+typedef struct _EXYNOS_MFC_MPEG4ENC_HANDLE
+{
+    OMX_HANDLETYPE             hMFCHandle;
+
+    OMX_U32                    indexTimestamp;
+    OMX_U32 outputIndexTimestamp;
+    OMX_BOOL bConfiguredMFCSrc;
+    OMX_BOOL bConfiguredMFCDst;
+    CODEC_TYPE                 codecType;
+
+    ExynosVideoDecOps *pEncOps;
+    ExynosVideoDecBufferOps *pInbufOps;
+    ExynosVideoDecBufferOps *pOutbufOps;
+    ExynosVideoEncParam      encParam;
+} EXYNOS_MFC_MPEG4ENC_HANDLE;
+
+typedef struct _EXYNOS_MPEG4ENC_HANDLE
+{
+    /* OMX Codec specific */
+    OMX_VIDEO_PARAM_H263TYPE  h263Component[ALL_PORT_NUM];
+    OMX_VIDEO_PARAM_MPEG4TYPE mpeg4Component[ALL_PORT_NUM];
+    OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE errorCorrectionType[ALL_PORT_NUM];
+
+    /* SEC MFC Codec specific */
+    EXYNOS_MFC_MPEG4ENC_HANDLE   hMFCMpeg4Handle;
+
+    OMX_BOOL bSourceStart;
+    OMX_BOOL bDestinationStart;
+    OMX_HANDLETYPE hSourceStartEvent;
+    OMX_HANDLETYPE hDestinationStartEvent;
+} EXYNOS_MPEG4ENC_HANDLE;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF OMX_ERRORTYPE Exynos_OMX_ComponentInit(OMX_HANDLETYPE hComponent, OMX_STRING componentName);
+                OMX_ERRORTYPE Exynos_OMX_ComponentDeinit(OMX_HANDLETYPE hComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
diff --git a/component/video/enc/mpeg4/library_register.c b/component/video/enc/mpeg4/library_register.c
new file mode 100644 (file)
index 0000000..34c59ba
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ *
+ * 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        library_register.c
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <dlfcn.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_ETC.h"
+#include "library_register.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_MPEG4_ENC"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(ExynosRegisterComponentType **ppExynosComponent)
+{
+    FunctionIn();
+
+    if (ppExynosComponent == NULL)
+        goto EXIT;
+
+    /* component 1 - video encoder MPEG4 */
+    Exynos_OSAL_Strcpy(ppExynosComponent[0]->componentName, EXYNOS_OMX_COMPONENT_MPEG4_ENC);
+    Exynos_OSAL_Strcpy(ppExynosComponent[0]->roles[0], EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE);
+    ppExynosComponent[0]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+    /* component 2 - video encoder H.263 */
+    Exynos_OSAL_Strcpy(ppExynosComponent[1]->componentName, EXYNOS_OMX_COMPONENT_H263_ENC);
+    Exynos_OSAL_Strcpy(ppExynosComponent[1]->roles[0], EXYNOS_OMX_COMPONENT_H263_ENC_ROLE);
+    ppExynosComponent[1]->totalRoleNum = MAX_COMPONENT_ROLE_NUM;
+
+EXIT:
+    FunctionOut();
+
+    return MAX_COMPONENT_NUM;
+}
diff --git a/component/video/enc/mpeg4/library_register.h b/component/video/enc/mpeg4/library_register.h
new file mode 100644 (file)
index 0000000..60f6037
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ *
+ * 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        library_register.h
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_MPEG4_ENC_REG
+#define EXYNOS_OMX_MPEG4_ENC_REG
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Component.h"
+#include "Exynos_OMX_Component_Register.h"
+
+
+#define OSCL_EXPORT_REF __attribute__((visibility("default")))
+#define MAX_COMPONENT_NUM       2
+#define MAX_COMPONENT_ROLE_NUM  1
+
+/* MPEG4 */
+#define EXYNOS_OMX_COMPONENT_MPEG4_ENC         "OMX.Exynos.MPEG4.Encoder"
+#define EXYNOS_OMX_COMPONENT_MPEG4_ENC_ROLE    "video_encoder.mpeg4"
+
+/* H.263 */
+#define EXYNOS_OMX_COMPONENT_H263_ENC          "OMX.Exynos.H263.Encoder"
+#define EXYNOS_OMX_COMPONENT_H263_ENC_ROLE     "video_encoder.h263"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OSCL_EXPORT_REF int Exynos_OMX_COMPONENT_Library_Register(ExynosRegisterComponentType **ppExynosComponent);
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif
+
diff --git a/core/Android.mk b/core/Android.mk
new file mode 100644 (file)
index 0000000..0e0bcb6
--- /dev/null
@@ -0,0 +1,27 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OMX_Component_Register.c \
+       Exynos_OMX_Core.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libExynosOMX_Core
+
+LOCAL_CFLAGS :=
+
+LOCAL_ARM_MODE := arm
+
+LOCAL_STATIC_LIBRARIES := libExynosOMX_OSAL libExynosOMX_Basecomponent
+LOCAL_SHARED_LIBRARIES := libc libdl libcutils libutils \
+       libExynosOMX_Resourcemanager
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_TOP)/component/common
+
+include $(BUILD_SHARED_LIBRARY)
+
diff --git a/core/Exynos_OMX_Component_Register.c b/core/Exynos_OMX_Component_Register.c
new file mode 100644 (file)
index 0000000..f44dcdc
--- /dev/null
@@ -0,0 +1,263 @@
+/*
+ *
+ * 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_Component_Register.c
+ * @brief      Exynos OpenMAX IL Component Register
+ * @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 <dlfcn.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <errno.h>
+#include <assert.h>
+#include <dirent.h>
+
+#include "OMX_Component.h"
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Library.h"
+#include "Exynos_OMX_Component_Register.h"
+#include "Exynos_OMX_Macros.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_COMP_REGS"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+OMX_ERRORTYPE Exynos_OMX_Component_Register(EXYNOS_OMX_COMPONENT_REGLIST **compList, OMX_U32 *compNum)
+{
+    OMX_ERRORTYPE  ret = OMX_ErrorNone;
+    int            componentNum = 0, roleNum = 0, totalCompNum = 0;
+    int            read;
+    char          *libName;
+    size_t         len;
+    const char    *errorMsg;
+    DIR           *dir;
+    struct dirent *d;
+
+    int (*Exynos_OMX_COMPONENT_Library_Register)(ExynosRegisterComponentType **exynosComponents);
+    ExynosRegisterComponentType **exynosComponentsTemp;
+    EXYNOS_OMX_COMPONENT_REGLIST *componentList;
+
+    FunctionIn();
+
+    dir = opendir(EXYNOS_OMX_INSTALL_PATH);
+    if (dir == NULL) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    componentList = (EXYNOS_OMX_COMPONENT_REGLIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_COMPONENT_REGLIST) * MAX_OMX_COMPONENT_NUM);
+    Exynos_OSAL_Memset(componentList, 0, sizeof(EXYNOS_OMX_COMPONENT_REGLIST) * MAX_OMX_COMPONENT_NUM);
+    libName = Exynos_OSAL_Malloc(MAX_OMX_COMPONENT_LIBNAME_SIZE);
+
+    while ((d = readdir(dir)) != NULL) {
+        OMX_HANDLETYPE soHandle;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s", d->d_name);
+
+        if (Exynos_OSAL_Strncmp(d->d_name, "libOMX.Exynos.", Exynos_OSAL_Strlen("libOMX.Exynos.")) == 0) {
+            Exynos_OSAL_Memset(libName, 0, MAX_OMX_COMPONENT_LIBNAME_SIZE);
+            Exynos_OSAL_Strcpy(libName, EXYNOS_OMX_INSTALL_PATH);
+            Exynos_OSAL_Strcat(libName, d->d_name);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Path & libName : %s", libName);
+            if ((soHandle = Exynos_OSAL_dlopen(libName, RTLD_NOW)) != NULL) {
+                Exynos_OSAL_dlerror();    /* clear error*/
+                if ((Exynos_OMX_COMPONENT_Library_Register = Exynos_OSAL_dlsym(soHandle, "Exynos_OMX_COMPONENT_Library_Register")) != NULL) {
+                    int i = 0;
+                    unsigned int j = 0;
+
+                    componentNum = (*Exynos_OMX_COMPONENT_Library_Register)(NULL);
+                    exynosComponentsTemp = (ExynosRegisterComponentType **)Exynos_OSAL_Malloc(sizeof(ExynosRegisterComponentType*) * componentNum);
+                    for (i = 0; i < componentNum; i++) {
+                        exynosComponentsTemp[i] = Exynos_OSAL_Malloc(sizeof(ExynosRegisterComponentType));
+                        Exynos_OSAL_Memset(exynosComponentsTemp[i], 0, sizeof(ExynosRegisterComponentType));
+                    }
+                    (*Exynos_OMX_COMPONENT_Library_Register)(exynosComponentsTemp);
+
+                    for (i = 0; i < componentNum; i++) {
+                        Exynos_OSAL_Strcpy(componentList[totalCompNum].component.componentName, exynosComponentsTemp[i]->componentName);
+                        for (j = 0; j < exynosComponentsTemp[i]->totalRoleNum; j++)
+                            Exynos_OSAL_Strcpy(componentList[totalCompNum].component.roles[j], exynosComponentsTemp[i]->roles[j]);
+                        componentList[totalCompNum].component.totalRoleNum = exynosComponentsTemp[i]->totalRoleNum;
+
+                        Exynos_OSAL_Strcpy(componentList[totalCompNum].libName, libName);
+
+                        totalCompNum++;
+                    }
+                    for (i = 0; i < componentNum; i++) {
+                        Exynos_OSAL_Free(exynosComponentsTemp[i]);
+                    }
+
+                    Exynos_OSAL_Free(exynosComponentsTemp);
+                } else {
+                    if ((errorMsg = Exynos_OSAL_dlerror()) != NULL)
+                        Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "dlsym failed: %s", errorMsg);
+                }
+                Exynos_OSAL_dlclose(soHandle);
+            } else {
+                Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "dlopen failed: %s", Exynos_OSAL_dlerror());
+            }
+        } else {
+            /* not a component name line. skip */
+            continue;
+        }
+    }
+
+    Exynos_OSAL_Free(libName);
+
+    closedir(dir);
+
+    *compList = componentList;
+    *compNum = totalCompNum;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_Component_Unregister(EXYNOS_OMX_COMPONENT_REGLIST *componentList)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    Exynos_OSAL_Free(componentList);
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentAPICheck(OMX_COMPONENTTYPE *component)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if ((NULL == component->GetComponentVersion)    ||
+        (NULL == component->SendCommand)            ||
+        (NULL == component->GetParameter)           ||
+        (NULL == component->SetParameter)           ||
+        (NULL == component->GetConfig)              ||
+        (NULL == component->SetConfig)              ||
+        (NULL == component->GetExtensionIndex)      ||
+        (NULL == component->GetState)               ||
+        (NULL == component->ComponentTunnelRequest) ||
+        (NULL == component->UseBuffer)              ||
+        (NULL == component->AllocateBuffer)         ||
+        (NULL == component->FreeBuffer)             ||
+        (NULL == component->EmptyThisBuffer)        ||
+        (NULL == component->FillThisBuffer)         ||
+        (NULL == component->SetCallbacks)           ||
+        (NULL == component->ComponentDeInit)        ||
+        (NULL == component->UseEGLImage)            ||
+        (NULL == component->ComponentRoleEnum))
+        ret = OMX_ErrorInvalidComponent;
+    else
+        ret = OMX_ErrorNone;
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentLoad(EXYNOS_OMX_COMPONENT *exynos_component)
+{
+    OMX_ERRORTYPE      ret = OMX_ErrorNone;
+    OMX_HANDLETYPE     libHandle;
+    OMX_COMPONENTTYPE *pOMXComponent;
+
+    FunctionIn();
+
+    OMX_ERRORTYPE (*Exynos_OMX_ComponentInit)(OMX_HANDLETYPE hComponent, OMX_STRING componentName);
+
+    libHandle = Exynos_OSAL_dlopen((OMX_STRING)exynos_component->libName, RTLD_NOW);
+    if (!libHandle) {
+        ret = OMX_ErrorInvalidComponentName;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponentName, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    Exynos_OMX_ComponentInit = Exynos_OSAL_dlsym(libHandle, "Exynos_OMX_ComponentInit");
+    if (!Exynos_OMX_ComponentInit) {
+        Exynos_OSAL_dlclose(libHandle);
+        ret = OMX_ErrorInvalidComponent;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__);
+        goto EXIT;
+    }
+
+    pOMXComponent = (OMX_COMPONENTTYPE *)Exynos_OSAL_Malloc(sizeof(OMX_COMPONENTTYPE));
+    INIT_SET_SIZE_VERSION(pOMXComponent, OMX_COMPONENTTYPE);
+    ret = (*Exynos_OMX_ComponentInit)((OMX_HANDLETYPE)pOMXComponent, (OMX_STRING)exynos_component->componentName);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Free(pOMXComponent);
+        Exynos_OSAL_dlclose(libHandle);
+        ret = OMX_ErrorInvalidComponent;
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__);
+        goto EXIT;
+    } else {
+        if (Exynos_OMX_ComponentAPICheck(pOMXComponent) != OMX_ErrorNone) {
+            if (NULL != pOMXComponent->ComponentDeInit)
+                pOMXComponent->ComponentDeInit(pOMXComponent);
+            Exynos_OSAL_Free(pOMXComponent);
+            Exynos_OSAL_dlclose(libHandle);
+            ret = OMX_ErrorInvalidComponent;
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_ErrorInvalidComponent, Line:%d", __LINE__);
+            goto EXIT;
+        }
+        exynos_component->libHandle = libHandle;
+        exynos_component->pOMXComponent = pOMXComponent;
+        ret = OMX_ErrorNone;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OMX_ComponentUnload(EXYNOS_OMX_COMPONENT *exynos_component)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    OMX_COMPONENTTYPE *pOMXComponent = NULL;
+
+    FunctionIn();
+
+    if (!exynos_component) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    pOMXComponent = exynos_component->pOMXComponent;
+    if (pOMXComponent != NULL) {
+        pOMXComponent->ComponentDeInit(pOMXComponent);
+        Exynos_OSAL_Free(pOMXComponent);
+        exynos_component->pOMXComponent = NULL;
+    }
+
+    if (exynos_component->libHandle != NULL) {
+        Exynos_OSAL_dlclose(exynos_component->libHandle);
+        exynos_component->libHandle = NULL;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
diff --git a/core/Exynos_OMX_Component_Register.h b/core/Exynos_OMX_Component_Register.h
new file mode 100644 (file)
index 0000000..1860978
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ *
+ * 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_Component_Register.h
+ * @brief      Exynos OpenMAX IL Component Register
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *    2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_COMPONENT_REG
+#define EXYNOS_OMX_COMPONENT_REG
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+#include "OMX_Component.h"
+
+
+typedef struct _ExynosRegisterComponentType
+{
+    OMX_U8  componentName[MAX_OMX_COMPONENT_NAME_SIZE];
+    OMX_U8  roles[MAX_OMX_COMPONENT_ROLE_NUM][MAX_OMX_COMPONENT_ROLE_SIZE];
+    OMX_U32 totalRoleNum;
+} ExynosRegisterComponentType;
+
+typedef struct _EXYNOS_OMX_COMPONENT_REGLIST
+{
+    ExynosRegisterComponentType component;
+    OMX_U8  libName[MAX_OMX_COMPONENT_LIBNAME_SIZE];
+} EXYNOS_OMX_COMPONENT_REGLIST;
+
+struct EXYNOS_OMX_COMPONENT;
+typedef struct _EXYNOS_OMX_COMPONENT
+{
+    OMX_U8                        componentName[MAX_OMX_COMPONENT_NAME_SIZE];
+    OMX_U8                        libName[MAX_OMX_COMPONENT_LIBNAME_SIZE];
+    OMX_HANDLETYPE                libHandle;
+    OMX_COMPONENTTYPE            *pOMXComponent;
+    struct _EXYNOS_OMX_COMPONENT *nextOMXComp;
+} EXYNOS_OMX_COMPONENT;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+OMX_ERRORTYPE Exynos_OMX_Component_Register(EXYNOS_OMX_COMPONENT_REGLIST **compList, OMX_U32 *compNum);
+OMX_ERRORTYPE Exynos_OMX_Component_Unregister(EXYNOS_OMX_COMPONENT_REGLIST *componentList);
+OMX_ERRORTYPE Exynos_OMX_ComponentLoad(EXYNOS_OMX_COMPONENT *exynos_component);
+OMX_ERRORTYPE Exynos_OMX_ComponentUnload(EXYNOS_OMX_COMPONENT *exynos_component);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/core/Exynos_OMX_Core.c b/core/Exynos_OMX_Core.c
new file mode 100644 (file)
index 0000000..4e12c13
--- /dev/null
@@ -0,0 +1,364 @@
+/*
+ *
+ * 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_Core.c
+ * @brief      Exynos OpenMAX IL Core
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ *             HyeYeon Chung (hyeon.chung@samsung.com)
+ *             Yunji Kim (yunji.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *    2012.02.20 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "Exynos_OMX_Core.h"
+#include "Exynos_OMX_Component_Register.h"
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_Mutex.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OMX_Resourcemanager.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_OMX_CORE"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+static int gInitialized = 0;
+static OMX_U32 gComponentNum = 0;
+
+static EXYNOS_OMX_COMPONENT_REGLIST *gComponentList = NULL;
+static EXYNOS_OMX_COMPONENT *gLoadComponentList = NULL;
+static OMX_HANDLETYPE ghLoadComponentListMutex = NULL;
+
+
+OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_Init(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    FunctionIn();
+
+    if (gInitialized == 0) {
+        if (Exynos_OMX_Component_Register(&gComponentList, &gComponentNum)) {
+            ret = OMX_ErrorInsufficientResources;
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Exynos_OMX_Init : %s", "OMX_ErrorInsufficientResources");
+            goto EXIT;
+        }
+
+        ret = Exynos_OMX_ResourceManager_Init();
+        if (OMX_ErrorNone != ret) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Exynos_OMX_Init : Exynos_OMX_ResourceManager_Init failed");
+            goto EXIT;
+        }
+
+        ret = Exynos_OSAL_MutexCreate(&ghLoadComponentListMutex);
+        if (OMX_ErrorNone != ret) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Exynos_OMX_Init : Exynos_OSAL_MutexCreate(&ghLoadComponentListMutex) failed");
+            goto EXIT;
+        }
+
+        gInitialized = 1;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Exynos_OMX_Init : %s", "OMX_ErrorNone");
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_Deinit(void)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    FunctionIn();
+
+    Exynos_OSAL_MutexTerminate(ghLoadComponentListMutex);
+    ghLoadComponentListMutex = NULL;
+
+    Exynos_OMX_ResourceManager_Deinit();
+
+    if (OMX_ErrorNone != Exynos_OMX_Component_Unregister(gComponentList)) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+    gComponentList = NULL;
+    gComponentNum = 0;
+    gInitialized = 0;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_ComponentNameEnum(
+    OMX_OUT OMX_STRING cComponentName,
+    OMX_IN  OMX_U32 nNameLength,
+    OMX_IN  OMX_U32 nIndex)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    FunctionIn();
+
+    if (nIndex >= gComponentNum) {
+        ret = OMX_ErrorNoMore;
+        goto EXIT;
+    }
+
+    snprintf(cComponentName, nNameLength, "%s", gComponentList[nIndex].component.componentName);
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_GetHandle(
+    OMX_OUT OMX_HANDLETYPE *pHandle,
+    OMX_IN  OMX_STRING cComponentName,
+    OMX_IN  OMX_PTR pAppData,
+    OMX_IN  OMX_CALLBACKTYPE *pCallBacks)
+{
+    OMX_ERRORTYPE         ret = OMX_ErrorNone;
+    EXYNOS_OMX_COMPONENT *loadComponent;
+    EXYNOS_OMX_COMPONENT *currentComponent;
+    unsigned int i = 0;
+
+    FunctionIn();
+
+    if (gInitialized != 1) {
+        ret = OMX_ErrorNotReady;
+        goto EXIT;
+    }
+
+    if ((pHandle == NULL) || (cComponentName == NULL) || (pCallBacks == NULL)) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ComponentName : %s", cComponentName);
+
+    for (i = 0; i < gComponentNum; i++) {
+        if (Exynos_OSAL_Strcmp(cComponentName, gComponentList[i].component.componentName) == 0) {
+            loadComponent = Exynos_OSAL_Malloc(sizeof(EXYNOS_OMX_COMPONENT));
+            Exynos_OSAL_Memset(loadComponent, 0, sizeof(EXYNOS_OMX_COMPONENT));
+
+            Exynos_OSAL_Strcpy(loadComponent->libName, gComponentList[i].libName);
+            Exynos_OSAL_Strcpy(loadComponent->componentName, gComponentList[i].component.componentName);
+            ret = Exynos_OMX_ComponentLoad(loadComponent);
+            if (ret != OMX_ErrorNone) {
+                Exynos_OSAL_Free(loadComponent);
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+                goto EXIT;
+            }
+
+            ret = loadComponent->pOMXComponent->SetCallbacks(loadComponent->pOMXComponent, pCallBacks, pAppData);
+            if (ret != OMX_ErrorNone) {
+                Exynos_OMX_ComponentUnload(loadComponent);
+                Exynos_OSAL_Free(loadComponent);
+                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "OMX_Error, Line:%d", __LINE__);
+                goto EXIT;
+            }
+
+            Exynos_OSAL_MutexLock(ghLoadComponentListMutex);
+            if (gLoadComponentList == NULL) {
+                gLoadComponentList = loadComponent;
+            } else {
+                currentComponent = gLoadComponentList;
+                while (currentComponent->nextOMXComp != NULL) {
+                    currentComponent = currentComponent->nextOMXComp;
+                }
+                currentComponent->nextOMXComp = loadComponent;
+            }
+            Exynos_OSAL_MutexUnlock(ghLoadComponentListMutex);
+
+            *pHandle = loadComponent->pOMXComponent;
+            ret = OMX_ErrorNone;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Exynos_OMX_GetHandle : %s", "OMX_ErrorNone");
+            goto EXIT;
+        }
+    }
+
+    ret = OMX_ErrorComponentNotFound;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_FreeHandle(OMX_IN OMX_HANDLETYPE hComponent)
+{
+    OMX_ERRORTYPE         ret = OMX_ErrorNone;
+    EXYNOS_OMX_COMPONENT *currentComponent;
+    EXYNOS_OMX_COMPONENT *deleteComponent;
+
+    FunctionIn();
+
+    if (gInitialized != 1) {
+        ret = OMX_ErrorNotReady;
+        goto EXIT;
+    }
+
+    if (!hComponent) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_MutexLock(ghLoadComponentListMutex);
+    currentComponent = gLoadComponentList;
+    if (gLoadComponentList->pOMXComponent == hComponent) {
+        deleteComponent = gLoadComponentList;
+        gLoadComponentList = gLoadComponentList->nextOMXComp;
+    } else {
+        while ((currentComponent != NULL) && (((EXYNOS_OMX_COMPONENT *)(currentComponent->nextOMXComp))->pOMXComponent != hComponent))
+            currentComponent = currentComponent->nextOMXComp;
+
+        if (((EXYNOS_OMX_COMPONENT *)(currentComponent->nextOMXComp))->pOMXComponent == hComponent) {
+            deleteComponent = currentComponent->nextOMXComp;
+            currentComponent->nextOMXComp = deleteComponent->nextOMXComp;
+        } else if (currentComponent == NULL) {
+            ret = OMX_ErrorComponentNotFound;
+            Exynos_OSAL_MutexUnlock(ghLoadComponentListMutex);
+            goto EXIT;
+        }
+    }
+    Exynos_OSAL_MutexUnlock(ghLoadComponentListMutex);
+
+    Exynos_OMX_ComponentUnload(deleteComponent);
+    Exynos_OSAL_Free(deleteComponent);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_SetupTunnel(
+    OMX_IN OMX_HANDLETYPE hOutput,
+    OMX_IN OMX_U32 nPortOutput,
+    OMX_IN OMX_HANDLETYPE hInput,
+    OMX_IN OMX_U32 nPortInput)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNotImplemented;
+
+EXIT:
+    return ret;
+}
+
+OMX_API OMX_ERRORTYPE Exynos_OMX_GetContentPipe(
+    OMX_OUT OMX_HANDLETYPE *hPipe,
+    OMX_IN  OMX_STRING szURI)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNotImplemented;
+
+EXIT:
+    return ret;
+}
+
+OMX_API OMX_ERRORTYPE Exynos_OMX_GetComponentsOfRole (
+    OMX_IN    OMX_STRING role,
+    OMX_INOUT OMX_U32 *pNumComps,
+    OMX_INOUT OMX_U8  **compNames)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    int           max_role_num = 0;
+    OMX_STRING    RoleString[MAX_OMX_COMPONENT_ROLE_SIZE];
+    int i = 0, j = 0;
+
+    FunctionIn();
+
+    if (gInitialized != 1) {
+        ret = OMX_ErrorNotReady;
+        goto EXIT;
+    }
+
+    *pNumComps = 0;
+
+    for (i = 0; i < MAX_OMX_COMPONENT_NUM; i++) {
+        max_role_num = gComponentList[i].component.totalRoleNum;
+
+        for (j = 0; j < max_role_num; j++) {
+            if (Exynos_OSAL_Strcmp(gComponentList[i].component.roles[j], role) == 0) {
+                if (compNames != NULL) {
+                    Exynos_OSAL_Strcpy((OMX_STRING)compNames[*pNumComps], gComponentList[i].component.componentName);
+                }
+                *pNumComps = (*pNumComps + 1);
+            }
+        }
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_API OMX_ERRORTYPE Exynos_OMX_GetRolesOfComponent (
+    OMX_IN    OMX_STRING compName,
+    OMX_INOUT OMX_U32 *pNumRoles,
+    OMX_OUT   OMX_U8 **roles)
+{
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    OMX_BOOL      detectComp = OMX_FALSE;
+    int           compNum = 0, totalRoleNum = 0;
+    int i = 0;
+
+    FunctionIn();
+
+    if (gInitialized != 1) {
+        ret = OMX_ErrorNotReady;
+        goto EXIT;
+    }
+
+    for (i = 0; i < MAX_OMX_COMPONENT_NUM; i++) {
+        if (gComponentList != NULL) {
+            if (Exynos_OSAL_Strcmp(gComponentList[i].component.componentName, compName) == 0) {
+                *pNumRoles = totalRoleNum = gComponentList[i].component.totalRoleNum;
+                compNum = i;
+                detectComp = OMX_TRUE;
+                break;
+            }
+        } else {
+            ret = OMX_ErrorUndefined;
+            goto EXIT;
+        }
+    }
+
+    if (detectComp == OMX_FALSE) {
+        *pNumRoles = 0;
+        ret = OMX_ErrorComponentNotFound;
+        goto EXIT;
+    }
+
+    if (roles != NULL) {
+        for (i = 0; i < totalRoleNum; i++) {
+            Exynos_OSAL_Strcpy(roles[i], gComponentList[compNum].component.roles[i]);
+        }
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/core/Exynos_OMX_Core.h b/core/Exynos_OMX_Core.h
new file mode 100644 (file)
index 0000000..a1632de
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ *
+ * 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_Core.h
+ * @brief      Exynos OpenMAX IL Core
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ *             HyeYeon Chung (hyeon.chung@samsung.com)
+ *             Yunji Kim (yunji.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *    2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_CORE
+#define EXYNOS_OMX_CORE
+
+#include "Exynos_OMX_Def.h"
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_Init(void);
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_Deinit(void);
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_ComponentNameEnum(
+    OMX_OUT   OMX_STRING        cComponentName,
+    OMX_IN    OMX_U32           nNameLength,
+    OMX_IN    OMX_U32           nIndex);
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynnos_OMX_GetHandle(
+    OMX_OUT   OMX_HANDLETYPE   *pHandle,
+    OMX_IN    OMX_STRING        cComponentName,
+    OMX_IN    OMX_PTR           pAppData,
+    OMX_IN    OMX_CALLBACKTYPE *pCallBacks);
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_FreeHandle(
+    OMX_IN    OMX_HANDLETYPE    hComponent);
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE OMX_APIENTRY Exynos_OMX_SetupTunnel(
+    OMX_IN    OMX_HANDLETYPE    hOutput,
+    OMX_IN    OMX_U32           nPortOutput,
+    OMX_IN    OMX_HANDLETYPE    hInput,
+    OMX_IN    OMX_U32           nPortInput);
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE              Exynos_OMX_GetContentPipe(
+    OMX_OUT   OMX_HANDLETYPE   *hPipe,
+    OMX_IN    OMX_STRING        szURI);
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE              Exynos_OMX_GetComponentsOfRole(
+    OMX_IN    OMX_STRING        role,
+    OMX_INOUT OMX_U32          *pNumComps,
+    OMX_INOUT OMX_U8          **compNames);
+EXYNOS_EXPORT_REF OMX_API OMX_ERRORTYPE              Exynos_OMX_GetRolesOfComponent(
+    OMX_IN    OMX_STRING        compName,
+    OMX_INOUT OMX_U32          *pNumRoles,
+    OMX_OUT   OMX_U8          **roles);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/include/exynos/Exynos_OMX_Def.h b/include/exynos/Exynos_OMX_Def.h
new file mode 100644 (file)
index 0000000..94461ef
--- /dev/null
@@ -0,0 +1,169 @@
+/*
+ *
+ * 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_Def.h
+ * @brief   Exynos_OMX specific define
+ * @author  SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_DEF
+#define EXYNOS_OMX_DEF
+
+#include "OMX_Types.h"
+#include "OMX_IVCommon.h"
+
+#define VERSIONMAJOR_NUMBER                1
+#define VERSIONMINOR_NUMBER                0
+#define REVISION_NUMBER                    0
+#define STEP_NUMBER                        0
+
+
+#define MAX_OMX_COMPONENT_NUM              20
+#define MAX_OMX_COMPONENT_ROLE_NUM         10
+#define MAX_OMX_COMPONENT_NAME_SIZE        OMX_MAX_STRINGNAME_SIZE
+#define MAX_OMX_COMPONENT_ROLE_SIZE        OMX_MAX_STRINGNAME_SIZE
+#define MAX_OMX_COMPONENT_LIBNAME_SIZE     OMX_MAX_STRINGNAME_SIZE * 2
+#define MAX_OMX_MIMETYPE_SIZE              OMX_MAX_STRINGNAME_SIZE
+
+#define MAX_TIMESTAMP        40
+#define MAX_FLAGS            40
+
+#define MAX_BUFFER_PLANE     3
+
+#define EXYNOS_OMX_INSTALL_PATH "/system/lib/omx/"
+
+typedef enum _EXYNOS_CODEC_TYPE
+{
+    SW_CODEC,
+    HW_VIDEO_DEC_CODEC,
+    HW_VIDEO_ENC_CODEC,
+    HW_AUDIO_DEC_CODEC,
+    HW_AUDIO_ENC_CODEC
+} EXYNOS_CODEC_TYPE;
+
+typedef struct _EXYNOS_OMX_PRIORITYMGMTTYPE
+{
+    OMX_U32 nGroupPriority; /* the value 0 represents the highest priority */
+                            /* for a group of components                   */
+    OMX_U32 nGroupID;
+} EXYNOS_OMX_PRIORITYMGMTTYPE;
+
+typedef enum _EXYNOS_OMX_INDEXTYPE
+{
+#define EXYNOS_INDEX_PARAM_ENABLE_THUMBNAIL "OMX.SEC.index.ThumbnailMode"
+    OMX_IndexVendorThumbnailMode            = 0x7F000001,
+#define EXYNOS_INDEX_CONFIG_VIDEO_INTRAPERIOD "OMX.SEC.index.VideoIntraPeriod"
+    OMX_IndexConfigVideoIntraPeriod         = 0x7F000002,
+
+    /* for Android Native Window */
+#define EXYNOS_INDEX_PARAM_ENABLE_ANB "OMX.google.android.index.enableAndroidNativeBuffers"
+    OMX_IndexParamEnableAndroidBuffers      = 0x7F000011,
+#define EXYNOS_INDEX_PARAM_GET_ANB "OMX.google.android.index.getAndroidNativeBufferUsage"
+    OMX_IndexParamGetAndroidNativeBuffer    = 0x7F000012,
+#define EXYNOS_INDEX_PARAM_USE_ANB "OMX.google.android.index.useAndroidNativeBuffer"
+    OMX_IndexParamUseAndroidNativeBuffer    = 0x7F000013,
+    /* for Android Store Metadata Inbuffer */
+#define EXYNOS_INDEX_PARAM_STORE_METADATA_BUFFER "OMX.google.android.index.storeMetaDataInBuffers"
+    OMX_IndexParamStoreMetaDataBuffer       = 0x7F000014,
+
+    /* for Android PV OpenCore*/
+    OMX_COMPONENT_CAPABILITY_TYPE_INDEX     = 0xFF7A347
+} EXYNOS_OMX_INDEXTYPE;
+
+typedef enum _EXYNOS_OMX_ERRORTYPE
+{
+    OMX_ErrorNoEOF              = (OMX_S32) 0x90000001,
+    OMX_ErrorInputDataDecodeYet = (OMX_S32) 0x90000002,
+    OMX_ErrorInputDataEncodeYet = (OMX_S32) 0x90000003,
+    OMX_ErrorCodecInit          = (OMX_S32) 0x90000004,
+    OMX_ErrorCodecDecode        = (OMX_S32) 0x90000005,
+    OMX_ErrorCodecEncode        = (OMX_S32) 0x90000006,
+    OMX_ErrorCodecFlush         = (OMX_S32) 0x90000007,
+    OMX_ErrorOutputBufferUseYet = (OMX_S32) 0x90000008
+} EXYNOS_OMX_ERRORTYPE;
+
+typedef enum _EXYNOS_OMX_COMMANDTYPE
+{
+    EXYNOS_OMX_CommandComponentDeInit = 0x7F000001,
+    EXYNOS_OMX_CommandEmptyBuffer,
+    EXYNOS_OMX_CommandFillBuffer,
+    EXYNOS_OMX_CommandFakeBuffer
+} EXYNOS_OMX_COMMANDTYPE;
+
+typedef enum _EXYNOS_OMX_TRANS_STATETYPE {
+    EXYNOS_OMX_TransStateInvalid,
+    EXYNOS_OMX_TransStateLoadedToIdle,
+    EXYNOS_OMX_TransStateIdleToExecuting,
+    EXYNOS_OMX_TransStateExecutingToIdle,
+    EXYNOS_OMX_TransStateIdleToLoaded,
+    EXYNOS_OMX_TransStateMax = 0X7FFFFFFF
+} EXYNOS_OMX_TRANS_STATETYPE;
+
+typedef enum _EXYNOS_OMX_COLOR_FORMATTYPE {
+    OMX_SEC_COLOR_FormatNV12TPhysicalAddress        = 0x7F000001, /**< Reserved region for introducing Vendor Extensions */
+    OMX_SEC_COLOR_FormatNV12LPhysicalAddress        = 0x7F000002,
+    OMX_SEC_COLOR_FormatNV12LVirtualAddress         = 0x7F000003,
+    OMX_SEC_COLOR_FormatNV12Tiled                   = 0x7FC00002,  /* 0x7FC00002 */
+    OMX_SEC_COLOR_FormatNV21LPhysicalAddress        = 0x7F000010,
+    OMX_SEC_COLOR_FormatNV21Linear                  = 0x7F000011,
+
+    /* to copy a encoded data for drm component using gsc or fimc */
+    OMX_SEC_COLOR_FormatEncodedData                 = OMX_COLOR_FormatYCbYCr,
+    /* for Android SurfaceMediaSource*/
+    OMX_COLOR_FormatAndroidOpaque                   = 0x7F000789
+}EXYNOS_OMX_COLOR_FORMATTYPE;
+
+typedef enum _EXYNOS_OMX_SUPPORTFORMAT_TYPE
+{
+    supportFormat_0 = 0x00,
+    supportFormat_1,
+    supportFormat_2,
+    supportFormat_3,
+    supportFormat_4,
+    supportFormat_5,
+    supportFormat_6,
+    supportFormat_7
+} EXYNOS_OMX_SUPPORTFORMAT_TYPE;
+
+typedef enum _EXYNOS_OMX_BUFFERPROCESS_TYPE
+{
+    BUFFER_DEFAULT  = 0x00,
+    BUFFER_COPY     = 0x01,
+    BUFFER_SHARE    = 0x02,
+    BUFFER_METADATA = 0x04,
+    BUFFER_ANBSHARE = 0x08
+} EXYNOS_OMX_BUFFERPROCESS_TYPE;
+
+typedef struct _EXYNOS_OMX_VIDEO_PROFILELEVEL
+{
+    OMX_S32  profile;
+    OMX_S32  level;
+} EXYNOS_OMX_VIDEO_PROFILELEVEL;
+
+#define OMX_VIDEO_CodingVPX     0x09    /**< Google VPX, formerly known as On2 VP8 */
+
+#ifndef __OMX_EXPORTS
+#define __OMX_EXPORTS
+#define EXYNOS_EXPORT_REF __attribute__((visibility("default")))
+#define EXYNOS_IMPORT_REF __attribute__((visibility("default")))
+#endif
+
+#endif
diff --git a/include/exynos/Exynos_OMX_Macros.h b/include/exynos/Exynos_OMX_Macros.h
new file mode 100644 (file)
index 0000000..8c56c95
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ *
+ * 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_Macros.h
+ * @brief   Macros
+ * @author  SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OMX_MACROS
+#define EXYNOS_OMX_MACROS
+
+#include "Exynos_OMX_Def.h"
+#include "Exynos_OSAL_Memory.h"
+
+
+/*
+ * MACROS
+ */
+#define ALIGN(x, a)       (((x) + (a) - 1) & ~((a) - 1))
+#define ALIGN_TO_16B(x)   ((((x) + (1 <<  4) - 1) >>  4) <<  4)
+#define ALIGN_TO_32B(x)   ((((x) + (1 <<  5) - 1) >>  5) <<  5)
+#define ALIGN_TO_128B(x)  ((((x) + (1 <<  7) - 1) >>  7) <<  7)
+#define ALIGN_TO_8KB(x)   ((((x) + (1 << 13) - 1) >> 13) << 13)
+
+#define INIT_SET_SIZE_VERSION(_struct_, _structType_)               \
+    do {                                                            \
+        Exynos_OSAL_Memset((_struct_), 0, sizeof(_structType_));       \
+        (_struct_)->nSize = sizeof(_structType_);                   \
+        (_struct_)->nVersion.s.nVersionMajor = VERSIONMAJOR_NUMBER; \
+        (_struct_)->nVersion.s.nVersionMinor = VERSIONMINOR_NUMBER; \
+        (_struct_)->nVersion.s.nRevision = REVISION_NUMBER;         \
+        (_struct_)->nVersion.s.nStep = STEP_NUMBER;                 \
+    } while (0)
+
+/*
+ * Port Specific
+ */
+#define EXYNOS_TUNNEL_ESTABLISHED 0x0001
+#define EXYNOS_TUNNEL_IS_SUPPLIER 0x0002
+
+#define CHECK_PORT_BEING_FLUSHED(port)                 (port->bIsPortFlushed == OMX_TRUE)
+#define CHECK_PORT_BEING_DISABLED(port)                (port->bIsPortDisabled == OMX_TRUE)
+#define CHECK_PORT_BEING_FLUSHED_OR_DISABLED(port)     ((port->bIsPortFlushed == OMX_TRUE) || (port->bIsPortDisabled == OMX_TRUE))
+#define CHECK_PORT_ENABLED(port)                       (port->portDefinition.bEnabled == OMX_TRUE)
+#define CHECK_PORT_POPULATED(port)                     (port->portDefinition.bPopulated == OMX_TRUE)
+#define CHECK_PORT_TUNNELED(port)                      (port->tunnelFlags & EXYNOS_TUNNEL_ESTABLISHED)
+#define CHECK_PORT_BUFFER_SUPPLIER(port)               (port->tunnelFlags & EXYNOS_TUNNEL_IS_SUPPLIER)
+
+#endif
diff --git a/include/khronos/OMX_Audio.h b/include/khronos/OMX_Audio.h
new file mode 100644 (file)
index 0000000..04f1a99
--- /dev/null
@@ -0,0 +1,1311 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** @file OMX_Audio.h - OpenMax IL version 1.1.2
+ *  The structures needed by Audio components to exchange
+ *  parameters and configuration data with the componenmilts.
+ */
+
+#ifndef OMX_Audio_h
+#define OMX_Audio_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Each OMX header must include all required header files to allow the
+ *  header to compile without errors.  The includes below are required
+ *  for this header file to compile successfully 
+ */
+
+#include <OMX_Core.h>
+
+/** @defgroup midi MIDI
+ * @ingroup audio
+ */
+/** @defgroup effects Audio effects
+ * @ingroup audio
+ */
+
+/** @defgroup audio OpenMAX IL Audio Domain
+ * Structures for OpenMAX IL Audio domain
+ * @{
+ */
+
+/** Enumeration used to define the possible audio codings.  
+ *  If "OMX_AUDIO_CodingUnused" is selected, the coding selection must 
+ *  be done in a vendor specific way.  Since this is for an audio 
+ *  processing element this enum is relevant.  However, for another 
+ *  type of component other enums would be in this area.
+ */
+typedef enum OMX_AUDIO_CODINGTYPE {
+    OMX_AUDIO_CodingUnused = 0,  /**< Placeholder value when coding is N/A  */
+    OMX_AUDIO_CodingAutoDetect,  /**< auto detection of audio format */
+    OMX_AUDIO_CodingPCM,         /**< Any variant of PCM coding */
+    OMX_AUDIO_CodingADPCM,       /**< Any variant of ADPCM encoded data */
+    OMX_AUDIO_CodingAMR,         /**< Any variant of AMR encoded data */
+    OMX_AUDIO_CodingGSMFR,       /**< Any variant of GSM fullrate (i.e. GSM610) */
+    OMX_AUDIO_CodingGSMEFR,      /**< Any variant of GSM Enhanced Fullrate encoded data*/
+    OMX_AUDIO_CodingGSMHR,       /**< Any variant of GSM Halfrate encoded data */
+    OMX_AUDIO_CodingPDCFR,       /**< Any variant of PDC Fullrate encoded data */
+    OMX_AUDIO_CodingPDCEFR,      /**< Any variant of PDC Enhanced Fullrate encoded data */
+    OMX_AUDIO_CodingPDCHR,       /**< Any variant of PDC Halfrate encoded data */
+    OMX_AUDIO_CodingTDMAFR,      /**< Any variant of TDMA Fullrate encoded data (TIA/EIA-136-420) */
+    OMX_AUDIO_CodingTDMAEFR,     /**< Any variant of TDMA Enhanced Fullrate encoded data (TIA/EIA-136-410) */
+    OMX_AUDIO_CodingQCELP8,      /**< Any variant of QCELP 8kbps encoded data */
+    OMX_AUDIO_CodingQCELP13,     /**< Any variant of QCELP 13kbps encoded data */
+    OMX_AUDIO_CodingEVRC,        /**< Any variant of EVRC encoded data */
+    OMX_AUDIO_CodingSMV,         /**< Any variant of SMV encoded data */
+    OMX_AUDIO_CodingG711,        /**< Any variant of G.711 encoded data */
+    OMX_AUDIO_CodingG723,        /**< Any variant of G.723 dot 1 encoded data */
+    OMX_AUDIO_CodingG726,        /**< Any variant of G.726 encoded data */
+    OMX_AUDIO_CodingG729,        /**< Any variant of G.729 encoded data */
+    OMX_AUDIO_CodingAAC,         /**< Any variant of AAC encoded data */
+    OMX_AUDIO_CodingMP3,         /**< Any variant of MP3 encoded data */
+    OMX_AUDIO_CodingSBC,         /**< Any variant of SBC encoded data */
+    OMX_AUDIO_CodingVORBIS,      /**< Any variant of VORBIS encoded data */
+    OMX_AUDIO_CodingWMA,         /**< Any variant of WMA encoded data */
+    OMX_AUDIO_CodingRA,          /**< Any variant of RA encoded data */
+    OMX_AUDIO_CodingMIDI,        /**< Any variant of MIDI encoded data */
+    OMX_AUDIO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_CodingMax = 0x7FFFFFFF
+} OMX_AUDIO_CODINGTYPE;
+
+
+/** The PortDefinition structure is used to define all of the parameters 
+ *  necessary for the compliant component to setup an input or an output audio 
+ *  path.  If additional information is needed to define the parameters of the
+ *  port (such as frequency), additional structures must be sent such as the
+ *  OMX_AUDIO_PARAM_PCMMODETYPE structure to supply the extra parameters for the port.
+ */
+typedef struct OMX_AUDIO_PORTDEFINITIONTYPE {
+    OMX_STRING cMIMEType;            /**< MIME type of data for the port */
+    OMX_NATIVE_DEVICETYPE pNativeRender; /** < platform specific reference
+                                               for an output device, 
+                                               otherwise this field is 0 */
+    OMX_BOOL bFlagErrorConcealment;  /**< Turns on error concealment if it is 
+                                          supported by the OMX component */
+    OMX_AUDIO_CODINGTYPE eEncoding;  /**< Type of data expected for this 
+                                          port (e.g. PCM, AMR, MP3, etc) */
+} OMX_AUDIO_PORTDEFINITIONTYPE;
+
+
+/**  Port format parameter.  This structure is used to enumerate
+  *  the various data input/output format supported by the port.
+  */
+typedef struct OMX_AUDIO_PARAM_PORTFORMATTYPE {
+    OMX_U32 nSize;                  /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;       /**< OMX specification version information */
+    OMX_U32 nPortIndex;             /**< Indicates which port to set */
+    OMX_U32 nIndex;                 /**< Indicates the enumeration index for the format from 0x0 to N-1 */
+    OMX_AUDIO_CODINGTYPE eEncoding; /**< Type of data expected for this port (e.g. PCM, AMR, MP3, etc) */
+} OMX_AUDIO_PARAM_PORTFORMATTYPE;
+
+
+/** PCM mode type  */ 
+typedef enum OMX_AUDIO_PCMMODETYPE { 
+    OMX_AUDIO_PCMModeLinear = 0,  /**< Linear PCM encoded data */ 
+    OMX_AUDIO_PCMModeALaw,        /**< A law PCM encoded data (G.711) */ 
+    OMX_AUDIO_PCMModeMULaw,       /**< Mu law PCM encoded data (G.711)  */ 
+    OMX_AUDIO_PCMModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_PCMModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_PCMModeMax = 0x7FFFFFFF 
+} OMX_AUDIO_PCMMODETYPE; 
+
+
+typedef enum OMX_AUDIO_CHANNELTYPE {
+    OMX_AUDIO_ChannelNone = 0x0,    /**< Unused or empty */
+    OMX_AUDIO_ChannelLF   = 0x1,    /**< Left front */
+    OMX_AUDIO_ChannelRF   = 0x2,    /**< Right front */
+    OMX_AUDIO_ChannelCF   = 0x3,    /**< Center front */
+    OMX_AUDIO_ChannelLS   = 0x4,    /**< Left surround */
+    OMX_AUDIO_ChannelRS   = 0x5,    /**< Right surround */
+    OMX_AUDIO_ChannelLFE  = 0x6,    /**< Low frequency effects */
+    OMX_AUDIO_ChannelCS   = 0x7,    /**< Back surround */
+    OMX_AUDIO_ChannelLR   = 0x8,    /**< Left rear. */
+    OMX_AUDIO_ChannelRR   = 0x9,    /**< Right rear. */
+    OMX_AUDIO_ChannelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_ChannelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_ChannelMax  = 0x7FFFFFFF 
+} OMX_AUDIO_CHANNELTYPE;
+
+#define OMX_AUDIO_MAXCHANNELS 16  /**< maximum number distinct audio channels that a buffer may contain */
+#define OMX_MIN_PCMPAYLOAD_MSEC 5 /**< Minimum audio buffer payload size for uncompressed (PCM) audio */
+
+/** PCM format description */ 
+typedef struct OMX_AUDIO_PARAM_PCMMODETYPE { 
+    OMX_U32 nSize;                    /**< Size of this structure, in Bytes */ 
+    OMX_VERSIONTYPE nVersion;         /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;               /**< port that this structure applies to */ 
+    OMX_U32 nChannels;                /**< Number of channels (e.g. 2 for stereo) */ 
+    OMX_NUMERICALDATATYPE eNumData;   /**< indicates PCM data as signed or unsigned */ 
+    OMX_ENDIANTYPE eEndian;           /**< indicates PCM data as little or big endian */ 
+    OMX_BOOL bInterleaved;            /**< True for normal interleaved data; false for 
+                                           non-interleaved data (e.g. block data) */ 
+    OMX_U32 nBitPerSample;            /**< Bit per sample */ 
+    OMX_U32 nSamplingRate;            /**< Sampling rate of the source data.  Use 0 for 
+                                           variable or unknown sampling rate. */ 
+    OMX_AUDIO_PCMMODETYPE ePCMMode;   /**< PCM mode enumeration */ 
+    OMX_AUDIO_CHANNELTYPE eChannelMapping[OMX_AUDIO_MAXCHANNELS]; /**< Slot i contains channel defined by eChannelMap[i] */
+
+} OMX_AUDIO_PARAM_PCMMODETYPE; 
+
+
+/** Audio channel mode.  This is used by both AAC and MP3, although the names are more appropriate
+ * for the MP3.  For example, JointStereo for MP3 is CouplingChannels for AAC. 
+ */
+typedef enum OMX_AUDIO_CHANNELMODETYPE {
+    OMX_AUDIO_ChannelModeStereo = 0,  /**< 2 channels, the bitrate allocation between those 
+                                          two channels changes accordingly to each channel information */
+    OMX_AUDIO_ChannelModeJointStereo, /**< mode that takes advantage of what is common between 
+                                           2 channels for higher compression gain */
+    OMX_AUDIO_ChannelModeDual,        /**< 2 mono-channels, each channel is encoded with half 
+                                           the bitrate of the overall bitrate */
+    OMX_AUDIO_ChannelModeMono,        /**< Mono channel mode */
+    OMX_AUDIO_ChannelModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_ChannelModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_ChannelModeMax = 0x7FFFFFFF
+} OMX_AUDIO_CHANNELMODETYPE;
+
+
+typedef enum OMX_AUDIO_MP3STREAMFORMATTYPE {
+    OMX_AUDIO_MP3StreamFormatMP1Layer3 = 0, /**< MP3 Audio MPEG 1 Layer 3 Stream format */
+    OMX_AUDIO_MP3StreamFormatMP2Layer3,     /**< MP3 Audio MPEG 2 Layer 3 Stream format */
+    OMX_AUDIO_MP3StreamFormatMP2_5Layer3,   /**< MP3 Audio MPEG2.5 Layer 3 Stream format */
+    OMX_AUDIO_MP3StreamFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_MP3StreamFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_MP3StreamFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_MP3STREAMFORMATTYPE;
+
+/** MP3 params */
+typedef struct OMX_AUDIO_PARAM_MP3TYPE {
+    OMX_U32 nSize;                 /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;      /**< OMX specification version information */
+    OMX_U32 nPortIndex;            /**< port that this structure applies to */
+    OMX_U32 nChannels;             /**< Number of channels */
+    OMX_U32 nBitRate;              /**< Bit rate of the input data.  Use 0 for variable
+                                        rate or unknown bit rates */
+    OMX_U32 nSampleRate;           /**< Sampling rate of the source data.  Use 0 for
+                                        variable or unknown sampling rate. */
+    OMX_U32 nAudioBandWidth;       /**< Audio band width (in Hz) to which an encoder should
+                                        limit the audio signal. Use 0 to let encoder decide */
+    OMX_AUDIO_CHANNELMODETYPE eChannelMode;   /**< Channel mode enumeration */
+    OMX_AUDIO_MP3STREAMFORMATTYPE eFormat;  /**< MP3 stream format */
+} OMX_AUDIO_PARAM_MP3TYPE;
+
+
+typedef enum OMX_AUDIO_AACSTREAMFORMATTYPE {
+    OMX_AUDIO_AACStreamFormatMP2ADTS = 0, /**< AAC Audio Data Transport Stream 2 format */
+    OMX_AUDIO_AACStreamFormatMP4ADTS,     /**< AAC Audio Data Transport Stream 4 format */
+    OMX_AUDIO_AACStreamFormatMP4LOAS,     /**< AAC Low Overhead Audio Stream format */
+    OMX_AUDIO_AACStreamFormatMP4LATM,     /**< AAC Low overhead Audio Transport Multiplex */
+    OMX_AUDIO_AACStreamFormatADIF,        /**< AAC Audio Data Interchange Format */
+    OMX_AUDIO_AACStreamFormatMP4FF,       /**< AAC inside MPEG-4/ISO File Format */
+    OMX_AUDIO_AACStreamFormatRAW,         /**< AAC Raw Format */
+    OMX_AUDIO_AACStreamFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_AACStreamFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_AACStreamFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_AACSTREAMFORMATTYPE;
+
+
+/** AAC mode type.  Note that the term profile is used with the MPEG-2
+ * standard and the term object type and profile is used with MPEG-4 */
+typedef enum OMX_AUDIO_AACPROFILETYPE{
+  OMX_AUDIO_AACObjectNull = 0,      /**< Null, not used */
+  OMX_AUDIO_AACObjectMain = 1,      /**< AAC Main object */
+  OMX_AUDIO_AACObjectLC,            /**< AAC Low Complexity object (AAC profile) */
+  OMX_AUDIO_AACObjectSSR,           /**< AAC Scalable Sample Rate object */
+  OMX_AUDIO_AACObjectLTP,           /**< AAC Long Term Prediction object */
+  OMX_AUDIO_AACObjectHE,            /**< AAC High Efficiency (object type SBR, HE-AAC profile) */
+  OMX_AUDIO_AACObjectScalable,      /**< AAC Scalable object */
+  OMX_AUDIO_AACObjectERLC = 17,     /**< ER AAC Low Complexity object (Error Resilient AAC-LC) */
+  OMX_AUDIO_AACObjectLD = 23,       /**< AAC Low Delay object (Error Resilient) */
+  OMX_AUDIO_AACObjectHE_PS = 29,    /**< AAC High Efficiency with Parametric Stereo coding (HE-AAC v2, object type PS) */
+  OMX_AUDIO_AACObjectKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+  OMX_AUDIO_AACObjectVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+  OMX_AUDIO_AACObjectMax = 0x7FFFFFFF
+} OMX_AUDIO_AACPROFILETYPE;
+
+
+/** AAC tool usage (for nAACtools in OMX_AUDIO_PARAM_AACPROFILETYPE).
+ * Required for encoder configuration and optional as decoder info output.
+ * For MP3, OMX_AUDIO_CHANNELMODETYPE is sufficient. */
+#define OMX_AUDIO_AACToolNone 0x00000000 /**< no AAC tools allowed (encoder config) or active (decoder info output) */
+#define OMX_AUDIO_AACToolMS   0x00000001 /**< MS: Mid/side joint coding tool allowed or active */
+#define OMX_AUDIO_AACToolIS   0x00000002 /**< IS: Intensity stereo tool allowed or active */
+#define OMX_AUDIO_AACToolTNS  0x00000004 /**< TNS: Temporal Noise Shaping tool allowed or active */
+#define OMX_AUDIO_AACToolPNS  0x00000008 /**< PNS: MPEG-4 Perceptual Noise substitution tool allowed or active */
+#define OMX_AUDIO_AACToolLTP  0x00000010 /**< LTP: MPEG-4 Long Term Prediction tool allowed or active */
+#define OMX_AUDIO_AACToolAll  0x7FFFFFFF /**< all AAC tools allowed or active (*/
+
+/** MPEG-4 AAC error resilience (ER) tool usage (for nAACERtools in OMX_AUDIO_PARAM_AACPROFILETYPE).
+ * Required for ER encoder configuration and optional as decoder info output */
+#define OMX_AUDIO_AACERNone  0x00000000  /**< no AAC ER tools allowed/used */
+#define OMX_AUDIO_AACERVCB11 0x00000001  /**< VCB11: Virtual Code Books for AAC section data */
+#define OMX_AUDIO_AACERRVLC  0x00000002  /**< RVLC: Reversible Variable Length Coding */
+#define OMX_AUDIO_AACERHCR   0x00000004  /**< HCR: Huffman Codeword Reordering */
+#define OMX_AUDIO_AACERAll   0x7FFFFFFF  /**< all AAC ER tools allowed/used */
+
+
+/** AAC params */
+typedef struct OMX_AUDIO_PARAM_AACPROFILETYPE {
+    OMX_U32 nSize;                 /**< Size of this structure, in Bytes */
+    OMX_VERSIONTYPE nVersion;      /**< OMX specification version information */
+    OMX_U32 nPortIndex;            /**< Port that this structure applies to */
+    OMX_U32 nChannels;             /**< Number of channels */
+    OMX_U32 nSampleRate;           /**< Sampling rate of the source data.  Use 0 for
+                                        variable or unknown sampling rate. */
+    OMX_U32 nBitRate;              /**< Bit rate of the input data.  Use 0 for variable
+                                        rate or unknown bit rates */
+    OMX_U32 nAudioBandWidth;       /**< Audio band width (in Hz) to which an encoder should
+                                        limit the audio signal. Use 0 to let encoder decide */
+    OMX_U32 nFrameLength;          /**< Frame length (in audio samples per channel) of the codec.
+                                        Can be 1024 or 960 (AAC-LC), 2048 (HE-AAC), 480 or 512 (AAC-LD).
+                                        Use 0 to let encoder decide */
+    OMX_U32 nAACtools;             /**< AAC tool usage */
+    OMX_U32 nAACERtools;           /**< MPEG-4 AAC error resilience tool usage */
+    OMX_AUDIO_AACPROFILETYPE eAACProfile;   /**< AAC profile enumeration */
+    OMX_AUDIO_AACSTREAMFORMATTYPE eAACStreamFormat; /**< AAC stream format enumeration */
+    OMX_AUDIO_CHANNELMODETYPE eChannelMode;   /**< Channel mode enumeration */
+} OMX_AUDIO_PARAM_AACPROFILETYPE;
+
+
+/** VORBIS params */
+typedef struct OMX_AUDIO_PARAM_VORBISTYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */
+    OMX_U32 nChannels;        /**< Number of channels */
+    OMX_U32 nBitRate;         /**< Bit rate of the encoded data data.  Use 0 for variable
+                                   rate or unknown bit rates. Encoding is set to the
+                                   bitrate closest to specified  value (in bps) */
+    OMX_U32 nMinBitRate;      /**< Sets minimum bitrate (in bps). */
+    OMX_U32 nMaxBitRate;      /**< Sets maximum bitrate (in bps). */
+
+    OMX_U32 nSampleRate;      /**< Sampling rate of the source data.  Use 0 for
+                                   variable or unknown sampling rate. */
+    OMX_U32 nAudioBandWidth;  /**< Audio band width (in Hz) to which an encoder should
+                                   limit the audio signal. Use 0 to let encoder decide */
+    OMX_S32 nQuality;            /**< Sets encoding quality to n, between -1 (low) and 10 (high).
+                                   In the default mode of operation, teh quality level is 3.
+                                   Normal quality range is 0 - 10. */
+    OMX_BOOL bManaged;           /**< Set  bitrate  management  mode. This turns off the
+                                   normal VBR encoding, but allows hard or soft bitrate
+                                   constraints to be enforced by the encoder. This mode can
+                                   be slower, and may also be lower quality. It is
+                                   primarily useful for streaming. */
+    OMX_BOOL bDownmix;           /**< Downmix input from stereo to mono (has no effect on 
+                                   non-stereo streams). Useful for lower-bitrate encoding. */     
+} OMX_AUDIO_PARAM_VORBISTYPE;
+
+
+/** WMA Version */
+typedef enum OMX_AUDIO_WMAFORMATTYPE {
+  OMX_AUDIO_WMAFormatUnused = 0, /**< format unused or unknown */
+  OMX_AUDIO_WMAFormat7,          /**< Windows Media Audio format 7 */
+  OMX_AUDIO_WMAFormat8,          /**< Windows Media Audio format 8 */
+  OMX_AUDIO_WMAFormat9,          /**< Windows Media Audio format 9 */
+  OMX_AUDIO_WMAFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+  OMX_AUDIO_WMAFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+  OMX_AUDIO_WMAFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_WMAFORMATTYPE;
+
+
+/** WMA Profile */
+typedef enum OMX_AUDIO_WMAPROFILETYPE {
+  OMX_AUDIO_WMAProfileUnused = 0,  /**< profile unused or unknown */
+  OMX_AUDIO_WMAProfileL1,          /**< Windows Media audio version 9 profile L1 */
+  OMX_AUDIO_WMAProfileL2,          /**< Windows Media audio version 9 profile L2 */
+  OMX_AUDIO_WMAProfileL3,          /**< Windows Media audio version 9 profile L3 */
+  OMX_AUDIO_WMAProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+  OMX_AUDIO_WMAProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+  OMX_AUDIO_WMAProfileMax = 0x7FFFFFFF
+} OMX_AUDIO_WMAPROFILETYPE;
+
+
+/** WMA params */
+typedef struct OMX_AUDIO_PARAM_WMATYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */
+    OMX_U16 nChannels;        /**< Number of channels */
+    OMX_U32 nBitRate;         /**< Bit rate of the input data.  Use 0 for variable
+                                   rate or unknown bit rates */
+    OMX_AUDIO_WMAFORMATTYPE eFormat; /**< Version of WMA stream / data */
+       OMX_AUDIO_WMAPROFILETYPE eProfile;  /**< Profile of WMA stream / data */
+    OMX_U32 nSamplingRate;    /**< Sampling rate of the source data */
+    OMX_U16 nBlockAlign;      /**< is the block alignment, or block size, in bytes of the audio codec */
+    OMX_U16 nEncodeOptions;   /**< WMA Type-specific data */
+    OMX_U32 nSuperBlockAlign; /**< WMA Type-specific data */
+} OMX_AUDIO_PARAM_WMATYPE;
+
+/** 
+ * RealAudio format
+ */
+typedef enum OMX_AUDIO_RAFORMATTYPE {
+    OMX_AUDIO_RAFormatUnused = 0, /**< Format unused or unknown */
+    OMX_AUDIO_RA8,                /**< RealAudio 8 codec */
+    OMX_AUDIO_RA9,                /**< RealAudio 9 codec */
+    OMX_AUDIO_RA10_AAC,           /**< MPEG-4 AAC codec for bitrates of more than 128kbps */
+    OMX_AUDIO_RA10_CODEC,         /**< RealAudio codec for bitrates less than 128 kbps */
+    OMX_AUDIO_RA10_LOSSLESS,      /**< RealAudio Lossless */
+    OMX_AUDIO_RA10_MULTICHANNEL,  /**< RealAudio Multichannel */
+    OMX_AUDIO_RA10_VOICE,         /**< RealAudio Voice for bitrates below 15 kbps */
+    OMX_AUDIO_RAFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_RAFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_RAFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_RAFORMATTYPE;
+
+/** RA (Real Audio) params */ 
+typedef struct OMX_AUDIO_PARAM_RATYPE { 
+    OMX_U32 nSize;              /**< Size of this structure, in Bytes */ 
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;         /**< Port that this structure applies to */ 
+    OMX_U32 nChannels;          /**< Number of channels */ 
+    OMX_U32 nSamplingRate;      /**< is the sampling rate of the source data */ 
+    OMX_U32 nBitsPerFrame;      /**< is the value for bits per frame  */ 
+    OMX_U32 nSamplePerFrame;    /**< is the value for samples per frame */ 
+    OMX_U32 nCouplingQuantBits; /**< is the number of coupling quantization bits in the stream */ 
+    OMX_U32 nCouplingStartRegion;   /**< is the coupling start region in the stream  */ 
+    OMX_U32 nNumRegions;        /**< is the number of regions value */ 
+    OMX_AUDIO_RAFORMATTYPE eFormat; /**< is the RealAudio audio format */
+} OMX_AUDIO_PARAM_RATYPE; 
+
+
+/** SBC Allocation Method Type */
+typedef enum OMX_AUDIO_SBCALLOCMETHODTYPE {
+  OMX_AUDIO_SBCAllocMethodLoudness, /**< Loudness allocation method */
+  OMX_AUDIO_SBCAllocMethodSNR,      /**< SNR allocation method */
+  OMX_AUDIO_SBCAllocMethodKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+  OMX_AUDIO_SBCAllocMethodVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+  OMX_AUDIO_SBCAllocMethodMax = 0x7FFFFFFF
+} OMX_AUDIO_SBCALLOCMETHODTYPE;
+
+
+/** SBC params */
+typedef struct OMX_AUDIO_PARAM_SBCTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_U32 nChannels;         /**< Number of channels */
+    OMX_U32 nBitRate;          /**< Bit rate of the input data.  Use 0 for variable
+                                    rate or unknown bit rates */
+    OMX_U32 nSampleRate;       /**< Sampling rate of the source data.  Use 0 for
+                                    variable or unknown sampling rate. */
+    OMX_U32 nBlocks;           /**< Number of blocks */
+    OMX_U32 nSubbands;         /**< Number of subbands */
+    OMX_U32 nBitPool;          /**< Bitpool value */
+    OMX_BOOL bEnableBitrate;   /**< Use bitrate value instead of bitpool */
+    OMX_AUDIO_CHANNELMODETYPE eChannelMode; /**< Channel mode enumeration */
+    OMX_AUDIO_SBCALLOCMETHODTYPE eSBCAllocType;   /**< SBC Allocation method type */
+} OMX_AUDIO_PARAM_SBCTYPE;
+
+
+/** ADPCM stream format parameters */ 
+typedef struct OMX_AUDIO_PARAM_ADPCMTYPE { 
+    OMX_U32 nSize;              /**< size of the structure in bytes */ 
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;         /**< port that this structure applies to */ 
+    OMX_U32 nChannels;          /**< Number of channels in the data stream (not 
+                                     necessarily the same as the number of channels 
+                                     to be rendered. */ 
+    OMX_U32 nBitsPerSample;     /**< Number of bits in each sample */ 
+    OMX_U32 nSampleRate;        /**< Sampling rate of the source data.  Use 0 for 
+                                    variable or unknown sampling rate. */ 
+} OMX_AUDIO_PARAM_ADPCMTYPE; 
+
+
+/** G723 rate */
+typedef enum OMX_AUDIO_G723RATE {
+    OMX_AUDIO_G723ModeUnused = 0,  /**< AMRNB Mode unused / unknown */
+    OMX_AUDIO_G723ModeLow,         /**< 5300 bps */
+    OMX_AUDIO_G723ModeHigh,        /**< 6300 bps */
+    OMX_AUDIO_G723ModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_G723ModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_G723ModeMax = 0x7FFFFFFF
+} OMX_AUDIO_G723RATE;
+
+
+/** G723 - Sample rate must be 8 KHz */
+typedef struct OMX_AUDIO_PARAM_G723TYPE { 
+    OMX_U32 nSize;                /**< size of the structure in bytes */ 
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */ 
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not 
+                                       necessarily the same as the number of channels 
+                                       to be rendered. */ 
+    OMX_BOOL bDTX;                /**< Enable Discontinuous Transmisssion */ 
+    OMX_AUDIO_G723RATE eBitRate;  /**< todo: Should this be moved to a config? */
+    OMX_BOOL bHiPassFilter;       /**< Enable High Pass Filter */ 
+    OMX_BOOL bPostFilter;         /**< Enable Post Filter */ 
+} OMX_AUDIO_PARAM_G723TYPE; 
+
+
+/** ITU G726 (ADPCM) rate */
+typedef enum OMX_AUDIO_G726MODE {
+    OMX_AUDIO_G726ModeUnused = 0,  /**< G726 Mode unused / unknown */
+    OMX_AUDIO_G726Mode16,          /**< 16 kbps */
+    OMX_AUDIO_G726Mode24,          /**< 24 kbps */
+    OMX_AUDIO_G726Mode32,          /**< 32 kbps, most common rate, also G721 */
+    OMX_AUDIO_G726Mode40,          /**< 40 kbps */
+    OMX_AUDIO_G726ModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_G726ModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_G726ModeMax = 0x7FFFFFFF
+} OMX_AUDIO_G726MODE;
+
+
+/** G.726 stream format parameters - must be at 8KHz */ 
+typedef struct OMX_AUDIO_PARAM_G726TYPE { 
+    OMX_U32 nSize;              /**< size of the structure in bytes */ 
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;         /**< port that this structure applies to */ 
+    OMX_U32 nChannels;          /**< Number of channels in the data stream (not 
+                                     necessarily the same as the number of channels 
+                                     to be rendered. */ 
+     OMX_AUDIO_G726MODE eG726Mode;
+} OMX_AUDIO_PARAM_G726TYPE; 
+
+
+/** G729 coder type */
+typedef enum OMX_AUDIO_G729TYPE {
+    OMX_AUDIO_G729 = 0,           /**< ITU G.729  encoded data */
+    OMX_AUDIO_G729A,              /**< ITU G.729 annex A  encoded data */
+    OMX_AUDIO_G729B,              /**< ITU G.729 with annex B encoded data */
+    OMX_AUDIO_G729AB,             /**< ITU G.729 annexes A and B encoded data */
+    OMX_AUDIO_G729KhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_G729VendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_G729Max = 0x7FFFFFFF
+} OMX_AUDIO_G729TYPE;
+
+
+/** G729 stream format parameters - fixed 6KHz sample rate */
+typedef struct OMX_AUDIO_PARAM_G729TYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */
+    OMX_U32 nChannels;        /**< Number of channels in the data stream (not
+                                   necessarily the same as the number of channels
+                                   to be rendered. */
+    OMX_BOOL bDTX;            /**< Enable Discontinuous Transmisssion */
+    OMX_AUDIO_G729TYPE eBitType;
+} OMX_AUDIO_PARAM_G729TYPE;
+
+
+/** AMR Frame format */ 
+typedef enum OMX_AUDIO_AMRFRAMEFORMATTYPE { 
+    OMX_AUDIO_AMRFrameFormatConformance = 0,  /**< Frame Format is AMR Conformance 
+                                                   (Standard) Format */ 
+    OMX_AUDIO_AMRFrameFormatIF1,              /**< Frame Format is AMR Interface 
+                                                   Format 1 */ 
+    OMX_AUDIO_AMRFrameFormatIF2,              /**< Frame Format is AMR Interface 
+                                                   Format 2*/ 
+    OMX_AUDIO_AMRFrameFormatFSF,              /**< Frame Format is AMR File Storage 
+                                                   Format */ 
+    OMX_AUDIO_AMRFrameFormatRTPPayload,       /**< Frame Format is AMR Real-Time 
+                                                   Transport Protocol Payload Format */ 
+    OMX_AUDIO_AMRFrameFormatITU,              /**< Frame Format is ITU Format (added at Motorola request) */ 
+    OMX_AUDIO_AMRFrameFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_AMRFrameFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_AMRFrameFormatMax = 0x7FFFFFFF 
+} OMX_AUDIO_AMRFRAMEFORMATTYPE; 
+
+
+/** AMR band mode */
+typedef enum OMX_AUDIO_AMRBANDMODETYPE {
+    OMX_AUDIO_AMRBandModeUnused = 0,          /**< AMRNB Mode unused / unknown */
+    OMX_AUDIO_AMRBandModeNB0,                 /**< AMRNB Mode 0 =  4750 bps */
+    OMX_AUDIO_AMRBandModeNB1,                 /**< AMRNB Mode 1 =  5150 bps */
+    OMX_AUDIO_AMRBandModeNB2,                 /**< AMRNB Mode 2 =  5900 bps */ 
+    OMX_AUDIO_AMRBandModeNB3,                 /**< AMRNB Mode 3 =  6700 bps */
+    OMX_AUDIO_AMRBandModeNB4,                 /**< AMRNB Mode 4 =  7400 bps */
+    OMX_AUDIO_AMRBandModeNB5,                 /**< AMRNB Mode 5 =  7950 bps */
+    OMX_AUDIO_AMRBandModeNB6,                 /**< AMRNB Mode 6 = 10200 bps */
+    OMX_AUDIO_AMRBandModeNB7,                 /**< AMRNB Mode 7 = 12200 bps */
+    OMX_AUDIO_AMRBandModeWB0,                 /**< AMRWB Mode 0 =  6600 bps */
+    OMX_AUDIO_AMRBandModeWB1,                 /**< AMRWB Mode 1 =  8850 bps */
+    OMX_AUDIO_AMRBandModeWB2,                 /**< AMRWB Mode 2 = 12650 bps */ 
+    OMX_AUDIO_AMRBandModeWB3,                 /**< AMRWB Mode 3 = 14250 bps */ 
+    OMX_AUDIO_AMRBandModeWB4,                 /**< AMRWB Mode 4 = 15850 bps */
+    OMX_AUDIO_AMRBandModeWB5,                 /**< AMRWB Mode 5 = 18250 bps */
+    OMX_AUDIO_AMRBandModeWB6,                 /**< AMRWB Mode 6 = 19850 bps */
+    OMX_AUDIO_AMRBandModeWB7,                 /**< AMRWB Mode 7 = 23050 bps */
+    OMX_AUDIO_AMRBandModeWB8,                 /**< AMRWB Mode 8 = 23850 bps */      
+    OMX_AUDIO_AMRBandModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_AMRBandModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_AMRBandModeMax = 0x7FFFFFFF
+} OMX_AUDIO_AMRBANDMODETYPE;
+     
+
+/** AMR Discontinuous Transmission mode */ 
+typedef enum OMX_AUDIO_AMRDTXMODETYPE { 
+    OMX_AUDIO_AMRDTXModeOff = 0,        /**< AMR Discontinuous Transmission Mode is disabled */ 
+    OMX_AUDIO_AMRDTXModeOnVAD1,         /**< AMR Discontinuous Transmission Mode using 
+                                             Voice Activity Detector 1 (VAD1) is enabled */ 
+    OMX_AUDIO_AMRDTXModeOnVAD2,         /**< AMR Discontinuous Transmission Mode using 
+                                             Voice Activity Detector 2 (VAD2) is enabled */       
+    OMX_AUDIO_AMRDTXModeOnAuto,         /**< The codec will automatically select between 
+                                             Off, VAD1 or VAD2 modes */ 
+
+    OMX_AUDIO_AMRDTXasEFR,             /**< DTX as EFR instead of AMR standard (3GPP 26.101, frame type =8,9,10) */
+
+    OMX_AUDIO_AMRDTXModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_AMRDTXModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_AMRDTXModeMax = 0x7FFFFFFF 
+} OMX_AUDIO_AMRDTXMODETYPE; 
+
+/** AMR params */
+typedef struct OMX_AUDIO_PARAM_AMRTYPE {
+    OMX_U32 nSize;                          /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;               /**< OMX specification version information */
+    OMX_U32 nPortIndex;                     /**< port that this structure applies to */
+    OMX_U32 nChannels;                      /**< Number of channels */
+    OMX_U32 nBitRate;                       /**< Bit rate read only field */
+    OMX_AUDIO_AMRBANDMODETYPE eAMRBandMode; /**< AMR Band Mode enumeration */ 
+    OMX_AUDIO_AMRDTXMODETYPE  eAMRDTXMode;  /**< AMR DTX Mode enumeration */
+    OMX_AUDIO_AMRFRAMEFORMATTYPE eAMRFrameFormat; /**< AMR frame format enumeration */
+} OMX_AUDIO_PARAM_AMRTYPE;
+
+
+/** GSM_FR (ETSI 06.10, 3GPP 46.010) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_GSMFRTYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */
+    OMX_BOOL bDTX;            /**< Enable Discontinuous Transmisssion */
+    OMX_BOOL bHiPassFilter;   /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_GSMFRTYPE;
+
+
+/** GSM-HR (ETSI 06.20, 3GPP 46.020) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_GSMHRTYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */
+    OMX_BOOL bDTX;            /**< Enable Discontinuous Transmisssion */
+    OMX_BOOL bHiPassFilter;   /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_GSMHRTYPE;
+
+
+/** GSM-EFR (ETSI 06.60, 3GPP 46.060) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_GSMEFRTYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */
+    OMX_BOOL bDTX;            /**< Enable Discontinuous Transmisssion */
+    OMX_BOOL bHiPassFilter;   /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_GSMEFRTYPE;
+
+
+/** TDMA FR (TIA/EIA-136-420, VSELP 7.95kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_TDMAFRTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_BOOL bDTX;                /**< Enable Discontinuous Transmisssion */
+    OMX_BOOL bHiPassFilter;       /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_TDMAFRTYPE;
+
+
+/** TDMA EFR (TIA/EIA-136-410, ACELP 7.4kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_TDMAEFRTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_BOOL bDTX;                /**< Enable Discontinuous Transmisssion */
+    OMX_BOOL bHiPassFilter;       /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_TDMAEFRTYPE;
+
+
+/** PDC FR ( RCR-27, VSELP 6.7kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_PDCFRTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_BOOL bDTX;                /**< Enable Discontinuous Transmisssion */
+    OMX_BOOL bHiPassFilter;       /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_PDCFRTYPE;
+
+
+/** PDC EFR ( RCR-27, ACELP 6.7kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_PDCEFRTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_BOOL bDTX;                /**< Enable Discontinuous Transmisssion */
+    OMX_BOOL bHiPassFilter;       /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_PDCEFRTYPE;
+
+/** PDC HR ( RCR-27, PSI-CELP 3.45kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_PDCHRTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_BOOL bDTX;                /**< Enable Discontinuous Transmisssion */
+    OMX_BOOL bHiPassFilter;       /**< Enable High Pass Filter */
+} OMX_AUDIO_PARAM_PDCHRTYPE;
+
+
+/** CDMA Rate types */
+typedef enum OMX_AUDIO_CDMARATETYPE {
+    OMX_AUDIO_CDMARateBlank = 0,          /**< CDMA encoded frame is blank */
+    OMX_AUDIO_CDMARateFull,               /**< CDMA encoded frame in full rate */
+    OMX_AUDIO_CDMARateHalf,               /**< CDMA encoded frame in half rate */
+    OMX_AUDIO_CDMARateQuarter,            /**< CDMA encoded frame in quarter rate */
+    OMX_AUDIO_CDMARateEighth,             /**< CDMA encoded frame in eighth rate (DTX)*/
+    OMX_AUDIO_CDMARateErasure,            /**< CDMA erasure frame */
+    OMX_AUDIO_CDMARateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_CDMARateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_CDMARateMax = 0x7FFFFFFF
+} OMX_AUDIO_CDMARATETYPE;
+
+
+/** QCELP8 (TIA/EIA-96, up to 8kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_QCELP8TYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_U32 nBitRate;             /**< Bit rate of the input data.  Use 0 for variable
+                                       rate or unknown bit rates */
+    OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */
+    OMX_U32 nMinBitRate;          /**< minmal rate for the encoder = 1,2,3,4, default = 1 */
+    OMX_U32 nMaxBitRate;          /**< maximal rate for the encoder = 1,2,3,4, default = 4 */
+} OMX_AUDIO_PARAM_QCELP8TYPE;
+
+
+/** QCELP13 ( CDMA, EIA/TIA-733, 13.3kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_QCELP13TYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */
+    OMX_U32 nMinBitRate;          /**< minmal rate for the encoder = 1,2,3,4, default = 1 */
+    OMX_U32 nMaxBitRate;          /**< maximal rate for the encoder = 1,2,3,4, default = 4 */
+} OMX_AUDIO_PARAM_QCELP13TYPE;
+
+
+/** EVRC ( CDMA, EIA/TIA-127, RCELP up to 8.55kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_EVRCTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_AUDIO_CDMARATETYPE eCDMARate; /**< actual Frame rate */
+    OMX_BOOL bRATE_REDUCon;       /**< RATE_REDUCtion is requested for this frame */
+    OMX_U32 nMinBitRate;          /**< minmal rate for the encoder = 1,2,3,4, default = 1 */
+    OMX_U32 nMaxBitRate;          /**< maximal rate for the encoder = 1,2,3,4, default = 4 */
+    OMX_BOOL bHiPassFilter;       /**< Enable encoder's High Pass Filter */
+    OMX_BOOL bNoiseSuppressor;    /**< Enable encoder's noise suppressor pre-processing */
+    OMX_BOOL bPostFilter;         /**< Enable decoder's post Filter */
+} OMX_AUDIO_PARAM_EVRCTYPE;
+
+
+/** SMV ( up to 8.55kbps coder) stream format parameters */
+typedef struct OMX_AUDIO_PARAM_SMVTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_U32 nChannels;            /**< Number of channels in the data stream (not
+                                       necessarily the same as the number of channels
+                                       to be rendered. */
+    OMX_AUDIO_CDMARATETYPE eCDMARate; /**< Frame rate */
+    OMX_BOOL bRATE_REDUCon;           /**< RATE_REDUCtion is requested for this frame */
+    OMX_U32 nMinBitRate;          /**< minmal rate for the encoder = 1,2,3,4, default = 1 ??*/
+    OMX_U32 nMaxBitRate;          /**< maximal rate for the encoder = 1,2,3,4, default = 4 ??*/
+    OMX_BOOL bHiPassFilter;       /**< Enable encoder's High Pass Filter ??*/
+    OMX_BOOL bNoiseSuppressor;    /**< Enable encoder's noise suppressor pre-processing */
+    OMX_BOOL bPostFilter;         /**< Enable decoder's post Filter ??*/
+} OMX_AUDIO_PARAM_SMVTYPE;
+
+
+/** MIDI Format 
+ * @ingroup midi
+ */
+typedef enum OMX_AUDIO_MIDIFORMATTYPE
+{
+    OMX_AUDIO_MIDIFormatUnknown = 0, /**< MIDI Format unknown or don't care */
+    OMX_AUDIO_MIDIFormatSMF0,        /**< Standard MIDI File Type 0 */
+    OMX_AUDIO_MIDIFormatSMF1,        /**< Standard MIDI File Type 1 */
+    OMX_AUDIO_MIDIFormatSMF2,        /**< Standard MIDI File Type 2 */
+    OMX_AUDIO_MIDIFormatSPMIDI,      /**< SP-MIDI */
+    OMX_AUDIO_MIDIFormatXMF0,        /**< eXtensible Music Format type 0 */
+    OMX_AUDIO_MIDIFormatXMF1,        /**< eXtensible Music Format type 1 */
+    OMX_AUDIO_MIDIFormatMobileXMF,   /**< Mobile XMF (eXtensible Music Format type 2) */
+    OMX_AUDIO_MIDIFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_MIDIFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_MIDIFormatMax = 0x7FFFFFFF
+} OMX_AUDIO_MIDIFORMATTYPE;
+
+
+/** MIDI params 
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_PARAM_MIDITYPE {
+    OMX_U32 nSize;                 /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;      /**< OMX specification version information */
+    OMX_U32 nPortIndex;            /**< port that this structure applies to */
+    OMX_U32 nFileSize;             /**< size of the MIDI file in bytes, where the entire 
+                                        MIDI file passed in, otherwise if 0x0, the MIDI data 
+                                        is merged and streamed (instead of passed as an 
+                                        entire MIDI file) */
+    OMX_BU32 sMaxPolyphony;        /**< Specifies the maximum simultaneous polyphonic 
+                                        voices. A value of zero indicates that the default 
+                                        polyphony of the device is used  */                                    
+    OMX_BOOL bLoadDefaultSound;    /**< Whether to load default sound 
+                                        bank at initialization */
+    OMX_AUDIO_MIDIFORMATTYPE eMidiFormat; /**< Version of the MIDI file */                                                                           
+} OMX_AUDIO_PARAM_MIDITYPE;
+
+
+/** Type of the MIDI sound bank 
+ * @ingroup midi
+ */
+typedef enum OMX_AUDIO_MIDISOUNDBANKTYPE {
+    OMX_AUDIO_MIDISoundBankUnused = 0,           /**< unused/unknown soundbank type */
+    OMX_AUDIO_MIDISoundBankDLS1,                 /**< DLS version 1 */
+    OMX_AUDIO_MIDISoundBankDLS2,                 /**< DLS version 2 */
+    OMX_AUDIO_MIDISoundBankMobileDLSBase,        /**< Mobile DLS, using the base functionality */
+    OMX_AUDIO_MIDISoundBankMobileDLSPlusOptions, /**< Mobile DLS, using the specification-defined optional feature set */
+    OMX_AUDIO_MIDISoundBankKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_MIDISoundBankVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_MIDISoundBankMax = 0x7FFFFFFF
+} OMX_AUDIO_MIDISOUNDBANKTYPE;
+
+
+/** Bank Layout describes how bank MSB & LSB are used in the DLS instrument definitions sound bank 
+ * @ingroup midi
+ */
+typedef enum OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE {
+   OMX_AUDIO_MIDISoundBankLayoutUnused = 0,   /**< unused/unknown soundbank type */
+   OMX_AUDIO_MIDISoundBankLayoutGM,           /**< GS layout (based on bank MSB 0x00) */
+   OMX_AUDIO_MIDISoundBankLayoutGM2,          /**< General MIDI 2 layout (using MSB 0x78/0x79, LSB 0x00) */
+   OMX_AUDIO_MIDISoundBankLayoutUser,         /**< Does not conform to any bank numbering standards */
+   OMX_AUDIO_MIDISoundBankLayoutKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+   OMX_AUDIO_MIDISoundBankLayoutVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+   OMX_AUDIO_MIDISoundBankLayoutMax = 0x7FFFFFFF
+} OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE;
+
+
+/** MIDI params to load/unload user soundbank 
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */
+    OMX_U32 nDLSIndex;        /**< DLS file index to be loaded */
+    OMX_U32 nDLSSize;         /**< Size in bytes */
+    OMX_PTR pDLSData;         /**< Pointer to DLS file data */
+    OMX_AUDIO_MIDISOUNDBANKTYPE eMidiSoundBank;   /**< Midi sound bank type enumeration */
+    OMX_AUDIO_MIDISOUNDBANKLAYOUTTYPE eMidiSoundBankLayout; /**< Midi sound bank layout enumeration */
+} OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE;
+
+
+/** Structure for Live MIDI events and MIP messages. 
+ * (MIP = Maximum Instantaneous Polyphony; part of the SP-MIDI standard.) 
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex;       /**< Port that this structure applies to */
+    OMX_U32 nMidiEventSize;   /**< Size of immediate MIDI events or MIP message in bytes  */
+    OMX_U8 nMidiEvents[1];    /**< MIDI event array to be rendered immediately, or an
+                                   array for the MIP message buffer, where the size is 
+                                   indicated by nMidiEventSize */
+} OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE;
+
+
+/** MIDI sound bank/ program pair in a given channel 
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPortIndex;         /**< Port that this structure applies to */
+    OMX_U32 nChannel;           /**< Valid channel values range from 1 to 16 */
+    OMX_U16 nIDProgram;         /**< Valid program ID range is 1 to 128 */
+    OMX_U16 nIDSoundBank;       /**< Sound bank ID */
+    OMX_U32 nUserSoundBankIndex;/**< User soundbank index, easier to access soundbanks 
+                                     by index if multiple banks are present */
+} OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE;
+
+
+/** MIDI control 
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDICONTROLTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_BS32 sPitchTransposition; /**< Pitch transposition in semitones, stored as Q22.10 
+                                       format based on JAVA MMAPI (JSR-135) requirement */
+    OMX_BU32 sPlayBackRate;       /**< Relative playback rate, stored as Q14.17 fixed-point
+                                       number based on JSR-135 requirement */
+    OMX_BU32 sTempo ;             /**< Tempo in beats per minute (BPM), stored as Q22.10 
+                                       fixed-point number based on JSR-135 requirement */
+    OMX_U32 nMaxPolyphony;        /**< Specifies the maximum simultaneous polyphonic 
+                                       voices. A value of zero indicates that the default 
+                                       polyphony of the device is used  */
+    OMX_U32 nNumRepeat;           /**< Number of times to repeat playback */
+    OMX_U32 nStopTime;            /**< Time in milliseconds to indicate when playback 
+                                       will stop automatically.  Set to zero if not used */
+    OMX_U16 nChannelMuteMask;     /**< 16 bit mask for channel mute status */
+    OMX_U16 nChannelSoloMask;     /**< 16 bit mask for channel solo status */
+    OMX_U32 nTrack0031MuteMask;   /**< 32 bit mask for track mute status. Note: This is for tracks 0-31 */
+    OMX_U32 nTrack3263MuteMask;   /**< 32 bit mask for track mute status. Note: This is for tracks 32-63 */
+    OMX_U32 nTrack0031SoloMask;   /**< 32 bit mask for track solo status. Note: This is for tracks 0-31 */
+    OMX_U32 nTrack3263SoloMask;   /**< 32 bit mask for track solo status. Note: This is for tracks 32-63 */
+
+} OMX_AUDIO_CONFIG_MIDICONTROLTYPE;
+
+
+/** MIDI Playback States 
+ * @ingroup midi
+ */
+typedef enum OMX_AUDIO_MIDIPLAYBACKSTATETYPE {
+  OMX_AUDIO_MIDIPlayBackStateUnknown = 0,      /**< Unknown state or state does not map to 
+                                                                                                       other defined states */
+  OMX_AUDIO_MIDIPlayBackStateClosedEngaged,    /**< No MIDI resource is currently open. 
+                                                    The MIDI engine is currently processing 
+                                                    MIDI events. */
+  OMX_AUDIO_MIDIPlayBackStateParsing,          /**< A MIDI resource is open and is being 
+                                                    primed. The MIDI engine is currently 
+                                                    processing MIDI events. */
+  OMX_AUDIO_MIDIPlayBackStateOpenEngaged,      /**< A MIDI resource is open and primed but 
+                                                    not playing. The MIDI engine is currently
+                                                    processing MIDI events. The transition to
+                                                    this state is only possible from the 
+                                                    OMX_AUDIO_MIDIPlayBackStatePlaying state,
+                                                    when the 'playback head' reaches the end
+                                                    of media data or the playback stops due
+                                                    to stop time set.*/
+  OMX_AUDIO_MIDIPlayBackStatePlaying,          /**< A MIDI resource is open and currently
+                                                    playing. The MIDI engine is currently
+                                                    processing MIDI events.*/
+  OMX_AUDIO_MIDIPlayBackStatePlayingPartially, /**< Best-effort playback due to SP-MIDI/DLS
+                                                    resource constraints */
+  OMX_AUDIO_MIDIPlayBackStatePlayingSilently,  /**< Due to system resource constraints and
+                                                    SP-MIDI content constraints, there is
+                                                    no audible MIDI content during playback
+                                                    currently. The situation may change if
+                                                    resources are freed later.*/
+  OMX_AUDIO_MIDIPlayBackStateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+  OMX_AUDIO_MIDIPlayBackStateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+  OMX_AUDIO_MIDIPlayBackStateMax = 0x7FFFFFFF
+} OMX_AUDIO_MIDIPLAYBACKSTATETYPE;
+
+
+/** MIDI status 
+ * @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDISTATUSTYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPortIndex;         /**< port that this structure applies to */
+    OMX_U16 nNumTracks;         /**< Number of MIDI tracks in the file, read only field. 
+                                     NOTE: May not return a meaningful value until the entire 
+                                     file is parsed and buffered.  */
+    OMX_U32 nDuration;          /**< The length of the currently open MIDI resource 
+                                     in milliseconds. NOTE: May not return a meaningful value 
+                                     until the entire file is parsed and buffered.  */  
+    OMX_U32 nPosition;          /**< Current Position of the MIDI resource being played 
+                                     in milliseconds */
+    OMX_BOOL bVibra;            /**< Does Vibra track exist? NOTE: May not return a meaningful 
+                                     value until the entire file is parsed and buffered. */
+    OMX_U32 nNumMetaEvents;     /**< Total number of MIDI Meta Events in the currently 
+                                     open MIDI resource. NOTE: May not return a meaningful value 
+                                     until the entire file is parsed and buffered.  */
+    OMX_U32 nNumActiveVoices;   /**< Number of active voices in the currently playing 
+                                     MIDI resource. NOTE: May not return a meaningful value until 
+                                     the entire file is parsed and buffered. */
+    OMX_AUDIO_MIDIPLAYBACKSTATETYPE eMIDIPlayBackState;  /**< MIDI playback state enumeration, read only field */
+} OMX_AUDIO_CONFIG_MIDISTATUSTYPE;
+
+
+/** MIDI Meta Event structure one per Meta Event.
+ *  MIDI Meta Events are like audio metadata, except that they are interspersed 
+ *  with the MIDI content throughout the file and are not localized in the header. 
+ *  As such, it is necessary to retrieve information about these Meta Events from 
+ *  the engine, as it encounters these Meta Events within the MIDI content. 
+ *  For example, SMF files can have up to 14 types of MIDI Meta Events (copyright, 
+ *  author, default tempo, etc.) scattered throughout the file. 
+ *  @ingroup midi
+ */
+typedef struct OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE{ 
+    OMX_U32 nSize;            /**< size of the structure in bytes */ 
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */ 
+    OMX_U32 nIndex;           /**< Index of Meta Event */ 
+    OMX_U8 nMetaEventType;    /**< Meta Event Type, 7bits (i.e. 0 - 127) */ 
+    OMX_U32 nMetaEventSize;   /**< size of the Meta Event in bytes */ 
+    OMX_U32 nTrack;           /**< track number for the meta event */
+    OMX_U32 nPosition;        /**< Position of the meta-event in milliseconds */
+} OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE; 
+
+
+/** MIDI Meta Event Data structure - one per Meta Event. 
+ * @ingroup midi
+ */ 
+typedef struct OMX_AUDIO_CONFIG_MIDIMETAEVENTDATATYPE{ 
+    OMX_U32 nSize;            /**< size of the structure in bytes */ 
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;       /**< port that this structure applies to */ 
+    OMX_U32 nIndex;           /**< Index of Meta Event */ 
+    OMX_U32 nMetaEventSize;   /**< size of the Meta Event in bytes */ 
+    OMX_U8 nData[1];          /**< array of one or more bytes of meta data 
+                                   as indicated by the nMetaEventSize field */ 
+} OMX_AUDIO_CONFIG__MIDIMETAEVENTDATATYPE; 
+
+
+/** Audio Volume adjustment for a port */
+typedef struct OMX_AUDIO_CONFIG_VOLUMETYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPortIndex;         /**< Port index indicating which port to 
+                                     set.  Select the input port to set 
+                                     just that port's volume.  Select the 
+                                     output port to adjust the master 
+                                     volume. */
+    OMX_BOOL bLinear;           /**< Is the volume to be set in linear (0.100) 
+                                     or logarithmic scale (mB) */
+    OMX_BS32 sVolume;           /**< Volume linear setting in the 0..100 range, OR
+                                     Volume logarithmic setting for this port.  The values
+                                     for volume are in mB (millibels = 1/100 dB) relative
+                                     to a gain of 1 (e.g. the output is the same as the 
+                                     input level).  Values are in mB from nMax 
+                                     (maximum volume) to nMin mB (typically negative).
+                                     Since the volume is "voltage"
+                                     and not a "power", it takes a setting of
+                                     -600 mB to decrease the volume by 1/2.  If
+                                     a component cannot accurately set the 
+                                     volume to the requested value, it must
+                                     set the volume to the closest value BELOW
+                                     the requested value.  When getting the
+                                     volume setting, the current actual volume
+                                     must be returned. */
+} OMX_AUDIO_CONFIG_VOLUMETYPE;
+
+
+/** Audio Volume adjustment for a channel */
+typedef struct OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPortIndex;         /**< Port index indicating which port to 
+                                     set.  Select the input port to set 
+                                     just that port's volume.  Select the 
+                                     output port to adjust the master 
+                                     volume. */
+    OMX_U32 nChannel;           /**< channel to select from 0 to N-1, 
+                                     using OMX_ALL to apply volume settings
+                                     to all channels */
+    OMX_BOOL bLinear;           /**< Is the volume to be set in linear (0.100) or 
+                                     logarithmic scale (mB) */
+    OMX_BS32 sVolume;           /**< Volume linear setting in the 0..100 range, OR
+                                     Volume logarithmic setting for this port.  
+                                     The values for volume are in mB 
+                                     (millibels = 1/100 dB) relative to a gain
+                                     of 1 (e.g. the output is the same as the 
+                                     input level).  Values are in mB from nMax 
+                                     (maximum volume) to nMin mB (typically negative).  
+                                     Since the volume is "voltage"
+                                     and not a "power", it takes a setting of
+                                     -600 mB to decrease the volume by 1/2.  If
+                                     a component cannot accurately set the 
+                                     volume to the requested value, it must
+                                     set the volume to the closest value BELOW
+                                     the requested value.  When getting the
+                                     volume setting, the current actual volume
+                                     must be returned. */
+    OMX_BOOL bIsMIDI;           /**< TRUE if nChannel refers to a MIDI channel,
+                                     FALSE otherwise */
+} OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE;
+
+
+/** Audio balance setting */
+typedef struct OMX_AUDIO_CONFIG_BALANCETYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPortIndex;         /**< Port index indicating which port to 
+                                     set.  Select the input port to set 
+                                     just that port's balance.  Select the 
+                                     output port to adjust the master 
+                                     balance. */
+    OMX_S32 nBalance;           /**< balance setting for this port 
+                                     (-100 to 100, where -100 indicates
+                                     all left, and no right */
+} OMX_AUDIO_CONFIG_BALANCETYPE;
+
+
+/** Audio Port mute */
+typedef struct OMX_AUDIO_CONFIG_MUTETYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPortIndex;         /**< Port index indicating which port to 
+                                     set.  Select the input port to set 
+                                     just that port's mute.  Select the 
+                                     output port to adjust the master 
+                                     mute. */
+    OMX_BOOL bMute;             /**< Mute setting for this port */
+} OMX_AUDIO_CONFIG_MUTETYPE;
+
+
+/** Audio Channel mute */
+typedef struct OMX_AUDIO_CONFIG_CHANNELMUTETYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPortIndex;         /**< port that this structure applies to */
+    OMX_U32 nChannel;           /**< channel to select from 0 to N-1, 
+                                     using OMX_ALL to apply mute settings
+                                     to all channels */
+    OMX_BOOL bMute;             /**< Mute setting for this channel */
+    OMX_BOOL bIsMIDI;           /**< TRUE if nChannel refers to a MIDI channel,
+                                     FALSE otherwise */ 
+} OMX_AUDIO_CONFIG_CHANNELMUTETYPE;
+
+
+
+/** Enable / Disable for loudness control, which boosts bass and to a 
+ *  smaller extent high end frequencies to compensate for hearing
+ *  ability at the extreme ends of the audio spectrum
+ */ 
+typedef struct OMX_AUDIO_CONFIG_LOUDNESSTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_BOOL bLoudness;        /**< Enable/disable for loudness */
+} OMX_AUDIO_CONFIG_LOUDNESSTYPE;
+
+
+/** Enable / Disable for bass, which controls low frequencies
+ */ 
+typedef struct OMX_AUDIO_CONFIG_BASSTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_BOOL bEnable;          /**< Enable/disable for bass control */
+    OMX_S32 nBass;             /**< bass setting for the port, as a 
+                                    continuous value from -100 to 100  
+                                    (0 means no change in bass level)*/
+} OMX_AUDIO_CONFIG_BASSTYPE;
+
+
+/** Enable / Disable for treble, which controls high frequencies tones
+ */ 
+typedef struct OMX_AUDIO_CONFIG_TREBLETYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_BOOL bEnable;          /**< Enable/disable for treble control */
+    OMX_S32  nTreble;          /**< treble setting for the port, as a
+                                    continuous value from -100 to 100  
+                                    (0 means no change in treble level) */
+} OMX_AUDIO_CONFIG_TREBLETYPE;
+
+
+/** An equalizer is typically used for two reasons: to compensate for an 
+ *  sub-optimal frequency response of a system to make it sound more natural 
+ *  or to create intentionally some unnatural coloring to the sound to create
+ *  an effect.
+ *  @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_EQUALIZERTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_BOOL bEnable;          /**< Enable/disable for equalizer */
+    OMX_BU32 sBandIndex;       /**< Band number to be set.  Upper Limit is 
+                                    N-1, where N is the number of bands, lower limit is 0 */
+    OMX_BU32 sCenterFreq;      /**< Center frequecies in Hz.  This is a
+                                    read only element and is used to determine 
+                                    the lower, center and upper frequency of 
+                                    this band.  */
+    OMX_BS32 sBandLevel;       /**< band level in millibels */
+} OMX_AUDIO_CONFIG_EQUALIZERTYPE;
+
+
+/** Stereo widening mode type 
+ * @ingroup effects
+ */ 
+typedef enum OMX_AUDIO_STEREOWIDENINGTYPE {
+    OMX_AUDIO_StereoWideningHeadphones,    /**< Stereo widening for loudspeakers */
+    OMX_AUDIO_StereoWideningLoudspeakers,  /**< Stereo widening for closely spaced loudspeakers */
+    OMX_AUDIO_StereoWideningKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_AUDIO_StereoWideningVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_AUDIO_StereoWideningMax = 0x7FFFFFFF
+} OMX_AUDIO_STEREOWIDENINGTYPE;
+
+
+/** Control for stereo widening, which is a special 2-channel
+ *  case of the audio virtualizer effect. For example, for 5.1-channel 
+ *  output, it translates to virtual surround sound. 
+ * @ingroup effects
+ */ 
+typedef struct OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_BOOL bEnable;          /**< Enable/disable for stereo widening control */
+    OMX_AUDIO_STEREOWIDENINGTYPE eWideningType; /**< Stereo widening algorithm type */
+    OMX_U32  nStereoWidening;  /**< stereo widening setting for the port,
+                                    as a continuous value from 0 to 100  */
+} OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE;
+
+
+/** The chorus effect (or ``choralizer'') is any signal processor which makes
+ *  one sound source (such as a voice) sound like many such sources singing 
+ *  (or playing) in unison. Since performance in unison is never exact, chorus 
+ *  effects simulate this by making independently modified copies of the input 
+ *  signal. Modifications may include (1) delay, (2) frequency shift, and 
+ *  (3) amplitude modulation.
+ * @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_CHORUSTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_BOOL bEnable;          /**< Enable/disable for chorus */
+    OMX_BU32 sDelay;           /**< average delay in milliseconds */
+    OMX_BU32 sModulationRate;  /**< rate of modulation in millihertz */
+    OMX_U32 nModulationDepth;  /**< depth of modulation as a percentage of 
+                                    delay (i.e. 0 to 100) */
+    OMX_BU32 nFeedback;        /**< Feedback from chorus output to input in percentage */
+} OMX_AUDIO_CONFIG_CHORUSTYPE;
+
+
+/** Reverberation is part of the reflected sound that follows the early 
+ *  reflections. In a typical room, this consists of a dense succession of 
+ *  echoes whose energy decays exponentially. The reverberation effect structure 
+ *  as defined here includes both (early) reflections as well as (late) reverberations. 
+ * @ingroup effects
+ */
+typedef struct OMX_AUDIO_CONFIG_REVERBERATIONTYPE {
+    OMX_U32 nSize;                /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;     /**< OMX specification version information */
+    OMX_U32 nPortIndex;           /**< port that this structure applies to */
+    OMX_BOOL bEnable;             /**< Enable/disable for reverberation control */
+    OMX_BS32 sRoomLevel;          /**< Intensity level for the whole room effect 
+                                       (i.e. both early reflections and late 
+                                       reverberation) in millibels */
+    OMX_BS32 sRoomHighFreqLevel;  /**< Attenuation at high frequencies
+                                       relative to the intensity at low
+                                       frequencies in millibels */
+    OMX_BS32 sReflectionsLevel;   /**< Intensity level of early reflections
+                                       (relative to room value), in millibels */
+    OMX_BU32 sReflectionsDelay;   /**< Delay time of the first reflection relative 
+                                       to the direct path, in milliseconds */
+    OMX_BS32 sReverbLevel;        /**< Intensity level of late reverberation
+                                       relative to room level, in millibels */
+    OMX_BU32 sReverbDelay;        /**< Time delay from the first early reflection 
+                                       to the beginning of the late reverberation 
+                                       section, in milliseconds */
+    OMX_BU32 sDecayTime;          /**< Late reverberation decay time at low
+                                       frequencies, in milliseconds */
+    OMX_BU32 nDecayHighFreqRatio; /**< Ratio of high frequency decay time relative 
+                                       to low frequency decay time in percent  */
+    OMX_U32 nDensity;             /**< Modal density in the late reverberation decay,
+                                       in percent (i.e. 0 - 100) */
+    OMX_U32 nDiffusion;           /**< Echo density in the late reverberation decay,
+                                       in percent (i.e. 0 - 100) */
+    OMX_BU32 sReferenceHighFreq;  /**< Reference high frequency in Hertz. This is 
+                                       the frequency used as the reference for all 
+                                       the high-frequency settings above */
+
+} OMX_AUDIO_CONFIG_REVERBERATIONTYPE;
+
+
+/** Possible settings for the Echo Cancelation structure to use 
+ * @ingroup effects
+ */
+typedef enum OMX_AUDIO_ECHOCANTYPE {
+   OMX_AUDIO_EchoCanOff = 0,    /**< Echo Cancellation is disabled */
+   OMX_AUDIO_EchoCanNormal,     /**< Echo Cancellation normal operation - 
+                                     echo from plastics and face */
+   OMX_AUDIO_EchoCanHFree,      /**< Echo Cancellation optimized for 
+                                     Hands Free operation */
+   OMX_AUDIO_EchoCanCarKit,    /**< Echo Cancellation optimized for 
+                                     Car Kit (longer echo) */
+   OMX_AUDIO_EchoCanKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+   OMX_AUDIO_EchoCanVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+   OMX_AUDIO_EchoCanMax = 0x7FFFFFFF
+} OMX_AUDIO_ECHOCANTYPE;
+
+
+/** Enable / Disable for echo cancelation, which removes undesired echo's
+ *  from the audio
+ * @ingroup effects
+ */ 
+typedef struct OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_AUDIO_ECHOCANTYPE eEchoCancelation; /**< Echo cancelation settings */
+} OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE;
+
+
+/** Enable / Disable for noise reduction, which undesired noise from
+ * the audio
+ * @ingroup effects
+ */ 
+typedef struct OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_U32 nPortIndex;        /**< port that this structure applies to */
+    OMX_BOOL bNoiseReduction;  /**< Enable/disable for noise reduction */
+} OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE;
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
+
diff --git a/include/khronos/OMX_Component.h b/include/khronos/OMX_Component.h
new file mode 100644 (file)
index 0000000..d595640
--- /dev/null
@@ -0,0 +1,579 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** OMX_Component.h - OpenMax IL version 1.1.2
+ *  The OMX_Component header file contains the definitions used to define
+ *  the public interface of a component.  This header file is intended to
+ *  be used by both the application and the component.
+ */
+
+#ifndef OMX_Component_h
+#define OMX_Component_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+
+/* Each OMX header must include all required header files to allow the
+ *  header to compile without errors.  The includes below are required
+ *  for this header file to compile successfully 
+ */
+
+#include <OMX_Audio.h>
+#include <OMX_Video.h>
+#include <OMX_Image.h>
+#include <OMX_Other.h>
+
+/** @ingroup comp */
+typedef enum OMX_PORTDOMAINTYPE { 
+    OMX_PortDomainAudio, 
+    OMX_PortDomainVideo, 
+    OMX_PortDomainImage, 
+    OMX_PortDomainOther,
+    OMX_PortDomainKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_PortDomainVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_PortDomainMax = 0x7ffffff
+} OMX_PORTDOMAINTYPE;
+
+/** @ingroup comp */
+typedef struct OMX_PARAM_PORTDEFINITIONTYPE {
+    OMX_U32 nSize;                 /**< Size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;      /**< OMX specification version information */
+    OMX_U32 nPortIndex;            /**< Port number the structure applies to */
+    OMX_DIRTYPE eDir;              /**< Direction (input or output) of this port */
+    OMX_U32 nBufferCountActual;    /**< The actual number of buffers allocated on this port */
+    OMX_U32 nBufferCountMin;       /**< The minimum number of buffers this port requires */
+    OMX_U32 nBufferSize;           /**< Size, in bytes, for buffers to be used for this channel */
+    OMX_BOOL bEnabled;             /**< Ports default to enabled and are enabled/disabled by
+                                        OMX_CommandPortEnable/OMX_CommandPortDisable.
+                                        When disabled a port is unpopulated. A disabled port
+                                        is not populated with buffers on a transition to IDLE. */
+    OMX_BOOL bPopulated;           /**< Port is populated with all of its buffers as indicated by
+                                        nBufferCountActual. A disabled port is always unpopulated. 
+                                        An enabled port is populated on a transition to OMX_StateIdle
+                                        and unpopulated on a transition to loaded. */
+    OMX_PORTDOMAINTYPE eDomain;    /**< Domain of the port. Determines the contents of metadata below. */
+    union {
+        OMX_AUDIO_PORTDEFINITIONTYPE audio;
+        OMX_VIDEO_PORTDEFINITIONTYPE video;
+        OMX_IMAGE_PORTDEFINITIONTYPE image;
+        OMX_OTHER_PORTDEFINITIONTYPE other;
+    } format;
+    OMX_BOOL bBuffersContiguous;
+    OMX_U32 nBufferAlignment;
+} OMX_PARAM_PORTDEFINITIONTYPE;
+
+/** @ingroup comp */
+typedef struct OMX_PARAM_U32TYPE { 
+    OMX_U32 nSize;                    /**< Size of this structure, in Bytes */ 
+    OMX_VERSIONTYPE nVersion;         /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;               /**< port that this structure applies to */ 
+    OMX_U32 nU32;                     /**< U32 value */
+} OMX_PARAM_U32TYPE;
+
+/** @ingroup rpm */
+typedef enum OMX_SUSPENSIONPOLICYTYPE {
+    OMX_SuspensionDisabled, /**< No suspension; v1.0 behavior */
+    OMX_SuspensionEnabled,  /**< Suspension allowed */   
+    OMX_SuspensionPolicyKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_SuspensionPolicyStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_SuspensionPolicyMax = 0x7fffffff
+} OMX_SUSPENSIONPOLICYTYPE;
+
+/** @ingroup rpm */
+typedef struct OMX_PARAM_SUSPENSIONPOLICYTYPE {
+    OMX_U32 nSize;                  
+    OMX_VERSIONTYPE nVersion;        
+    OMX_SUSPENSIONPOLICYTYPE ePolicy;
+} OMX_PARAM_SUSPENSIONPOLICYTYPE;
+
+/** @ingroup rpm */
+typedef enum OMX_SUSPENSIONTYPE {
+    OMX_NotSuspended, /**< component is not suspended */
+    OMX_Suspended,    /**< component is suspended */
+    OMX_SuspensionKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_SuspensionVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_SuspendMax = 0x7FFFFFFF
+} OMX_SUSPENSIONTYPE;
+
+/** @ingroup rpm */
+typedef struct OMX_PARAM_SUSPENSIONTYPE {
+    OMX_U32 nSize;                  
+    OMX_VERSIONTYPE nVersion;       
+    OMX_SUSPENSIONTYPE eType;             
+} OMX_PARAM_SUSPENSIONTYPE ;
+
+typedef struct OMX_CONFIG_BOOLEANTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_BOOL bEnabled;    
+} OMX_CONFIG_BOOLEANTYPE;
+
+/* Parameter specifying the content uri to use. */
+/** @ingroup cp */
+typedef struct OMX_PARAM_CONTENTURITYPE
+{
+    OMX_U32 nSize;                      /**< size of the structure in bytes, including
+                                             actual URI name */
+    OMX_VERSIONTYPE nVersion;           /**< OMX specification version information */
+    OMX_U8 contentURI[1];               /**< The URI name */
+} OMX_PARAM_CONTENTURITYPE;
+
+/* Parameter specifying the pipe to use. */
+/** @ingroup cp */
+typedef struct OMX_PARAM_CONTENTPIPETYPE
+{
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_HANDLETYPE hPipe;       /**< The pipe handle*/
+} OMX_PARAM_CONTENTPIPETYPE;
+
+/** @ingroup rpm */
+typedef struct OMX_RESOURCECONCEALMENTTYPE {
+    OMX_U32 nSize;             /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+    OMX_BOOL bResourceConcealmentForbidden; /**< disallow the use of resource concealment 
+                                            methods (like degrading algorithm quality to 
+                                            lower resource consumption or functional bypass) 
+                                            on a component as a resolution to resource conflicts. */
+} OMX_RESOURCECONCEALMENTTYPE;
+
+
+/** @ingroup metadata */
+typedef enum OMX_METADATACHARSETTYPE {
+    OMX_MetadataCharsetUnknown = 0,
+    OMX_MetadataCharsetASCII,
+    OMX_MetadataCharsetBinary,
+    OMX_MetadataCharsetCodePage1252,
+    OMX_MetadataCharsetUTF8,
+    OMX_MetadataCharsetJavaConformantUTF8,
+    OMX_MetadataCharsetUTF7,
+    OMX_MetadataCharsetImapUTF7,
+    OMX_MetadataCharsetUTF16LE, 
+    OMX_MetadataCharsetUTF16BE,
+    OMX_MetadataCharsetGB12345,
+    OMX_MetadataCharsetHZGB2312,
+    OMX_MetadataCharsetGB2312,
+    OMX_MetadataCharsetGB18030,
+    OMX_MetadataCharsetGBK,
+    OMX_MetadataCharsetBig5,
+    OMX_MetadataCharsetISO88591,
+    OMX_MetadataCharsetISO88592,
+    OMX_MetadataCharsetISO88593,
+    OMX_MetadataCharsetISO88594,
+    OMX_MetadataCharsetISO88595,
+    OMX_MetadataCharsetISO88596,
+    OMX_MetadataCharsetISO88597,
+    OMX_MetadataCharsetISO88598,
+    OMX_MetadataCharsetISO88599,
+    OMX_MetadataCharsetISO885910,
+    OMX_MetadataCharsetISO885913,
+    OMX_MetadataCharsetISO885914,
+    OMX_MetadataCharsetISO885915,
+    OMX_MetadataCharsetShiftJIS,
+    OMX_MetadataCharsetISO2022JP,
+    OMX_MetadataCharsetISO2022JP1,
+    OMX_MetadataCharsetISOEUCJP,
+    OMX_MetadataCharsetSMS7Bit,
+    OMX_MetadataCharsetKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_MetadataCharsetVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_MetadataCharsetTypeMax= 0x7FFFFFFF
+} OMX_METADATACHARSETTYPE;
+
+/** @ingroup metadata */
+typedef enum OMX_METADATASCOPETYPE
+{
+    OMX_MetadataScopeAllLevels,
+    OMX_MetadataScopeTopLevel,
+    OMX_MetadataScopePortLevel,
+    OMX_MetadataScopeNodeLevel,
+    OMX_MetadataScopeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_MetadataScopeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_MetadataScopeTypeMax = 0x7fffffff
+} OMX_METADATASCOPETYPE;
+
+/** @ingroup metadata */
+typedef enum OMX_METADATASEARCHMODETYPE
+{
+    OMX_MetadataSearchValueSizeByIndex,
+    OMX_MetadataSearchItemByIndex,
+    OMX_MetadataSearchNextItemByKey,
+    OMX_MetadataSearchKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_MetadataSearchVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_MetadataSearchTypeMax = 0x7fffffff
+} OMX_METADATASEARCHMODETYPE;
+/** @ingroup metadata */
+typedef struct OMX_CONFIG_METADATAITEMCOUNTTYPE
+{
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_METADATASCOPETYPE eScopeMode;
+    OMX_U32 nScopeSpecifier;
+    OMX_U32 nMetadataItemCount;
+} OMX_CONFIG_METADATAITEMCOUNTTYPE;
+
+/** @ingroup metadata */
+typedef struct OMX_CONFIG_METADATAITEMTYPE
+{
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_METADATASCOPETYPE eScopeMode;
+    OMX_U32 nScopeSpecifier;
+    OMX_U32 nMetadataItemIndex;  
+    OMX_METADATASEARCHMODETYPE eSearchMode;
+    OMX_METADATACHARSETTYPE eKeyCharset;
+    OMX_U8 nKeySizeUsed;
+    OMX_U8 nKey[128];
+    OMX_METADATACHARSETTYPE eValueCharset;
+    OMX_STRING sLanguageCountry;
+    OMX_U32 nValueMaxSize;
+    OMX_U32 nValueSizeUsed;
+    OMX_U8 nValue[1];
+} OMX_CONFIG_METADATAITEMTYPE;
+
+/* @ingroup metadata */
+typedef struct OMX_CONFIG_CONTAINERNODECOUNTTYPE
+{
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_BOOL bAllKeys;
+    OMX_U32 nParentNodeID;
+    OMX_U32 nNumNodes;
+} OMX_CONFIG_CONTAINERNODECOUNTTYPE;
+
+/** @ingroup metadata */
+typedef struct OMX_CONFIG_CONTAINERNODEIDTYPE
+{
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_BOOL bAllKeys;
+    OMX_U32 nParentNodeID;
+    OMX_U32 nNodeIndex; 
+    OMX_U32 nNodeID; 
+    OMX_STRING cNodeName;
+    OMX_BOOL bIsLeafType;
+} OMX_CONFIG_CONTAINERNODEIDTYPE;
+
+/** @ingroup metadata */
+typedef struct OMX_PARAM_METADATAFILTERTYPE 
+{ 
+    OMX_U32 nSize; 
+    OMX_VERSIONTYPE nVersion; 
+    OMX_BOOL bAllKeys; /* if true then this structure refers to all keys and 
+                         * the three key fields below are ignored */
+    OMX_METADATACHARSETTYPE eKeyCharset;
+    OMX_U32 nKeySizeUsed; 
+    OMX_U8   nKey [128]; 
+    OMX_U32 nLanguageCountrySizeUsed;
+    OMX_U8 nLanguageCountry[128];
+    OMX_BOOL bEnabled; /* if true then key is part of filter (e.g. 
+                         * retained for query later). If false then
+                         * key is not part of filter */
+} OMX_PARAM_METADATAFILTERTYPE; 
+
+/** The OMX_HANDLETYPE structure defines the component handle.  The component 
+ *  handle is used to access all of the component's public methods and also
+ *  contains pointers to the component's private data area.  The component
+ *  handle is initialized by the OMX core (with help from the component)
+ *  during the process of loading the component.  After the component is
+ *  successfully loaded, the application can safely access any of the
+ *  component's public functions (although some may return an error because
+ *  the state is inappropriate for the access).
+ * 
+ *  @ingroup comp
+ */
+typedef struct OMX_COMPONENTTYPE
+{
+    /** The size of this structure, in bytes.  It is the responsibility
+        of the allocator of this structure to fill in this value.  Since
+        this structure is allocated by the GetHandle function, this
+        function will fill in this value. */
+    OMX_U32 nSize;
+
+    /** nVersion is the version of the OMX specification that the structure 
+        is built against.  It is the responsibility of the creator of this 
+        structure to initialize this value and every user of this structure 
+        should verify that it knows how to use the exact version of 
+        this structure found herein. */
+    OMX_VERSIONTYPE nVersion;
+
+    /** pComponentPrivate is a pointer to the component private data area.  
+        This member is allocated and initialized by the component when the 
+        component is first loaded.  The application should not access this 
+        data area. */
+    OMX_PTR pComponentPrivate;
+
+    /** pApplicationPrivate is a pointer that is a parameter to the 
+        OMX_GetHandle method, and contains an application private value 
+        provided by the IL client.  This application private data is 
+        returned to the IL Client by OMX in all callbacks */
+    OMX_PTR pApplicationPrivate;
+
+    /** refer to OMX_GetComponentVersion in OMX_core.h or the OMX IL 
+        specification for details on the GetComponentVersion method.
+     */
+    OMX_ERRORTYPE (*GetComponentVersion)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_OUT OMX_STRING pComponentName,
+            OMX_OUT OMX_VERSIONTYPE* pComponentVersion,
+            OMX_OUT OMX_VERSIONTYPE* pSpecVersion,
+            OMX_OUT OMX_UUIDTYPE* pComponentUUID);
+
+    /** refer to OMX_SendCommand in OMX_core.h or the OMX IL 
+        specification for details on the SendCommand method.
+     */
+    OMX_ERRORTYPE (*SendCommand)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_IN  OMX_COMMANDTYPE Cmd,
+            OMX_IN  OMX_U32 nParam1,
+            OMX_IN  OMX_PTR pCmdData);
+
+    /** refer to OMX_GetParameter in OMX_core.h or the OMX IL 
+        specification for details on the GetParameter method.
+     */
+    OMX_ERRORTYPE (*GetParameter)(
+            OMX_IN  OMX_HANDLETYPE hComponent, 
+            OMX_IN  OMX_INDEXTYPE nParamIndex,  
+            OMX_INOUT OMX_PTR pComponentParameterStructure);
+
+
+    /** refer to OMX_SetParameter in OMX_core.h or the OMX IL 
+        specification for details on the SetParameter method.
+     */
+    OMX_ERRORTYPE (*SetParameter)(
+            OMX_IN  OMX_HANDLETYPE hComponent, 
+            OMX_IN  OMX_INDEXTYPE nIndex,
+            OMX_IN  OMX_PTR pComponentParameterStructure);
+
+
+    /** refer to OMX_GetConfig in OMX_core.h or the OMX IL 
+        specification for details on the GetConfig method.
+     */
+    OMX_ERRORTYPE (*GetConfig)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_IN  OMX_INDEXTYPE nIndex, 
+            OMX_INOUT OMX_PTR pComponentConfigStructure);
+
+
+    /** refer to OMX_SetConfig in OMX_core.h or the OMX IL 
+        specification for details on the SetConfig method.
+     */
+    OMX_ERRORTYPE (*SetConfig)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_IN  OMX_INDEXTYPE nIndex, 
+            OMX_IN  OMX_PTR pComponentConfigStructure);
+
+
+    /** refer to OMX_GetExtensionIndex in OMX_core.h or the OMX IL 
+        specification for details on the GetExtensionIndex method.
+     */
+    OMX_ERRORTYPE (*GetExtensionIndex)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_IN  OMX_STRING cParameterName,
+            OMX_OUT OMX_INDEXTYPE* pIndexType);
+
+
+    /** refer to OMX_GetState in OMX_core.h or the OMX IL 
+        specification for details on the GetState method.
+     */
+    OMX_ERRORTYPE (*GetState)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_OUT OMX_STATETYPE* pState);
+
+    
+    /** The ComponentTunnelRequest method will interact with another OMX
+        component to determine if tunneling is possible and to setup the
+        tunneling.  The return codes for this method can be used to 
+        determine if tunneling is not possible, or if tunneling is not
+        supported.  
+        
+        Base profile components (i.e. non-interop) do not support this
+        method and should return OMX_ErrorNotImplemented 
+
+        The interop profile component MUST support tunneling to another 
+        interop profile component with a compatible port parameters.  
+        A component may also support proprietary communication.
+        
+        If proprietary communication is supported the negotiation of 
+        proprietary communication is done outside of OMX in a vendor 
+        specific way. It is only required that the proper result be 
+        returned and the details of how the setup is done is left 
+        to the component implementation.  
+    
+        When this method is invoked when nPort in an output port, the
+        component will:
+        1.  Populate the pTunnelSetup structure with the output port's 
+            requirements and constraints for the tunnel.
+
+        When this method is invoked when nPort in an input port, the
+        component will:
+        1.  Query the necessary parameters from the output port to 
+            determine if the ports are compatible for tunneling
+        2.  If the ports are compatible, the component should store
+            the tunnel step provided by the output port
+        3.  Determine which port (either input or output) is the buffer
+            supplier, and call OMX_SetParameter on the output port to
+            indicate this selection.
+        
+        The component will return from this call within 5 msec.
+    
+        @param [in] hComp
+            Handle of the component to be accessed.  This is the component
+            handle returned by the call to the OMX_GetHandle method.
+        @param [in] nPort
+            nPort is used to select the port on the component to be used
+            for tunneling.
+        @param [in] hTunneledComp
+            Handle of the component to tunnel with.  This is the component 
+            handle returned by the call to the OMX_GetHandle method.  When
+            this parameter is 0x0 the component should setup the port for
+            communication with the application / IL Client.
+        @param [in] nPortOutput
+            nPortOutput is used indicate the port the component should
+            tunnel with.
+        @param [in] pTunnelSetup
+            Pointer to the tunnel setup structure.  When nPort is an output port
+            the component should populate the fields of this structure.  When
+            When nPort is an input port the component should review the setup
+            provided by the component with the output port.
+        @return OMX_ERRORTYPE
+            If the command successfully executes, the return code will be
+            OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+        @ingroup tun
+    */
+
+    OMX_ERRORTYPE (*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); 
+
+    /** refer to OMX_UseBuffer in OMX_core.h or the OMX IL 
+        specification for details on the UseBuffer method.
+        @ingroup buf
+     */
+    OMX_ERRORTYPE (*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);
+
+    /** refer to OMX_AllocateBuffer in OMX_core.h or the OMX IL 
+        specification for details on the AllocateBuffer method.
+        @ingroup buf
+     */
+    OMX_ERRORTYPE (*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);
+
+    /** refer to OMX_FreeBuffer in OMX_core.h or the OMX IL 
+        specification for details on the FreeBuffer method.
+        @ingroup buf
+     */
+    OMX_ERRORTYPE (*FreeBuffer)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_IN  OMX_U32 nPortIndex,
+            OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
+
+    /** refer to OMX_EmptyThisBuffer in OMX_core.h or the OMX IL 
+        specification for details on the EmptyThisBuffer method.
+        @ingroup buf
+     */
+    OMX_ERRORTYPE (*EmptyThisBuffer)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
+
+    /** refer to OMX_FillThisBuffer in OMX_core.h or the OMX IL 
+        specification for details on the FillThisBuffer method.
+        @ingroup buf
+     */
+    OMX_ERRORTYPE (*FillThisBuffer)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_IN  OMX_BUFFERHEADERTYPE* pBuffer);
+
+    /** The SetCallbacks method is used by the core to specify the callback
+        structure from the application to the component.  This is a blocking
+        call.  The component will return from this call within 5 msec.
+        @param [in] hComponent
+            Handle of the component to be accessed.  This is the component
+            handle returned by the call to the GetHandle function.
+        @param [in] pCallbacks
+            pointer to an OMX_CALLBACKTYPE structure used to provide the 
+            callback information to the component
+        @param [in] pAppData
+            pointer to an application defined value.  It is anticipated that 
+            the application will pass a pointer to a data structure or a "this
+            pointer" in this area to allow the callback (in the application)
+            to determine the context of the call
+        @return OMX_ERRORTYPE
+            If the command successfully executes, the return code will be
+            OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+     */
+    OMX_ERRORTYPE (*SetCallbacks)(
+            OMX_IN  OMX_HANDLETYPE hComponent,
+            OMX_IN  OMX_CALLBACKTYPE* pCallbacks, 
+            OMX_IN  OMX_PTR pAppData);
+
+    /** ComponentDeInit method is used to deinitialize the component
+        providing a means to free any resources allocated at component
+        initialization.  NOTE:  After this call the component handle is
+        not valid for further use.
+        @param [in] hComponent
+            Handle of the component to be accessed.  This is the component
+            handle returned by the call to the GetHandle function.
+        @return OMX_ERRORTYPE
+            If the command successfully executes, the return code will be
+            OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+     */
+    OMX_ERRORTYPE (*ComponentDeInit)(
+            OMX_IN  OMX_HANDLETYPE hComponent);
+
+    /** @ingroup buf */
+    OMX_ERRORTYPE (*UseEGLImage)(
+            OMX_IN OMX_HANDLETYPE hComponent,
+            OMX_INOUT OMX_BUFFERHEADERTYPE** ppBufferHdr,
+            OMX_IN OMX_U32 nPortIndex,
+            OMX_IN OMX_PTR pAppPrivate,
+            OMX_IN void* eglImage);
+
+    OMX_ERRORTYPE (*ComponentRoleEnum)(
+        OMX_IN OMX_HANDLETYPE hComponent,
+               OMX_OUT OMX_U8 *cRole,
+               OMX_IN OMX_U32 nIndex);
+
+} OMX_COMPONENTTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/include/khronos/OMX_ContentPipe.h b/include/khronos/OMX_ContentPipe.h
new file mode 100644 (file)
index 0000000..5f6310c
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** OMX_ContentPipe.h - OpenMax IL version 1.1.2
+ *  The OMX_ContentPipe header file contains the definitions used to define
+ *  the public interface for content piples.  This header file is intended to
+ *  be used by the component.
+ */
+
+#ifndef OMX_CONTENTPIPE_H
+#define OMX_CONTENTPIPE_H
+
+#ifndef KD_EACCES
+/* OpenKODE error codes. CPResult values may be zero (indicating success
+   or one of the following values) */
+#define KD_EACCES (1)
+#define KD_EADDRINUSE (2)
+#define KD_EAGAIN (5)
+#define KD_EBADF (7)
+#define KD_EBUSY (8)
+#define KD_ECONNREFUSED (9)
+#define KD_ECONNRESET (10)
+#define KD_EDEADLK (11)
+#define KD_EDESTADDRREQ (12)
+#define KD_ERANGE (35)
+#define KD_EEXIST (13)
+#define KD_EFBIG (14)
+#define KD_EHOSTUNREACH (15)
+#define KD_EINVAL (17)
+#define KD_EIO (18)
+#define KD_EISCONN (20)
+#define KD_EISDIR (21)
+#define KD_EMFILE (22)
+#define KD_ENAMETOOLONG (23)
+#define KD_ENOENT (24)
+#define KD_ENOMEM (25)
+#define KD_ENOSPC (26)
+#define KD_ENOSYS (27)
+#define KD_ENOTCONN (28)
+#define KD_EPERM (33)
+#define KD_ETIMEDOUT (36)
+#define KD_EILSEQ (19)
+#endif
+
+/** Map types from OMX standard types only here so interface is as generic as possible. */
+typedef OMX_U32    CPresult;
+typedef char *     CPstring;  
+typedef void *     CPhandle;
+typedef OMX_U32    CPuint;
+typedef OMX_S32    CPint;  
+typedef char       CPbyte;  
+typedef OMX_BOOL   CPbool;
+
+/** enumeration of origin types used in the CP_PIPETYPE's Seek function 
+ * @ingroup cp
+ */
+typedef enum CP_ORIGINTYPE {
+    CP_OriginBegin,      
+    CP_OriginCur,      
+    CP_OriginEnd,      
+    CP_OriginKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    CP_OriginVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    CP_OriginMax = 0X7FFFFFFF
+} CP_ORIGINTYPE;
+
+/** enumeration of contact access types used in the CP_PIPETYPE's Open function 
+ * @ingroup cp
+ */
+typedef enum CP_ACCESSTYPE {
+    CP_AccessRead,      
+    CP_AccessWrite,  
+    CP_AccessReadWrite ,  
+    CP_AccessKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    CP_AccessVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    CP_AccessMax = 0X7FFFFFFF
+} CP_ACCESSTYPE;
+
+/** enumeration of results returned by the CP_PIPETYPE's CheckAvailableBytes function 
+ * @ingroup cp
+ */
+typedef enum CP_CHECKBYTESRESULTTYPE
+{
+    CP_CheckBytesOk,                    /**< There are at least the request number 
+                                              of bytes available */
+    CP_CheckBytesNotReady,              /**< The pipe is still retrieving bytes 
+                                              and presently lacks sufficient bytes. 
+                                              Client will be called when they are 
+                                              sufficient bytes are available. */
+    CP_CheckBytesInsufficientBytes  ,     /**< The pipe has retrieved all bytes 
+                                              but those available are less than those 
+                                              requested */
+    CP_CheckBytesAtEndOfStream,         /**< The pipe has reached the end of stream
+                                              and no more bytes are available. */
+    CP_CheckBytesOutOfBuffers,          /**< All read/write buffers are currently in use. */
+    CP_CheckBytesKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    CP_CheckBytesVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    CP_CheckBytesMax = 0X7FFFFFFF
+} CP_CHECKBYTESRESULTTYPE;
+
+/** enumeration of content pipe events sent to the client callback. 
+ * @ingroup cp
+ */
+typedef enum CP_EVENTTYPE{
+    CP_BytesAvailable,             /** bytes requested in a CheckAvailableBytes call are now available*/
+    CP_Overflow,                          /** enumeration of content pipe events sent to the client callback*/
+    CP_PipeDisconnected  ,                 /** enumeration of content pipe events sent to the client callback*/
+    CP_EventKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    CP_EventVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    CP_EventMax = 0X7FFFFFFF
+} CP_EVENTTYPE;
+
+/** content pipe definition 
+ * @ingroup cp
+ */
+typedef struct CP_PIPETYPE
+{
+    /** Open a content stream for reading or writing. */ 
+    CPresult (*Open)( CPhandle* hContent, CPstring szURI, CP_ACCESSTYPE eAccess );
+
+    /** Close a content stream. */ 
+    CPresult (*Close)( CPhandle hContent );
+
+    /** Create a content source and open it for writing. */ 
+    CPresult (*Create)( CPhandle *hContent, CPstring szURI );
+
+    /** Check the that specified number of bytes are available for reading or writing (depending on access type).*/
+    CPresult (*CheckAvailableBytes)( CPhandle hContent, CPuint nBytesRequested, CP_CHECKBYTESRESULTTYPE *eResult );
+
+    /** Seek to certain position in the content relative to the specified origin. */
+    CPresult (*SetPosition)( CPhandle  hContent, CPint nOffset, CP_ORIGINTYPE eOrigin);
+
+    /** Retrieve the current position relative to the start of the content. */
+    CPresult (*GetPosition)( CPhandle hContent, CPuint *pPosition);
+
+    /** Retrieve data of the specified size from the content stream (advance content pointer by size of data).
+       Note: pipe client provides pointer. This function is appropriate for small high frequency reads. */
+    CPresult (*Read)( CPhandle hContent, CPbyte *pData, CPuint nSize); 
+
+    /** Retrieve a buffer allocated by the pipe that contains the requested number of bytes. 
+       Buffer contains the next block of bytes, as specified by nSize, of the content. nSize also
+       returns the size of the block actually read. Content pointer advances the by the returned size. 
+       Note: pipe provides pointer. This function is appropriate for large reads. The client must call 
+       ReleaseReadBuffer when done with buffer. 
+
+       In some cases the requested block may not reside in contiguous memory within the
+       pipe implementation. For instance if the pipe leverages a circular buffer then the requested 
+       block may straddle the boundary of the circular buffer. By default a pipe implementation 
+       performs a copy in this case to provide the block to the pipe client in one contiguous buffer.
+       If, however, the client sets bForbidCopy, then the pipe returns only those bytes preceding the memory 
+       boundary. Here the client may retrieve the data in segments over successive calls. */
+    CPresult (*ReadBuffer)( CPhandle hContent, CPbyte **ppBuffer, CPuint *nSize, CPbool bForbidCopy);
+
+    /** Release a buffer obtained by ReadBuffer back to the pipe. */
+    CPresult (*ReleaseReadBuffer)(CPhandle hContent, CPbyte *pBuffer);
+
+    /** Write data of the specified size to the content (advance content pointer by size of data).
+       Note: pipe client provides pointer. This function is appropriate for small high frequency writes. */
+    CPresult (*Write)( CPhandle hContent, CPbyte *data, CPuint nSize); 
+
+    /** Retrieve a buffer allocated by the pipe used to write data to the content. 
+       Client will fill buffer with output data. Note: pipe provides pointer. This function is appropriate
+       for large writes. The client must call WriteBuffer when done it has filled the buffer with data.*/
+    CPresult (*GetWriteBuffer)( CPhandle hContent, CPbyte **ppBuffer, CPuint nSize);
+
+    /** Deliver a buffer obtained via GetWriteBuffer to the pipe. Pipe will write the 
+       the contents of the buffer to content and advance content pointer by the size of the buffer */
+    CPresult (*WriteBuffer)( CPhandle hContent, CPbyte *pBuffer, CPuint nFilledSize);
+
+    /** Register a per-handle client callback with the content pipe. */
+    CPresult (*RegisterCallback)( CPhandle hContent, CPresult (*ClientCallback)(CP_EVENTTYPE eEvent, CPuint iParam));
+
+} CP_PIPETYPE;
+
+#endif
+
diff --git a/include/khronos/OMX_Core.h b/include/khronos/OMX_Core.h
new file mode 100644 (file)
index 0000000..a076f2f
--- /dev/null
@@ -0,0 +1,1431 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** OMX_Core.h - OpenMax IL version 1.1.2
+ *  The OMX_Core header file contains the definitions used by both the
+ *  application and the component to access common items.
+ */
+
+#ifndef OMX_Core_h
+#define OMX_Core_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Each OMX header shall include all required header files to allow the
+ *  header to compile without errors.  The includes below are required
+ *  for this header file to compile successfully 
+ */
+
+#include <OMX_Index.h>
+
+
+/** The OMX_COMMANDTYPE enumeration is used to specify the action in the
+ *  OMX_SendCommand macro.  
+ *  @ingroup core
+ */
+typedef enum OMX_COMMANDTYPE
+{
+    OMX_CommandStateSet,    /**< Change the component state */
+    OMX_CommandFlush,       /**< Flush the data queue(s) of a component */
+    OMX_CommandPortDisable, /**< Disable a port on a component. */
+    OMX_CommandPortEnable,  /**< Enable a port on a component. */
+    OMX_CommandMarkBuffer,  /**< Mark a component/buffer for observation */
+    OMX_CommandKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_CommandVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_CommandMax = 0X7FFFFFFF
+} OMX_COMMANDTYPE;
+
+
+
+/** The OMX_STATETYPE enumeration is used to indicate or change the component
+ *  state.  This enumeration reflects the current state of the component when
+ *  used with the OMX_GetState macro or becomes the parameter in a state change
+ *  command when used with the OMX_SendCommand macro.
+ *
+ *  The component will be in the Loaded state after the component is initially
+ *  loaded into memory.  In the Loaded state, the component is not allowed to
+ *  allocate or hold resources other than to build it's internal parameter
+ *  and configuration tables.  The application will send one or more
+ *  SetParameters/GetParameters and SetConfig/GetConfig commands to the
+ *  component and the component will record each of these parameter and
+ *  configuration changes for use later.  When the application sends the
+ *  Idle command, the component will acquire the resources needed for the
+ *  specified configuration and will transition to the idle state if the
+ *  allocation is successful.  If the component cannot successfully
+ *  transition to the idle state for any reason, the state of the component
+ *  shall be fully rolled back to the Loaded state (e.g. all allocated 
+ *  resources shall be released).  When the component receives the command
+ *  to go to the Executing state, it shall begin processing buffers by
+ *  sending all input buffers it holds to the application.  While
+ *  the component is in the Idle state, the application may also send the
+ *  Pause command.  If the component receives the pause command while in the
+ *  Idle state, the component shall send all input buffers it holds to the 
+ *  application, but shall not begin processing buffers.  This will allow the
+ *  application to prefill buffers.
+ * 
+ *  @ingroup comp
+ */
+
+typedef enum OMX_STATETYPE
+{
+    OMX_StateInvalid,      /**< component has detected that it's internal data 
+                                structures are corrupted to the point that
+                                it cannot determine it's state properly */
+    OMX_StateLoaded,      /**< component has been loaded but has not completed
+                                initialization.  The OMX_SetParameter macro
+                                and the OMX_GetParameter macro are the only 
+                                valid macros allowed to be sent to the 
+                                component in this state. */
+    OMX_StateIdle,        /**< component initialization has been completed
+                                successfully and the component is ready to
+                                to start. */
+    OMX_StateExecuting,   /**< component has accepted the start command and
+                                is processing data (if data is available) */
+    OMX_StatePause,       /**< component has received pause command */
+    OMX_StateWaitForResources, /**< component is waiting for resources, either after 
+                                preemption or before it gets the resources requested.
+                                See specification for complete details. */
+    OMX_StateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_StateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_StateMax = 0X7FFFFFFF
+} OMX_STATETYPE;
+
+/** The OMX_ERRORTYPE enumeration defines the standard OMX Errors.  These 
+ *  errors should cover most of the common failure cases.  However, 
+ *  vendors are free to add additional error messages of their own as 
+ *  long as they follow these rules:
+ *  1.  Vendor error messages shall be in the range of 0x90000000 to
+ *      0x9000FFFF.
+ *  2.  Vendor error messages shall be defined in a header file provided
+ *      with the component.  No error messages are allowed that are
+ *      not defined.
+ */
+typedef enum OMX_ERRORTYPE
+{
+  OMX_ErrorNone = 0,
+
+  /** There were insufficient resources to perform the requested operation */
+  OMX_ErrorInsufficientResources = (OMX_S32) 0x80001000,
+
+  /** There was an error, but the cause of the error could not be determined */
+  OMX_ErrorUndefined = (OMX_S32) 0x80001001,
+
+  /** The component name string was not valid */
+  OMX_ErrorInvalidComponentName = (OMX_S32) 0x80001002,
+
+  /** No component with the specified name string was found */
+  OMX_ErrorComponentNotFound = (OMX_S32) 0x80001003,
+
+  /** The component specified did not have a "OMX_ComponentInit" or
+      "OMX_ComponentDeInit entry point */
+  OMX_ErrorInvalidComponent = (OMX_S32) 0x80001004,
+
+  /** One or more parameters were not valid */
+  OMX_ErrorBadParameter = (OMX_S32) 0x80001005,
+
+  /** The requested function is not implemented */
+  OMX_ErrorNotImplemented = (OMX_S32) 0x80001006,
+
+  /** The buffer was emptied before the next buffer was ready */
+  OMX_ErrorUnderflow = (OMX_S32) 0x80001007,
+
+  /** The buffer was not available when it was needed */
+  OMX_ErrorOverflow = (OMX_S32) 0x80001008,
+
+  /** The hardware failed to respond as expected */
+  OMX_ErrorHardware = (OMX_S32) 0x80001009,
+
+  /** The component is in the state OMX_StateInvalid */
+  OMX_ErrorInvalidState = (OMX_S32) 0x8000100A,
+
+  /** Stream is found to be corrupt */
+  OMX_ErrorStreamCorrupt = (OMX_S32) 0x8000100B,
+
+  /** Ports being connected are not compatible */
+  OMX_ErrorPortsNotCompatible = (OMX_S32) 0x8000100C,
+
+  /** Resources allocated to an idle component have been
+      lost resulting in the component returning to the loaded state */
+  OMX_ErrorResourcesLost = (OMX_S32) 0x8000100D,
+
+  /** No more indicies can be enumerated */
+  OMX_ErrorNoMore = (OMX_S32) 0x8000100E,
+
+  /** The component detected a version mismatch */
+  OMX_ErrorVersionMismatch = (OMX_S32) 0x8000100F,
+
+  /** The component is not ready to return data at this time */
+  OMX_ErrorNotReady = (OMX_S32) 0x80001010,
+
+  /** There was a timeout that occurred */
+  OMX_ErrorTimeout = (OMX_S32) 0x80001011,
+
+  /** This error occurs when trying to transition into the state you are already in */
+  OMX_ErrorSameState = (OMX_S32) 0x80001012,
+
+  /** Resources allocated to an executing or paused component have been 
+      preempted, causing the component to return to the idle state */
+  OMX_ErrorResourcesPreempted = (OMX_S32) 0x80001013, 
+
+  /** A non-supplier port sends this error to the IL client (via the EventHandler callback) 
+      during the allocation of buffers (on a transition from the LOADED to the IDLE state or
+      on a port restart) when it deems that it has waited an unusually long time for the supplier 
+      to send it an allocated buffer via a UseBuffer call. */
+  OMX_ErrorPortUnresponsiveDuringAllocation = (OMX_S32) 0x80001014,
+
+  /** A non-supplier port sends this error to the IL client (via the EventHandler callback) 
+      during the deallocation of buffers (on a transition from the IDLE to LOADED state or 
+      on a port stop) when it deems that it has waited an unusually long time for the supplier 
+      to request the deallocation of a buffer header via a FreeBuffer call. */
+  OMX_ErrorPortUnresponsiveDuringDeallocation = (OMX_S32) 0x80001015,
+
+  /** A supplier port sends this error to the IL client (via the EventHandler callback) 
+      during the stopping of a port (either on a transition from the IDLE to LOADED 
+      state or a port stop) when it deems that it has waited an unusually long time for 
+      the non-supplier to return a buffer via an EmptyThisBuffer or FillThisBuffer call. */
+  OMX_ErrorPortUnresponsiveDuringStop = (OMX_S32) 0x80001016,
+
+  /** Attempting a state transtion that is not allowed */
+  OMX_ErrorIncorrectStateTransition = (OMX_S32) 0x80001017,
+
+  /* Attempting a command that is not allowed during the present state. */
+  OMX_ErrorIncorrectStateOperation = (OMX_S32) 0x80001018, 
+
+  /** The values encapsulated in the parameter or config structure are not supported. */
+  OMX_ErrorUnsupportedSetting = (OMX_S32) 0x80001019,
+
+  /** The parameter or config indicated by the given index is not supported. */
+  OMX_ErrorUnsupportedIndex = (OMX_S32) 0x8000101A,
+
+  /** The port index supplied is incorrect. */
+  OMX_ErrorBadPortIndex = (OMX_S32) 0x8000101B,
+
+  /** The port has lost one or more of its buffers and it thus unpopulated. */
+  OMX_ErrorPortUnpopulated = (OMX_S32) 0x8000101C,
+
+  /** Component suspended due to temporary loss of resources */
+  OMX_ErrorComponentSuspended = (OMX_S32) 0x8000101D,
+
+  /** Component suspended due to an inability to acquire dynamic resources */
+  OMX_ErrorDynamicResourcesUnavailable = (OMX_S32) 0x8000101E,
+
+  /** When the macroblock error reporting is enabled the component returns new error 
+  for every frame that has errors */
+  OMX_ErrorMbErrorsInFrame = (OMX_S32) 0x8000101F,
+
+  /** A component reports this error when it cannot parse or determine the format of an input stream. */
+  OMX_ErrorFormatNotDetected = (OMX_S32) 0x80001020, 
+
+  /** The content open operation failed. */
+  OMX_ErrorContentPipeOpenFailed = (OMX_S32) 0x80001021,
+
+  /** The content creation operation failed. */
+  OMX_ErrorContentPipeCreationFailed = (OMX_S32) 0x80001022,
+
+  /** Separate table information is being used */
+  OMX_ErrorSeperateTablesUsed = (OMX_S32) 0x80001023,
+
+  /** Tunneling is unsupported by the component*/
+  OMX_ErrorTunnelingUnsupported = (OMX_S32) 0x80001024,
+
+  OMX_ErrorKhronosExtensions = (OMX_S32)0x8F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+  OMX_ErrorVendorStartUnused = (OMX_S32)0x90000000, /**< Reserved region for introducing Vendor Extensions */
+  OMX_ErrorMax = 0x7FFFFFFF
+} OMX_ERRORTYPE;
+
+/** @ingroup core */
+typedef OMX_ERRORTYPE (* OMX_COMPONENTINITTYPE)(OMX_IN  OMX_HANDLETYPE hComponent);
+
+/** @ingroup core */
+typedef struct OMX_COMPONENTREGISTERTYPE
+{
+  const char          * pName;       /* Component name, 128 byte limit (including '\0') applies */
+  OMX_COMPONENTINITTYPE pInitialize; /* Component instance initialization function */
+} OMX_COMPONENTREGISTERTYPE;
+
+/** @ingroup core */
+extern OMX_COMPONENTREGISTERTYPE OMX_ComponentRegistered[];
+
+/** @ingroup rpm */
+typedef struct OMX_PRIORITYMGMTTYPE {
+ OMX_U32 nSize;             /**< size of the structure in bytes */
+ OMX_VERSIONTYPE nVersion;  /**< OMX specification version information */
+ OMX_U32 nGroupPriority;            /**< Priority of the component group */
+ OMX_U32 nGroupID;                  /**< ID of the component group */
+} OMX_PRIORITYMGMTTYPE;
+
+/* Component name and Role names are limited to 128 characters including the terminating '\0'. */
+#define OMX_MAX_STRINGNAME_SIZE 128
+
+/** @ingroup comp */
+typedef struct OMX_PARAM_COMPONENTROLETYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U8 cRole[OMX_MAX_STRINGNAME_SIZE];  /**< name of standard component which defines component role */
+} OMX_PARAM_COMPONENTROLETYPE;
+
+/** End of Stream Buffer Flag: 
+  *
+  * A component sets EOS when it has no more data to emit on a particular 
+  * output port. Thus an output port shall set EOS on the last buffer it 
+  * emits. A component's determination of when an output port should 
+  * cease sending data is implemenation specific.
+  * @ingroup buf
+  */
+
+#define OMX_BUFFERFLAG_EOS 0x00000001 
+
+/** Start Time Buffer Flag: 
+ *
+ * The source of a stream (e.g. a demux component) sets the STARTTIME
+ * flag on the buffer that contains the starting timestamp for the
+ * stream. The starting timestamp corresponds to the first data that
+ * should be displayed at startup or after a seek.
+ * The first timestamp of the stream is not necessarily the start time.
+ * For instance, in the case of a seek to a particular video frame, 
+ * the target frame may be an interframe. Thus the first buffer of 
+ * the stream will be the intra-frame preceding the target frame and
+ * the starttime will occur with the target frame (with any other
+ * required frames required to reconstruct the target intervening).
+ *
+ * The STARTTIME flag is directly associated with the buffer's 
+ * timestamp ' thus its association to buffer data and its 
+ * propagation is identical to the timestamp's.
+ *
+ * When a Sync Component client receives a buffer with the 
+ * STARTTIME flag it shall perform a SetConfig on its sync port 
+ * using OMX_ConfigTimeClientStartTime and passing the buffer's
+ * timestamp.
+ * 
+ * @ingroup buf
+ */
+
+#define OMX_BUFFERFLAG_STARTTIME 0x00000002
+
+
+/** Decode Only Buffer Flag: 
+ *
+ * The source of a stream (e.g. a demux component) sets the DECODEONLY
+ * flag on any buffer that should shall be decoded but should not be
+ * displayed. This flag is used, for instance, when a source seeks to 
+ * a target interframe that requires the decode of frames preceding the 
+ * target to facilitate the target's reconstruction. In this case the 
+ * source would emit the frames preceding the target downstream 
+ * but mark them as decode only.
+ *
+ * The DECODEONLY is associated with buffer data and propagated in a 
+ * manner identical to the buffer timestamp.
+ *
+ * A component that renders data should ignore all buffers with 
+ * the DECODEONLY flag set.
+ * 
+ * @ingroup buf
+ */
+
+#define OMX_BUFFERFLAG_DECODEONLY 0x00000004
+
+
+/* Data Corrupt Flag: This flag is set when the IL client believes the data in the associated buffer is corrupt 
+ * @ingroup buf
+ */
+
+#define OMX_BUFFERFLAG_DATACORRUPT 0x00000008
+
+/* End of Frame: The buffer contains exactly one end of frame and no data
+ *  occurs after the end of frame. This flag is an optional hint. The absence
+ *  of this flag does not imply the absence of an end of frame within the buffer. 
+ * @ingroup buf
+*/
+#define OMX_BUFFERFLAG_ENDOFFRAME 0x00000010
+
+/* Sync Frame Flag: This flag is set when the buffer content contains a coded sync frame ' 
+ *  a frame that has no dependency on any other frame information 
+ *  @ingroup buf
+ */
+#define OMX_BUFFERFLAG_SYNCFRAME 0x00000020
+
+/* Extra data present flag: there is extra data appended to the data stream
+ * residing in the buffer 
+ * @ingroup buf  
+ */
+#define OMX_BUFFERFLAG_EXTRADATA 0x00000040
+
+/** Codec Config Buffer Flag: 
+* OMX_BUFFERFLAG_CODECCONFIG is an optional flag that is set by an
+* output port when all bytes in the buffer form part or all of a set of
+* codec specific configuration data.  Examples include SPS/PPS nal units
+* for OMX_VIDEO_CodingAVC or AudioSpecificConfig data for
+* OMX_AUDIO_CodingAAC.  Any component that for a given stream sets 
+* OMX_BUFFERFLAG_CODECCONFIG shall not mix codec configuration bytes
+* with frame data in the same buffer, and shall send all buffers
+* containing codec configuration bytes before any buffers containing
+* frame data that those configurations bytes describe.
+* If the stream format for a particular codec has a frame specific
+* header at the start of each frame, for example OMX_AUDIO_CodingMP3 or
+* OMX_AUDIO_CodingAAC in ADTS mode, then these shall be presented as
+* normal without setting OMX_BUFFERFLAG_CODECCONFIG.
+ * @ingroup buf
+ */
+#define OMX_BUFFERFLAG_CODECCONFIG 0x00000080
+
+
+
+/** @ingroup buf */
+typedef struct OMX_BUFFERHEADERTYPE
+{
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U8* pBuffer;            /**< Pointer to actual block of memory 
+                                     that is acting as the buffer */
+    OMX_U32 nAllocLen;          /**< size of the buffer allocated, in bytes */
+    OMX_U32 nFilledLen;         /**< number of bytes currently in the 
+                                     buffer */
+    OMX_U32 nOffset;            /**< start offset of valid data in bytes from
+                                     the start of the buffer */
+    OMX_PTR pAppPrivate;        /**< pointer to any data the application
+                                     wants to associate with this buffer */
+    OMX_PTR pPlatformPrivate;   /**< pointer to any data the platform
+                                     wants to associate with this buffer */ 
+    OMX_PTR pInputPortPrivate;  /**< pointer to any data the input port
+                                     wants to associate with this buffer */
+    OMX_PTR pOutputPortPrivate; /**< pointer to any data the output port
+                                     wants to associate with this buffer */
+    OMX_HANDLETYPE hMarkTargetComponent; /**< The component that will generate a 
+                                              mark event upon processing this buffer. */
+    OMX_PTR pMarkData;          /**< Application specific data associated with 
+                                     the mark sent on a mark event to disambiguate 
+                                     this mark from others. */
+    OMX_U32 nTickCount;         /**< Optional entry that the component and
+                                     application can update with a tick count
+                                     when they access the component.  This
+                                     value should be in microseconds.  Since
+                                     this is a value relative to an arbitrary
+                                     starting point, this value cannot be used 
+                                     to determine absolute time.  This is an
+                                     optional entry and not all components
+                                     will update it.*/
+ OMX_TICKS nTimeStamp;          /**< Timestamp corresponding to the sample 
+                                     starting at the first logical sample 
+                                     boundary in the buffer. Timestamps of 
+                                     successive samples within the buffer may
+                                     be inferred by adding the duration of the 
+                                     of the preceding buffer to the timestamp
+                                     of the preceding buffer.*/
+  OMX_U32     nFlags;           /**< buffer specific flags */
+  OMX_U32 nOutputPortIndex;     /**< The index of the output port (if any) using 
+                                     this buffer */
+  OMX_U32 nInputPortIndex;      /**< The index of the input port (if any) using
+                                     this buffer */
+} OMX_BUFFERHEADERTYPE;
+
+/** The OMX_EXTRADATATYPE enumeration is used to define the 
+ * possible extra data payload types.
+ * NB: this enum is binary backwards compatible with the previous
+ * OMX_EXTRADATA_QUANT define.  This should be replaced with
+ * OMX_ExtraDataQuantization.
+ */
+typedef enum OMX_EXTRADATATYPE
+{
+   OMX_ExtraDataNone = 0,                       /**< Indicates that no more extra data sections follow */        
+   OMX_ExtraDataQuantization,                   /**< The data payload contains quantization data */
+   OMX_ExtraDataKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+   OMX_ExtraDataVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+   OMX_ExtraDataMax = 0x7FFFFFFF
+} OMX_EXTRADATATYPE;
+
+
+typedef struct OMX_OTHER_EXTRADATATYPE  {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;               
+    OMX_U32 nPortIndex;
+    OMX_EXTRADATATYPE eType;       /* Extra Data type */
+    OMX_U32 nDataSize;   /* Size of the supporting data to follow */
+    OMX_U8  data[1];     /* Supporting data hint  */
+} OMX_OTHER_EXTRADATATYPE;
+
+/** @ingroup comp */
+typedef struct OMX_PORT_PARAM_TYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPorts;             /**< The number of ports for this component */
+    OMX_U32 nStartPortNumber;   /** first port number for this type of port */
+} OMX_PORT_PARAM_TYPE; 
+
+/** @ingroup comp */
+typedef enum OMX_EVENTTYPE
+{
+    OMX_EventCmdComplete,         /**< component has sucessfully completed a command */
+    OMX_EventError,               /**< component has detected an error condition */
+    OMX_EventMark,                /**< component has detected a buffer mark */
+    OMX_EventPortSettingsChanged, /**< component is reported a port settings change */
+    OMX_EventBufferFlag,          /**< component has detected an EOS */ 
+    OMX_EventResourcesAcquired,   /**< component has been granted resources and is
+                                       automatically starting the state change from
+                                       OMX_StateWaitForResources to OMX_StateIdle. */
+   OMX_EventComponentResumed,     /**< Component resumed due to reacquisition of resources */
+   OMX_EventDynamicResourcesAvailable, /**< Component has acquired previously unavailable dynamic resources */
+   OMX_EventPortFormatDetected,      /**< Component has detected a supported format. */
+   OMX_EventKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+   OMX_EventVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+   OMX_EventMax = 0x7FFFFFFF
+} OMX_EVENTTYPE;
+
+typedef struct OMX_CALLBACKTYPE
+{
+    /** The EventHandler method is used to notify the application when an
+        event of interest occurs.  Events are defined in the OMX_EVENTTYPE
+        enumeration.  Please see that enumeration for details of what will
+        be returned for each type of event. Callbacks should not return
+        an error to the component, so if an error occurs, the application 
+        shall handle it internally.  This is a blocking call.
+
+        The application should return from this call within 5 msec to avoid
+        blocking the component for an excessively long period of time.
+
+        @param hComponent
+            handle of the component to access.  This is the component
+            handle returned by the call to the GetHandle function.
+        @param pAppData
+            pointer to an application defined value that was provided in the 
+            pAppData parameter to the OMX_GetHandle method for the component.
+            This application defined value is provided so that the application 
+            can have a component specific context when receiving the callback.
+        @param eEvent
+            Event that the component wants to notify the application about.
+        @param nData1
+            nData will be the OMX_ERRORTYPE for an error event and will be 
+            an OMX_COMMANDTYPE for a command complete event and OMX_INDEXTYPE for a OMX_PortSettingsChanged event.
+         @param nData2
+            nData2 will hold further information related to the event. Can be OMX_STATETYPE for
+            a OMX_CommandStateSet command or port index for a OMX_PortSettingsChanged event.
+            Default value is 0 if not used. )
+        @param pEventData
+            Pointer to additional event-specific data (see spec for meaning).
+      */
+
+   OMX_ERRORTYPE (*EventHandler)(
+        OMX_IN OMX_HANDLETYPE hComponent,
+        OMX_IN OMX_PTR pAppData,
+        OMX_IN OMX_EVENTTYPE eEvent,
+        OMX_IN OMX_U32 nData1,
+        OMX_IN OMX_U32 nData2,
+        OMX_IN OMX_PTR pEventData);
+
+    /** The EmptyBufferDone method is used to return emptied buffers from an
+        input port back to the application for reuse.  This is a blocking call 
+        so the application should not attempt to refill the buffers during this
+        call, but should queue them and refill them in another thread.  There
+        is no error return, so the application shall handle any errors generated
+        internally.  
+        
+        The application should return from this call within 5 msec.
+        
+        @param hComponent
+            handle of the component to access.  This is the component
+            handle returned by the call to the GetHandle function.
+        @param pAppData
+            pointer to an application defined value that was provided in the 
+            pAppData parameter to the OMX_GetHandle method for the component.
+            This application defined value is provided so that the application 
+            can have a component specific context when receiving the callback.
+        @param pBuffer
+            pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+            or AllocateBuffer indicating the buffer that was emptied.
+        @ingroup buf
+     */
+    OMX_ERRORTYPE (*EmptyBufferDone)(
+        OMX_IN OMX_HANDLETYPE hComponent,
+        OMX_IN OMX_PTR pAppData,
+        OMX_IN OMX_BUFFERHEADERTYPE* pBuffer);
+
+    /** The FillBufferDone method is used to return filled buffers from an
+        output port back to the application for emptying and then reuse.  
+        This is a blocking call so the application should not attempt to 
+        empty the buffers during this call, but should queue the buffers 
+        and empty them in another thread.  There is no error return, so 
+        the application shall handle any errors generated internally.  The 
+        application shall also update the buffer header to indicate the
+        number of bytes placed into the buffer.  
+
+        The application should return from this call within 5 msec.
+        
+        @param hComponent
+            handle of the component to access.  This is the component
+            handle returned by the call to the GetHandle function.
+        @param pAppData
+            pointer to an application defined value that was provided in the 
+            pAppData parameter to the OMX_GetHandle method for the component.
+            This application defined value is provided so that the application 
+            can have a component specific context when receiving the callback.
+        @param pBuffer
+            pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+            or AllocateBuffer indicating the buffer that was filled.
+        @ingroup buf
+     */
+    OMX_ERRORTYPE (*FillBufferDone)(
+        OMX_OUT OMX_HANDLETYPE hComponent,
+        OMX_OUT OMX_PTR pAppData,
+        OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer);
+
+} OMX_CALLBACKTYPE;
+
+/** The OMX_BUFFERSUPPLIERTYPE enumeration is used to dictate port supplier
+    preference when tunneling between two ports.
+    @ingroup tun buf
+*/
+typedef enum OMX_BUFFERSUPPLIERTYPE
+{
+    OMX_BufferSupplyUnspecified = 0x0, /**< port supplying the buffers is unspecified,
+                                              or don't care */
+    OMX_BufferSupplyInput,             /**< input port supplies the buffers */
+    OMX_BufferSupplyOutput,            /**< output port supplies the buffers */
+    OMX_BufferSupplyKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_BufferSupplyVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_BufferSupplyMax = 0x7FFFFFFF
+} OMX_BUFFERSUPPLIERTYPE;
+
+
+/** buffer supplier parameter 
+ * @ingroup tun
+ */
+typedef struct OMX_PARAM_BUFFERSUPPLIERTYPE {
+    OMX_U32 nSize; /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex; /**< port that this structure applies to */
+    OMX_BUFFERSUPPLIERTYPE eBufferSupplier; /**< buffer supplier */
+} OMX_PARAM_BUFFERSUPPLIERTYPE;
+
+
+/**< indicates that buffers received by an input port of a tunnel 
+     may not modify the data in the buffers 
+     @ingroup tun
+ */
+#define OMX_PORTTUNNELFLAG_READONLY 0x00000001 
+
+
+/** The OMX_TUNNELSETUPTYPE structure is used to pass data from an output
+    port to an input port as part the two ComponentTunnelRequest calls
+    resulting from a OMX_SetupTunnel call from the IL Client. 
+    @ingroup tun
+ */   
+typedef struct OMX_TUNNELSETUPTYPE
+{
+    OMX_U32 nTunnelFlags;             /**< bit flags for tunneling */
+    OMX_BUFFERSUPPLIERTYPE eSupplier; /**< supplier preference */
+} OMX_TUNNELSETUPTYPE; 
+
+/* OMX Component headers is included to enable the core to use
+   macros for functions into the component for OMX release 1.0.  
+   Developers should not access any structures or data from within
+   the component header directly */
+/* TO BE REMOVED - #include <OMX_Component.h> */
+
+/** GetComponentVersion will return information about the component.  
+    This is a blocking call.  This macro will go directly from the
+    application to the component (via a core macro).  The
+    component will return from this call within 5 msec.
+    @param [in] hComponent
+        handle of component to execute the command
+    @param [out] pComponentName
+        pointer to an empty string of length 128 bytes.  The component 
+        will write its name into this string.  The name will be 
+        terminated by a single zero byte.  The name of a component will 
+        be 127 bytes or less to leave room for the trailing zero byte.  
+        An example of a valid component name is "OMX.ABC.ChannelMixer\0".
+    @param [out] pComponentVersion
+        pointer to an OMX Version structure that the component will fill 
+        in.  The component will fill in a value that indicates the 
+        component version.  NOTE: the component version is NOT the same 
+        as the OMX Specification version (found in all structures).  The 
+        component version is defined by the vendor of the component and 
+        its value is entirely up to the component vendor.
+    @param [out] pSpecVersion
+        pointer to an OMX Version structure that the component will fill 
+        in.  The SpecVersion is the version of the specification that the 
+        component was built against.  Please note that this value may or 
+        may not match the structure's version.  For example, if the 
+        component was built against the 2.0 specification, but the 
+        application (which creates the structure is built against the 
+        1.0 specification the versions would be different.
+    @param [out] pComponentUUID
+        pointer to the UUID of the component which will be filled in by 
+        the component.  The UUID is a unique identifier that is set at 
+        RUN time for the component and is unique to each instantion of 
+        the component.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp
+ */
+#define OMX_GetComponentVersion(                            \
+        hComponent,                                         \
+        pComponentName,                                     \
+        pComponentVersion,                                  \
+        pSpecVersion,                                       \
+        pComponentUUID)                                     \
+    ((OMX_COMPONENTTYPE*)hComponent)->GetComponentVersion(  \
+        hComponent,                                         \
+        pComponentName,                                     \
+        pComponentVersion,                                  \
+        pSpecVersion,                                       \
+        pComponentUUID)                 /* Macro End */
+
+
+/** Send a command to the component.  This call is a non-blocking call.
+    The component should check the parameters and then queue the command
+    to the component thread to be executed.  The component thread shall 
+    send the EventHandler() callback at the conclusion of the command. 
+    This macro will go directly from the application to the component (via
+    a core macro).  The component will return from this call within 5 msec.
+    
+    When the command is "OMX_CommandStateSet" the component will queue a
+    state transition to the new state idenfied in nParam.
+    
+    When the command is "OMX_CommandFlush", to flush a port's buffer queues,
+    the command will force the component to return all buffers NOT CURRENTLY 
+    BEING PROCESSED to the application, in the order in which the buffers 
+    were received.
+    
+    When the command is "OMX_CommandPortDisable" or 
+    "OMX_CommandPortEnable", the component's port (given by the value of
+    nParam) will be stopped or restarted. 
+    
+    When the command "OMX_CommandMarkBuffer" is used to mark a buffer, the
+    pCmdData will point to a OMX_MARKTYPE structure containing the component
+    handle of the component to examine the buffer chain for the mark.  nParam1
+    contains the index of the port on which the buffer mark is applied.
+
+    Specification text for more details. 
+    
+    @param [in] hComponent
+        handle of component to execute the command
+    @param [in] Cmd
+        Command for the component to execute
+    @param [in] nParam
+        Parameter for the command to be executed.  When Cmd has the value 
+        OMX_CommandStateSet, value is a member of OMX_STATETYPE.  When Cmd has 
+        the value OMX_CommandFlush, value of nParam indicates which port(s) 
+        to flush. -1 is used to flush all ports a single port index will 
+        only flush that port.  When Cmd has the value "OMX_CommandPortDisable"
+        or "OMX_CommandPortEnable", the component's port is given by 
+        the value of nParam.  When Cmd has the value "OMX_CommandMarkBuffer"
+        the components pot is given by the value of nParam.
+    @param [in] pCmdData
+        Parameter pointing to the OMX_MARKTYPE structure when Cmd has the value
+        "OMX_CommandMarkBuffer".     
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp
+ */
+#define OMX_SendCommand(                                    \
+         hComponent,                                        \
+         Cmd,                                               \
+         nParam,                                            \
+         pCmdData)                                          \
+     ((OMX_COMPONENTTYPE*)hComponent)->SendCommand(         \
+         hComponent,                                        \
+         Cmd,                                               \
+         nParam,                                            \
+         pCmdData)                          /* Macro End */
+
+
+/** The OMX_GetParameter macro will get one of the current parameter 
+    settings from the component.  This macro cannot only be invoked when 
+    the component is in the OMX_StateInvalid state.  The nParamIndex
+    parameter is used to indicate which structure is being requested from
+    the component.  The application shall allocate the correct structure 
+    and shall fill in the structure size and version information before 
+    invoking this macro.  When the parameter applies to a port, the
+    caller shall fill in the appropriate nPortIndex value indicating the
+    port on which the parameter applies. If the component has not had 
+    any settings changed, then the component should return a set of 
+    valid DEFAULT  parameters for the component.  This is a blocking 
+    call.  
+    
+    The component should return from this call within 20 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [in] nParamIndex
+        Index of the structure to be filled.  This value is from the
+        OMX_INDEXTYPE enumeration.
+    @param [in,out] pComponentParameterStructure
+        Pointer to application allocated structure to be filled by the 
+        component.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp
+ */
+#define OMX_GetParameter(                                   \
+        hComponent,                                         \
+        nParamIndex,                                        \
+        pComponentParameterStructure)                        \
+    ((OMX_COMPONENTTYPE*)hComponent)->GetParameter(         \
+        hComponent,                                         \
+        nParamIndex,                                        \
+        pComponentParameterStructure)    /* Macro End */
+
+
+/** The OMX_SetParameter macro will send an initialization parameter
+    structure to a component.  Each structure shall be sent one at a time,
+    in a separate invocation of the macro.  This macro can only be
+    invoked when the component is in the OMX_StateLoaded state, or the
+    port is disabled (when the parameter applies to a port). The 
+    nParamIndex parameter is used to indicate which structure is being
+    passed to the component.  The application shall allocate the 
+    correct structure and shall fill in the structure size and version 
+    information (as well as the actual data) before invoking this macro.
+    The application is free to dispose of this structure after the call
+    as the component is required to copy any data it shall retain.  This 
+    is a blocking call.  
+    
+    The component should return from this call within 20 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [in] nIndex
+        Index of the structure to be sent.  This value is from the
+        OMX_INDEXTYPE enumeration.
+    @param [in] pComponentParameterStructure
+        pointer to application allocated structure to be used for
+        initialization by the component.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp
+ */
+#define OMX_SetParameter(                                   \
+        hComponent,                                         \
+        nParamIndex,                                        \
+        pComponentParameterStructure)                        \
+    ((OMX_COMPONENTTYPE*)hComponent)->SetParameter(         \
+        hComponent,                                         \
+        nParamIndex,                                        \
+        pComponentParameterStructure)    /* Macro End */
+
+
+/** The OMX_GetConfig macro will get one of the configuration structures 
+    from a component.  This macro can be invoked anytime after the 
+    component has been loaded.  The nParamIndex call parameter is used to 
+    indicate which structure is being requested from the component.  The 
+    application shall allocate the correct structure and shall fill in the 
+    structure size and version information before invoking this macro.  
+    If the component has not had this configuration parameter sent before, 
+    then the component should return a set of valid DEFAULT values for the 
+    component.  This is a blocking call.  
+    
+    The component should return from this call within 5 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [in] nIndex
+        Index of the structure to be filled.  This value is from the
+        OMX_INDEXTYPE enumeration.
+    @param [in,out] pComponentConfigStructure
+        pointer to application allocated structure to be filled by the 
+        component.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp
+*/        
+#define OMX_GetConfig(                                      \
+        hComponent,                                         \
+        nConfigIndex,                                       \
+        pComponentConfigStructure)                           \
+    ((OMX_COMPONENTTYPE*)hComponent)->GetConfig(            \
+        hComponent,                                         \
+        nConfigIndex,                                       \
+        pComponentConfigStructure)       /* Macro End */
+
+
+/** The OMX_SetConfig macro will send one of the configuration 
+    structures to a component.  Each structure shall be sent one at a time,
+    each in a separate invocation of the macro.  This macro can be invoked 
+    anytime after the component has been loaded.  The application shall 
+    allocate the correct structure and shall fill in the structure size 
+    and version information (as well as the actual data) before invoking 
+    this macro.  The application is free to dispose of this structure after 
+    the call as the component is required to copy any data it shall retain.  
+    This is a blocking call.  
+    
+    The component should return from this call within 5 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [in] nConfigIndex
+        Index of the structure to be sent.  This value is from the
+        OMX_INDEXTYPE enumeration above.
+    @param [in] pComponentConfigStructure
+        pointer to application allocated structure to be used for
+        initialization by the component.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp
+ */
+#define OMX_SetConfig(                                      \
+        hComponent,                                         \
+        nConfigIndex,                                       \
+        pComponentConfigStructure)                           \
+    ((OMX_COMPONENTTYPE*)hComponent)->SetConfig(            \
+        hComponent,                                         \
+        nConfigIndex,                                       \
+        pComponentConfigStructure)       /* Macro End */
+
+
+/** The OMX_GetExtensionIndex macro will invoke a component to translate 
+    a vendor specific configuration or parameter string into an OMX 
+    structure index.  There is no requirement for the vendor to support 
+    this command for the indexes already found in the OMX_INDEXTYPE 
+    enumeration (this is done to save space in small components).  The 
+    component shall support all vendor supplied extension indexes not found
+    in the master OMX_INDEXTYPE enumeration.  This is a blocking call.  
+    
+    The component should return from this call within 5 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the GetHandle function.
+    @param [in] cParameterName
+        OMX_STRING that shall be less than 128 characters long including
+        the trailing null byte.  This is the string that will get 
+        translated by the component into a configuration index.
+    @param [out] pIndexType
+        a pointer to a OMX_INDEXTYPE to receive the index value.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp
+ */
+#define OMX_GetExtensionIndex(                              \
+        hComponent,                                         \
+        cParameterName,                                     \
+        pIndexType)                                         \
+    ((OMX_COMPONENTTYPE*)hComponent)->GetExtensionIndex(    \
+        hComponent,                                         \
+        cParameterName,                                     \
+        pIndexType)                     /* Macro End */
+
+
+/** The OMX_GetState macro will invoke the component to get the current 
+    state of the component and place the state value into the location
+    pointed to by pState.  
+    
+    The component should return from this call within 5 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [out] pState
+        pointer to the location to receive the state.  The value returned
+        is one of the OMX_STATETYPE members 
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp
+ */
+#define OMX_GetState(                                       \
+        hComponent,                                         \
+        pState)                                             \
+    ((OMX_COMPONENTTYPE*)hComponent)->GetState(             \
+        hComponent,                                         \
+        pState)                         /* Macro End */
+
+
+/** The OMX_UseBuffer macro will request that the component use
+    a buffer (and allocate its own buffer header) already allocated 
+    by another component, or by the IL Client. This is a blocking 
+    call.
+    
+    The component should return from this call within 20 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [out] ppBuffer
+        pointer to an OMX_BUFFERHEADERTYPE structure used to receive the 
+        pointer to the buffer header
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp buf
+ */
+
+#define OMX_UseBuffer(                                      \
+           hComponent,                                      \
+           ppBufferHdr,                                     \
+           nPortIndex,                                      \
+           pAppPrivate,                                     \
+           nSizeBytes,                                      \
+           pBuffer)                                         \
+    ((OMX_COMPONENTTYPE*)hComponent)->UseBuffer(            \
+           hComponent,                                      \
+           ppBufferHdr,                                     \
+           nPortIndex,                                      \
+           pAppPrivate,                                     \
+           nSizeBytes,                                      \
+           pBuffer)
+
+
+/** The OMX_AllocateBuffer macro will request that the component allocate 
+    a new buffer and buffer header.  The component will allocate the 
+    buffer and the buffer header and return a pointer to the buffer 
+    header.  This is a blocking call.
+    
+    The component should return from this call within 5 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [out] ppBuffer
+        pointer to an OMX_BUFFERHEADERTYPE structure used to receive 
+        the pointer to the buffer header
+    @param [in] nPortIndex
+        nPortIndex is used to select the port on the component the buffer will
+        be used with.  The port can be found by using the nPortIndex
+        value as an index into the Port Definition array of the component.
+    @param [in] pAppPrivate
+        pAppPrivate is used to initialize the pAppPrivate member of the 
+        buffer header structure.
+    @param [in] nSizeBytes
+        size of the buffer to allocate.  Used when bAllocateNew is true.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp buf
+ */    
+#define OMX_AllocateBuffer(                                 \
+        hComponent,                                         \
+        ppBuffer,                                           \
+        nPortIndex,                                         \
+        pAppPrivate,                                        \
+        nSizeBytes)                                         \
+    ((OMX_COMPONENTTYPE*)hComponent)->AllocateBuffer(       \
+        hComponent,                                         \
+        ppBuffer,                                           \
+        nPortIndex,                                         \
+        pAppPrivate,                                        \
+        nSizeBytes)                     /* Macro End */
+
+
+/** The OMX_FreeBuffer macro will release a buffer header from the component
+    which was allocated using either OMX_AllocateBuffer or OMX_UseBuffer. If  
+    the component allocated the buffer (see the OMX_UseBuffer macro) then 
+    the component shall free the buffer and buffer header. This is a 
+    blocking call. 
+    
+    The component should return from this call within 20 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [in] nPortIndex
+        nPortIndex is used to select the port on the component the buffer will
+        be used with.
+    @param [in] pBuffer
+        pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+        or AllocateBuffer.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp buf
+ */
+#define OMX_FreeBuffer(                                     \
+        hComponent,                                         \
+        nPortIndex,                                         \
+        pBuffer)                                            \
+    ((OMX_COMPONENTTYPE*)hComponent)->FreeBuffer(           \
+        hComponent,                                         \
+        nPortIndex,                                         \
+        pBuffer)                        /* Macro End */
+
+
+/** The OMX_EmptyThisBuffer macro will send a buffer full of data to an 
+    input port of a component.  The buffer will be emptied by the component
+    and returned to the application via the EmptyBufferDone call back.
+    This is a non-blocking call in that the component will record the buffer
+    and return immediately and then empty the buffer, later, at the proper 
+    time.  As expected, this macro may be invoked only while the component 
+    is in the OMX_StateExecuting.  If nPortIndex does not specify an input
+    port, the component shall return an error.  
+    
+    The component should return from this call within 5 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [in] pBuffer
+        pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+        or AllocateBuffer.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp buf
+ */
+#define OMX_EmptyThisBuffer(                                \
+        hComponent,                                         \
+        pBuffer)                                            \
+    ((OMX_COMPONENTTYPE*)hComponent)->EmptyThisBuffer(      \
+        hComponent,                                         \
+        pBuffer)                        /* Macro End */
+
+
+/** The OMX_FillThisBuffer macro will send an empty buffer to an 
+    output port of a component.  The buffer will be filled by the component
+    and returned to the application via the FillBufferDone call back.
+    This is a non-blocking call in that the component will record the buffer
+    and return immediately and then fill the buffer, later, at the proper 
+    time.  As expected, this macro may be invoked only while the component 
+    is in the OMX_ExecutingState.  If nPortIndex does not specify an output
+    port, the component shall return an error.  
+    
+    The component should return from this call within 5 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [in] pBuffer
+        pointer to an OMX_BUFFERHEADERTYPE structure allocated with UseBuffer
+        or AllocateBuffer.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp buf
+ */
+#define OMX_FillThisBuffer(                                 \
+        hComponent,                                         \
+        pBuffer)                                            \
+    ((OMX_COMPONENTTYPE*)hComponent)->FillThisBuffer(       \
+        hComponent,                                         \
+        pBuffer)                        /* Macro End */
+
+
+
+/** The OMX_UseEGLImage macro will request that the component use
+    a EGLImage provided by EGL (and allocate its own buffer header)
+    This is a blocking call.
+    
+    The component should return from this call within 20 msec.
+    
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the OMX_GetHandle function.
+    @param [out] ppBuffer
+        pointer to an OMX_BUFFERHEADERTYPE structure used to receive the 
+        pointer to the buffer header.  Note that the memory location used
+        for this buffer is NOT visible to the IL Client.
+    @param [in] nPortIndex
+        nPortIndex is used to select the port on the component the buffer will
+        be used with.  The port can be found by using the nPortIndex
+        value as an index into the Port Definition array of the component.
+    @param [in] pAppPrivate
+        pAppPrivate is used to initialize the pAppPrivate member of the 
+        buffer header structure.
+    @param [in] eglImage
+        eglImage contains the handle of the EGLImage to use as a buffer on the
+        specified port.  The component is expected to validate properties of 
+        the EGLImage against the configuration of the port to ensure the component
+        can use the EGLImage as a buffer.          
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup comp buf
+ */
+#define OMX_UseEGLImage(                                    \
+           hComponent,                                      \
+           ppBufferHdr,                                     \
+           nPortIndex,                                      \
+           pAppPrivate,                                     \
+           eglImage)                                        \
+    ((OMX_COMPONENTTYPE*)hComponent)->UseEGLImage(          \
+           hComponent,                                      \
+           ppBufferHdr,                                     \
+           nPortIndex,                                      \
+           pAppPrivate,                                     \
+           eglImage)
+
+/** The OMX_Init method is used to initialize the OMX core.  It shall be the
+    first call made into OMX and it should only be executed one time without
+    an interviening OMX_Deinit call.  
+    
+    The core should return from this call within 20 msec.
+
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Init(void);
+
+
+/** The OMX_Deinit method is used to deinitialize the OMX core.  It shall be 
+    the last call made into OMX. In the event that the core determines that 
+    thare are components loaded when this call is made, the core may return 
+    with an error rather than try to unload the components.
+        
+    The core should return from this call within 20 msec.
+    
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_Deinit(void);
+
+
+/** The OMX_ComponentNameEnum method will enumerate through all the names of
+    recognised valid components in the system. This function is provided
+    as a means to detect all the components in the system run-time. There is
+    no strict ordering to the enumeration order of component names, although
+    each name will only be enumerated once.  If the OMX core supports run-time
+    installation of new components, it is only requried to detect newly
+    installed components when the first call to enumerate component names
+    is made (i.e. when nIndex is 0x0).
+    
+    The core should return from this call in 20 msec.
+    
+    @param [out] cComponentName
+        pointer to a null terminated string with the component name.  The
+        names of the components are strings less than 127 bytes in length
+        plus the trailing null for a maximum size of 128 bytes.  An example 
+        of a valid component name is "OMX.TI.AUDIO.DSP.MIXER\0".  Names are 
+        assigned by the vendor, but shall start with "OMX." and then have 
+        the Vendor designation next.
+    @param [in] nNameLength
+        number of characters in the cComponentName string.  With all 
+        component name strings restricted to less than 128 characters 
+        (including the trailing null) it is recomended that the caller
+        provide a input string for the cComponentName of 128 characters.
+    @param [in] nIndex
+        number containing the enumeration index for the component. 
+        Multiple calls to OMX_ComponentNameEnum with increasing values
+        of nIndex will enumerate through the component names in the
+        system until OMX_ErrorNoMore is returned.  The value of nIndex
+        is 0 to (N-1), where N is the number of valid installed components
+        in the system.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  When the value of nIndex exceeds the number of 
+        components in the system minus 1, OMX_ErrorNoMore will be
+        returned. Otherwise the appropriate OMX error will be returned.
+    @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_ComponentNameEnum(
+    OMX_OUT OMX_STRING cComponentName,
+    OMX_IN  OMX_U32 nNameLength,
+    OMX_IN  OMX_U32 nIndex);
+
+
+/** The OMX_GetHandle method will locate the component specified by the
+    component name given, load that component into memory and then invoke
+    the component's methods to create an instance of the component.  
+    
+    The core should return from this call within 20 msec.
+    
+    @param [out] pHandle
+        pointer to an OMX_HANDLETYPE pointer to be filled in by this method.
+    @param [in] cComponentName
+        pointer to a null terminated string with the component name.  The
+        names of the components are strings less than 127 bytes in length
+        plus the trailing null for a maximum size of 128 bytes.  An example 
+        of a valid component name is "OMX.TI.AUDIO.DSP.MIXER\0".  Names are 
+        assigned by the vendor, but shall start with "OMX." and then have 
+        the Vendor designation next.
+    @param [in] pAppData
+        pointer to an application defined value that will be returned
+        during callbacks so that the application can identify the source
+        of the callback.
+    @param [in] pCallBacks
+        pointer to a OMX_CALLBACKTYPE structure that will be passed to the
+        component to initialize it with.  
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_GetHandle(
+    OMX_OUT OMX_HANDLETYPE* pHandle, 
+    OMX_IN  OMX_STRING cComponentName,
+    OMX_IN  OMX_PTR pAppData,
+    OMX_IN  OMX_CALLBACKTYPE* pCallBacks);
+
+
+/** The OMX_FreeHandle method will free a handle allocated by the OMX_GetHandle 
+    method.  If the component reference count goes to zero, the component will
+    be unloaded from memory.  
+    
+    The core should return from this call within 20 msec when the component is 
+    in the OMX_StateLoaded state.
+
+    @param [in] hComponent
+        Handle of the component to be accessed.  This is the component
+        handle returned by the call to the GetHandle function.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+    @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_FreeHandle(
+    OMX_IN  OMX_HANDLETYPE hComponent);
+
+
+
+/** The OMX_SetupTunnel method will handle the necessary calls to the components
+    to setup the specified tunnel the two components.  NOTE: This is
+    an actual method (not a #define macro).  This method will make calls into
+    the component ComponentTunnelRequest method to do the actual tunnel 
+    connection.  
+
+    The ComponentTunnelRequest method on both components will be called. 
+    This method shall not be called unless the component is in the 
+    OMX_StateLoaded state except when the ports used for the tunnel are
+    disabled. In this case, the component may be in the OMX_StateExecuting,
+    OMX_StatePause, or OMX_StateIdle states. 
+
+    The core should return from this call within 20 msec.
+    
+    @param [in] hOutput
+        Handle of the component to be accessed.  Also this is the handle
+        of the component whose port, specified in the nPortOutput parameter
+        will be used the source for the tunnel. This is the component handle
+        returned by the call to the OMX_GetHandle function.  There is a 
+        requirement that hOutput be the source for the data when
+        tunelling (i.e. nPortOutput is an output port).  If 0x0, the component
+        specified in hInput will have it's port specified in nPortInput
+        setup for communication with the application / IL client.
+    @param [in] nPortOutput
+        nPortOutput is used to select the source port on component to be
+        used in the tunnel. 
+    @param [in] hInput
+        This is the component to setup the tunnel with. This is the handle
+        of the component whose port, specified in the nPortInput parameter
+        will be used the destination for the tunnel. This is the component handle
+        returned by the call to the OMX_GetHandle function.  There is a 
+        requirement that hInput be the destination for the data when
+        tunelling (i.e. nPortInut is an input port).   If 0x0, the component
+        specified in hOutput will have it's port specified in nPortPOutput
+        setup for communication with the application / IL client.
+    @param [in] nPortInput
+        nPortInput is used to select the destination port on component to be
+        used in the tunnel.
+    @return OMX_ERRORTYPE
+        If the command successfully executes, the return code will be
+        OMX_ErrorNone.  Otherwise the appropriate OMX error will be returned.
+        When OMX_ErrorNotImplemented is returned, one or both components is 
+        a non-interop component and does not support tunneling.
+        
+        On failure, the ports of both components are setup for communication
+        with the application / IL Client.
+    @ingroup core tun
+ */
+OMX_API OMX_ERRORTYPE OMX_APIENTRY OMX_SetupTunnel(
+    OMX_IN  OMX_HANDLETYPE hOutput,
+    OMX_IN  OMX_U32 nPortOutput,
+    OMX_IN  OMX_HANDLETYPE hInput,
+    OMX_IN  OMX_U32 nPortInput);
+    
+/** @ingroup cp */
+OMX_API OMX_ERRORTYPE   OMX_GetContentPipe(
+    OMX_OUT OMX_HANDLETYPE *hPipe,
+    OMX_IN OMX_STRING szURI);
+
+/** The OMX_GetComponentsOfRole method will return the number of components that support the given
+    role and (if the compNames field is non-NULL) the names of those components. The call will fail if 
+    an insufficiently sized array of names is supplied. To ensure the array is sufficiently sized the
+    client should:
+        * first call this function with the compNames field NULL to determine the number of component names
+        * second call this function with the compNames field pointing to an array of names allocated 
+          according to the number returned by the first call.
+
+    The core should return from this call within 5 msec.
+    
+    @param [in] role
+        This is generic standard component name consisting only of component class 
+        name and the type within that class (e.g. 'audio_decoder.aac').
+    @param [inout] pNumComps
+        This is used both as input and output. 
+        If compNames is NULL, the input is ignored and the output specifies how many components support
+        the given role.
+     
+        If compNames is not NULL, on input it bounds the size of the input structure and 
+        on output, it specifies the number of components string names listed within the compNames parameter.
+    @param [inout] compNames
+        If NULL this field is ignored. If non-NULL this points to an array of 128-byte strings which accepts 
+        a list of the names of all physical components that implement the specified standard component name. 
+        Each name is NULL terminated. numComps indicates the number of names.
+    @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_GetComponentsOfRole ( 
+       OMX_IN      OMX_STRING role,
+    OMX_INOUT   OMX_U32 *pNumComps,
+    OMX_INOUT   OMX_U8  **compNames);
+
+/** The OMX_GetRolesOfComponent method will return the number of roles supported by the given
+    component and (if the roles field is non-NULL) the names of those roles. The call will fail if 
+    an insufficiently sized array of names is supplied. To ensure the array is sufficiently sized the
+    client should:
+        * first call this function with the roles field NULL to determine the number of role names
+        * second call this function with the roles field pointing to an array of names allocated 
+          according to the number returned by the first call.
+
+    The core should return from this call within 5 msec.
+
+    @param [in] compName
+        This is the name of the component being queried about.
+    @param [inout] pNumRoles
+        This is used both as input and output. 
+        If roles is NULL, the input is ignored and the output specifies how many roles the component supports.
+     
+        If compNames is not NULL, on input it bounds the size of the input structure and 
+        on output, it specifies the number of roles string names listed within the roles parameter.
+    @param [out] roles
+        If NULL this field is ignored. If non-NULL this points to an array of 128-byte strings 
+        which accepts a list of the names of all standard components roles implemented on the 
+        specified component name. numComps indicates the number of names.
+    @ingroup core
+ */
+OMX_API OMX_ERRORTYPE OMX_GetRolesOfComponent ( 
+       OMX_IN      OMX_STRING compName, 
+    OMX_INOUT   OMX_U32 *pNumRoles,
+    OMX_OUT     OMX_U8 **roles);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
+
diff --git a/include/khronos/OMX_IVCommon.h b/include/khronos/OMX_IVCommon.h
new file mode 100644 (file)
index 0000000..4c4995c
--- /dev/null
@@ -0,0 +1,920 @@
+/**
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** 
+ * @file OMX_IVCommon.h - OpenMax IL version 1.1.2
+ *  The structures needed by Video and Image components to exchange
+ *  parameters and configuration data with the components.
+ */
+#ifndef OMX_IVCommon_h
+#define OMX_IVCommon_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/**
+ * Each OMX header must include all required header files to allow the header
+ * to compile without errors.  The includes below are required for this header
+ * file to compile successfully 
+ */
+
+#include <OMX_Core.h>
+
+/** @defgroup iv OpenMAX IL Imaging and Video Domain
+ * Common structures for OpenMAX IL Imaging and Video domains
+ * @{
+ */
+
+
+/** 
+ * Enumeration defining possible uncompressed image/video formats. 
+ *
+ * ENUMS:
+ *  Unused                 : Placeholder value when format is N/A
+ *  Monochrome             : black and white
+ *  8bitRGB332             : Red 7:5, Green 4:2, Blue 1:0
+ *  12bitRGB444            : Red 11:8, Green 7:4, Blue 3:0
+ *  16bitARGB4444          : Alpha 15:12, Red 11:8, Green 7:4, Blue 3:0
+ *  16bitARGB1555          : Alpha 15, Red 14:10, Green 9:5, Blue 4:0
+ *  16bitRGB565            : Red 15:11, Green 10:5, Blue 4:0
+ *  16bitBGR565            : Blue 15:11, Green 10:5, Red 4:0
+ *  18bitRGB666            : Red 17:12, Green 11:6, Blue 5:0
+ *  18bitARGB1665          : Alpha 17, Red 16:11, Green 10:5, Blue 4:0
+ *  19bitARGB1666          : Alpha 18, Red 17:12, Green 11:6, Blue 5:0
+ *  24bitRGB888            : Red 24:16, Green 15:8, Blue 7:0
+ *  24bitBGR888            : Blue 24:16, Green 15:8, Red 7:0
+ *  24bitARGB1887          : Alpha 23, Red 22:15, Green 14:7, Blue 6:0
+ *  25bitARGB1888          : Alpha 24, Red 23:16, Green 15:8, Blue 7:0
+ *  32bitBGRA8888          : Blue 31:24, Green 23:16, Red 15:8, Alpha 7:0
+ *  32bitARGB8888          : Alpha 31:24, Red 23:16, Green 15:8, Blue 7:0
+ *  YUV411Planar           : U,Y are subsampled by a factor of 4 horizontally
+ *  YUV411PackedPlanar     : packed per payload in planar slices
+ *  YUV420Planar           : Three arrays Y,U,V.
+ *  YUV420PackedPlanar     : packed per payload in planar slices
+ *  YUV420SemiPlanar       : Two arrays, one is all Y, the other is U and V
+ *  YUV422Planar           : Three arrays Y,U,V.
+ *  YUV422PackedPlanar     : packed per payload in planar slices
+ *  YUV422SemiPlanar       : Two arrays, one is all Y, the other is U and V
+ *  YCbYCr                 : Organized as 16bit YUYV (i.e. YCbYCr)
+ *  YCrYCb                 : Organized as 16bit YVYU (i.e. YCrYCb)
+ *  CbYCrY                 : Organized as 16bit UYVY (i.e. CbYCrY)
+ *  CrYCbY                 : Organized as 16bit VYUY (i.e. CrYCbY)
+ *  YUV444Interleaved      : Each pixel contains equal parts YUV
+ *  RawBayer8bit           : SMIA camera output format
+ *  RawBayer10bit          : SMIA camera output format
+ *  RawBayer8bitcompressed : SMIA camera output format
+ */
+typedef enum OMX_COLOR_FORMATTYPE {
+    OMX_COLOR_FormatUnused,
+    OMX_COLOR_FormatMonochrome,
+    OMX_COLOR_Format8bitRGB332,
+    OMX_COLOR_Format12bitRGB444,
+    OMX_COLOR_Format16bitARGB4444,
+    OMX_COLOR_Format16bitARGB1555,
+    OMX_COLOR_Format16bitRGB565,
+    OMX_COLOR_Format16bitBGR565,
+    OMX_COLOR_Format18bitRGB666,
+    OMX_COLOR_Format18bitARGB1665,
+    OMX_COLOR_Format19bitARGB1666, 
+    OMX_COLOR_Format24bitRGB888,
+    OMX_COLOR_Format24bitBGR888,
+    OMX_COLOR_Format24bitARGB1887,
+    OMX_COLOR_Format25bitARGB1888,
+    OMX_COLOR_Format32bitBGRA8888,
+    OMX_COLOR_Format32bitARGB8888,
+    OMX_COLOR_FormatYUV411Planar,
+    OMX_COLOR_FormatYUV411PackedPlanar,
+    OMX_COLOR_FormatYUV420Planar,
+    OMX_COLOR_FormatYUV420PackedPlanar,
+    OMX_COLOR_FormatYUV420SemiPlanar,
+    OMX_COLOR_FormatYUV422Planar,
+    OMX_COLOR_FormatYUV422PackedPlanar,
+    OMX_COLOR_FormatYUV422SemiPlanar,
+    OMX_COLOR_FormatYCbYCr,
+    OMX_COLOR_FormatYCrYCb,
+    OMX_COLOR_FormatCbYCrY,
+    OMX_COLOR_FormatCrYCbY,
+    OMX_COLOR_FormatYUV444Interleaved,
+    OMX_COLOR_FormatRawBayer8bit,
+    OMX_COLOR_FormatRawBayer10bit,
+    OMX_COLOR_FormatRawBayer8bitcompressed,
+    OMX_COLOR_FormatL2, 
+    OMX_COLOR_FormatL4, 
+    OMX_COLOR_FormatL8, 
+    OMX_COLOR_FormatL16, 
+    OMX_COLOR_FormatL24, 
+    OMX_COLOR_FormatL32,
+    OMX_COLOR_FormatYUV420PackedSemiPlanar,
+    OMX_COLOR_FormatYUV422PackedSemiPlanar,
+    OMX_COLOR_Format18BitBGR666,
+    OMX_COLOR_Format24BitARGB6666,
+    OMX_COLOR_Format24BitABGR6666,
+    OMX_COLOR_FormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_COLOR_FormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_COLOR_FormatMax = 0x7FFFFFFF
+} OMX_COLOR_FORMATTYPE;
+
+
+/** 
+ * Defines the matrix for conversion from RGB to YUV or vice versa.
+ * iColorMatrix should be initialized with the fixed point values 
+ * used in converting between formats.
+ */
+typedef struct OMX_CONFIG_COLORCONVERSIONTYPE {
+    OMX_U32 nSize;              /**< Size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version info */ 
+    OMX_U32 nPortIndex;         /**< Port that this struct applies to */
+    OMX_S32 xColorMatrix[3][3]; /**< Stored in signed Q16 format */
+    OMX_S32 xColorOffset[4];    /**< Stored in signed Q16 format */
+}OMX_CONFIG_COLORCONVERSIONTYPE;
+
+
+/** 
+ * Structure defining percent to scale each frame dimension.  For example:  
+ * To make the width 50% larger, use fWidth = 1.5 and to make the width
+ * 1/2 the original size, use fWidth = 0.5
+ */
+typedef struct OMX_CONFIG_SCALEFACTORTYPE {
+    OMX_U32 nSize;            /**< Size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version info */ 
+    OMX_U32 nPortIndex;       /**< Port that this struct applies to */
+    OMX_S32 xWidth;           /**< Fixed point value stored as Q16 */
+    OMX_S32 xHeight;          /**< Fixed point value stored as Q16 */
+}OMX_CONFIG_SCALEFACTORTYPE;
+
+
+/** 
+ * Enumeration of possible image filter types 
+ */
+typedef enum OMX_IMAGEFILTERTYPE {
+    OMX_ImageFilterNone,
+    OMX_ImageFilterNoise,
+    OMX_ImageFilterEmboss,
+    OMX_ImageFilterNegative,
+    OMX_ImageFilterSketch,
+    OMX_ImageFilterOilPaint,
+    OMX_ImageFilterHatch,
+    OMX_ImageFilterGpen,
+    OMX_ImageFilterAntialias, 
+    OMX_ImageFilterDeRing,       
+    OMX_ImageFilterSolarize,
+    OMX_ImageFilterKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_ImageFilterVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_ImageFilterMax = 0x7FFFFFFF
+} OMX_IMAGEFILTERTYPE;
+
+
+/** 
+ * Image filter configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize        : Size of the structure in bytes       
+ *  nVersion     : OMX specification version information
+ *  nPortIndex   : Port that this structure applies to 
+ *  eImageFilter : Image filter type enumeration      
+ */
+typedef struct OMX_CONFIG_IMAGEFILTERTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_IMAGEFILTERTYPE eImageFilter;
+} OMX_CONFIG_IMAGEFILTERTYPE;
+
+
+/** 
+ * Customized U and V for color enhancement 
+ *
+ * STRUCT MEMBERS:
+ *  nSize             : Size of the structure in bytes
+ *  nVersion          : OMX specification version information 
+ *  nPortIndex        : Port that this structure applies to
+ *  bColorEnhancement : Enable/disable color enhancement
+ *  nCustomizedU      : Practical values: 16-240, range: 0-255, value set for 
+ *                      U component
+ *  nCustomizedV      : Practical values: 16-240, range: 0-255, value set for 
+ *                      V component
+ */
+typedef struct OMX_CONFIG_COLORENHANCEMENTTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion; 
+    OMX_U32 nPortIndex;
+    OMX_BOOL bColorEnhancement;
+    OMX_U8 nCustomizedU;
+    OMX_U8 nCustomizedV;
+} OMX_CONFIG_COLORENHANCEMENTTYPE;
+
+
+/** 
+ * Define color key and color key mask 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information 
+ *  nPortIndex : Port that this structure applies to
+ *  nARGBColor : 32bit Alpha, Red, Green, Blue Color
+ *  nARGBMask  : 32bit Mask for Alpha, Red, Green, Blue channels
+ */
+typedef struct OMX_CONFIG_COLORKEYTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nARGBColor;
+    OMX_U32 nARGBMask;
+} OMX_CONFIG_COLORKEYTYPE;
+
+
+/** 
+ * List of color blend types for pre/post processing 
+ *
+ * ENUMS:
+ *  None          : No color blending present
+ *  AlphaConstant : Function is (alpha_constant * src) + 
+ *                  (1 - alpha_constant) * dst)
+ *  AlphaPerPixel : Function is (alpha * src) + (1 - alpha) * dst)
+ *  Alternate     : Function is alternating pixels from src and dst
+ *  And           : Function is (src & dst)
+ *  Or            : Function is (src | dst)
+ *  Invert        : Function is ~src
+ */
+typedef enum OMX_COLORBLENDTYPE {
+    OMX_ColorBlendNone,
+    OMX_ColorBlendAlphaConstant,
+    OMX_ColorBlendAlphaPerPixel,
+    OMX_ColorBlendAlternate,
+    OMX_ColorBlendAnd,
+    OMX_ColorBlendOr,
+    OMX_ColorBlendInvert,
+    OMX_ColorBlendKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_ColorBlendVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_ColorBlendMax = 0x7FFFFFFF
+} OMX_COLORBLENDTYPE;
+
+
+/** 
+ * Color blend configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize             : Size of the structure in bytes                        
+ *  nVersion          : OMX specification version information                
+ *  nPortIndex        : Port that this structure applies to                   
+ *  nRGBAlphaConstant : Constant global alpha values when global alpha is used
+ *  eColorBlend       : Color blend type enumeration                         
+ */
+typedef struct OMX_CONFIG_COLORBLENDTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nRGBAlphaConstant;
+    OMX_COLORBLENDTYPE  eColorBlend;
+} OMX_CONFIG_COLORBLENDTYPE;
+
+
+/** 
+ * Hold frame dimension
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes      
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to     
+ *  nWidth     : Frame width in pixels                 
+ *  nHeight    : Frame height in pixels                
+ */
+typedef struct OMX_FRAMESIZETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nWidth;
+    OMX_U32 nHeight;
+} OMX_FRAMESIZETYPE;
+
+
+/**
+ * Rotation configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes             
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to
+ *  nRotation  : +/- integer rotation value               
+ */
+typedef struct OMX_CONFIG_ROTATIONTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_S32 nRotation; 
+} OMX_CONFIG_ROTATIONTYPE;
+
+
+/** 
+ * Possible mirroring directions for pre/post processing 
+ *
+ * ENUMS:
+ *  None       : No mirroring                         
+ *  Vertical   : Vertical mirroring, flip on X axis   
+ *  Horizontal : Horizontal mirroring, flip on Y axis  
+ *  Both       : Both vertical and horizontal mirroring
+ */
+typedef enum OMX_MIRRORTYPE {
+    OMX_MirrorNone = 0,
+    OMX_MirrorVertical,
+    OMX_MirrorHorizontal,
+    OMX_MirrorBoth, 
+    OMX_MirrorKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_MirrorVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_MirrorMax = 0x7FFFFFFF   
+} OMX_MIRRORTYPE;
+
+
+/** 
+ * Mirroring configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes      
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to  
+ *  eMirror    : Mirror type enumeration              
+ */
+typedef struct OMX_CONFIG_MIRRORTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion; 
+    OMX_U32 nPortIndex;
+    OMX_MIRRORTYPE  eMirror;
+} OMX_CONFIG_MIRRORTYPE;
+
+
+/** 
+ * Position information only 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes               
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to
+ *  nX         : X coordinate for the point                     
+ *  nY         : Y coordinate for the point 
+ */                      
+typedef struct OMX_CONFIG_POINTTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_S32 nX;
+    OMX_S32 nY;
+} OMX_CONFIG_POINTTYPE;
+
+
+/** 
+ * Frame size plus position 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes                    
+ *  nVersion   : OMX specification version information      
+ *  nPortIndex : Port that this structure applies to    
+ *  nLeft      : X Coordinate of the top left corner of the rectangle
+ *  nTop       : Y Coordinate of the top left corner of the rectangle
+ *  nWidth     : Width of the rectangle                              
+ *  nHeight    : Height of the rectangle                             
+ */
+typedef struct OMX_CONFIG_RECTTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;  
+    OMX_U32 nPortIndex; 
+    OMX_S32 nLeft; 
+    OMX_S32 nTop;
+    OMX_U32 nWidth;
+    OMX_U32 nHeight;
+} OMX_CONFIG_RECTTYPE;
+
+
+/** 
+ * Deblocking state; it is required to be set up before starting the codec 
+ *
+ * STRUCT MEMBERS:
+ *  nSize       : Size of the structure in bytes      
+ *  nVersion    : OMX specification version information 
+ *  nPortIndex  : Port that this structure applies to
+ *  bDeblocking : Enable/disable deblocking mode    
+ */
+typedef struct OMX_PARAM_DEBLOCKINGTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bDeblocking;
+} OMX_PARAM_DEBLOCKINGTYPE;
+
+
+/** 
+ * Stabilization state 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes          
+ *  nVersion   : OMX specification version information    
+ *  nPortIndex : Port that this structure applies to   
+ *  bStab      : Enable/disable frame stabilization state
+ */
+typedef struct OMX_CONFIG_FRAMESTABTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bStab;
+} OMX_CONFIG_FRAMESTABTYPE;
+
+
+/** 
+ * White Balance control type 
+ *
+ * STRUCT MEMBERS:
+ *  SunLight : Referenced in JSR-234
+ *  Flash    : Optimal for device's integrated flash
+ */
+typedef enum OMX_WHITEBALCONTROLTYPE {
+    OMX_WhiteBalControlOff = 0,
+    OMX_WhiteBalControlAuto,
+    OMX_WhiteBalControlSunLight,
+    OMX_WhiteBalControlCloudy,
+    OMX_WhiteBalControlShade,
+    OMX_WhiteBalControlTungsten,
+    OMX_WhiteBalControlFluorescent,
+    OMX_WhiteBalControlIncandescent,
+    OMX_WhiteBalControlFlash,
+    OMX_WhiteBalControlHorizon,
+    OMX_WhiteBalControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_WhiteBalControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_WhiteBalControlMax = 0x7FFFFFFF
+} OMX_WHITEBALCONTROLTYPE;
+
+
+/** 
+ * White Balance control configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize            : Size of the structure in bytes       
+ *  nVersion         : OMX specification version information
+ *  nPortIndex       : Port that this structure applies to                 
+ *  eWhiteBalControl : White balance enumeration            
+ */
+typedef struct OMX_CONFIG_WHITEBALCONTROLTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_WHITEBALCONTROLTYPE eWhiteBalControl;
+} OMX_CONFIG_WHITEBALCONTROLTYPE;
+
+
+/** 
+ * Exposure control type 
+ */
+typedef enum OMX_EXPOSURECONTROLTYPE {
+    OMX_ExposureControlOff = 0,
+    OMX_ExposureControlAuto,
+    OMX_ExposureControlNight,
+    OMX_ExposureControlBackLight,
+    OMX_ExposureControlSpotLight,
+    OMX_ExposureControlSports,
+    OMX_ExposureControlSnow,
+    OMX_ExposureControlBeach,
+    OMX_ExposureControlLargeAperture,
+    OMX_ExposureControlSmallApperture,
+    OMX_ExposureControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_ExposureControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_ExposureControlMax = 0x7FFFFFFF
+} OMX_EXPOSURECONTROLTYPE;
+
+
+/** 
+ * White Balance control configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize            : Size of the structure in bytes      
+ *  nVersion         : OMX specification version information
+ *  nPortIndex       : Port that this structure applies to                
+ *  eExposureControl : Exposure control enumeration         
+ */
+typedef struct OMX_CONFIG_EXPOSURECONTROLTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_EXPOSURECONTROLTYPE eExposureControl;
+} OMX_CONFIG_EXPOSURECONTROLTYPE;
+
+
+/** 
+ * Defines sensor supported mode. 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes           
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to 
+ *  nFrameRate : Single shot mode is indicated by a 0     
+ *  bOneShot   : Enable for single shot, disable for streaming
+ *  sFrameSize : Framesize                                          
+ */
+typedef struct OMX_PARAM_SENSORMODETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nFrameRate;
+    OMX_BOOL bOneShot;
+    OMX_FRAMESIZETYPE sFrameSize;
+} OMX_PARAM_SENSORMODETYPE;
+
+
+/** 
+ * Defines contrast level 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes                              
+ *  nVersion   : OMX specification version information                
+ *  nPortIndex : Port that this structure applies to                 
+ *  nContrast  : Values allowed for contrast -100 to 100, zero means no change
+ */
+typedef struct OMX_CONFIG_CONTRASTTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_S32 nContrast;
+} OMX_CONFIG_CONTRASTTYPE;
+
+
+/** 
+ * Defines brightness level 
+ *
+ * STRUCT MEMBERS:
+ *  nSize       : Size of the structure in bytes          
+ *  nVersion    : OMX specification version information 
+ *  nPortIndex  : Port that this structure applies to 
+ *  nBrightness : 0-100%        
+ */
+typedef struct OMX_CONFIG_BRIGHTNESSTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nBrightness;
+} OMX_CONFIG_BRIGHTNESSTYPE;
+
+
+/** 
+ * Defines backlight level configuration for a video sink, e.g. LCD panel 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information 
+ *  nPortIndex : Port that this structure applies to
+ *  nBacklight : Values allowed for backlight 0-100%
+ *  nTimeout   : Number of milliseconds before backlight automatically turns 
+ *               off.  A value of 0x0 disables backight timeout 
+ */
+typedef struct OMX_CONFIG_BACKLIGHTTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nBacklight;
+    OMX_U32 nTimeout;
+} OMX_CONFIG_BACKLIGHTTYPE;
+
+
+/** 
+ * Defines setting for Gamma 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information 
+ *  nPortIndex : Port that this structure applies to
+ *  nGamma     : Values allowed for gamma -100 to 100, zero means no change
+ */
+typedef struct OMX_CONFIG_GAMMATYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_S32 nGamma;
+} OMX_CONFIG_GAMMATYPE;
+
+
+/** 
+ * Define for setting saturation 
+ * 
+ * STRUCT MEMBERS:
+ *  nSize       : Size of the structure in bytes
+ *  nVersion    : OMX specification version information
+ *  nPortIndex  : Port that this structure applies to
+ *  nSaturation : Values allowed for saturation -100 to 100, zero means 
+ *                no change
+ */
+typedef struct OMX_CONFIG_SATURATIONTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_S32 nSaturation;
+} OMX_CONFIG_SATURATIONTYPE;
+
+
+/** 
+ * Define for setting Lightness 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to
+ *  nLightness : Values allowed for lightness -100 to 100, zero means no 
+ *               change
+ */
+typedef struct OMX_CONFIG_LIGHTNESSTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_S32 nLightness;
+} OMX_CONFIG_LIGHTNESSTYPE;
+
+
+/** 
+ * Plane blend configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes 
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Index of input port associated with the plane.
+ *  nDepth     : Depth of the plane in relation to the screen. Higher 
+ *               numbered depths are "behind" lower number depths.  
+ *               This number defaults to the Port Index number.
+ *  nAlpha     : Transparency blending component for the entire plane.  
+ *               See blending modes for more detail.
+ */
+typedef struct OMX_CONFIG_PLANEBLENDTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nDepth;
+    OMX_U32 nAlpha;
+} OMX_CONFIG_PLANEBLENDTYPE;
+
+
+/** 
+ * Define interlace type
+ *
+ * STRUCT MEMBERS:
+ *  nSize                 : Size of the structure in bytes 
+ *  nVersion              : OMX specification version information 
+ *  nPortIndex            : Port that this structure applies to
+ *  bEnable               : Enable control variable for this functionality 
+ *                          (see below)
+ *  nInterleavePortIndex  : Index of input or output port associated with  
+ *                          the interleaved plane. 
+ *  pPlanarPortIndexes[4] : Index of input or output planar ports.
+ */
+typedef struct OMX_PARAM_INTERLEAVETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bEnable;
+    OMX_U32 nInterleavePortIndex;
+} OMX_PARAM_INTERLEAVETYPE;
+
+
+/** 
+ * Defines the picture effect used for an input picture 
+ */
+typedef enum OMX_TRANSITIONEFFECTTYPE {
+    OMX_EffectNone,
+    OMX_EffectFadeFromBlack,
+    OMX_EffectFadeToBlack,
+    OMX_EffectUnspecifiedThroughConstantColor,
+    OMX_EffectDissolve,
+    OMX_EffectWipe,
+    OMX_EffectUnspecifiedMixOfTwoScenes,
+    OMX_EffectKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_EffectVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_EffectMax = 0x7FFFFFFF
+} OMX_TRANSITIONEFFECTTYPE;
+
+
+/** 
+ * Structure used to configure current transition effect 
+ *
+ * STRUCT MEMBERS:
+ * nSize      : Size of the structure in bytes
+ * nVersion   : OMX specification version information 
+ * nPortIndex : Port that this structure applies to
+ * eEffect    : Effect to enable
+ */
+typedef struct OMX_CONFIG_TRANSITIONEFFECTTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_TRANSITIONEFFECTTYPE eEffect;
+} OMX_CONFIG_TRANSITIONEFFECTTYPE;
+
+
+/** 
+ * Defines possible data unit types for encoded video data. The data unit 
+ * types are used both for encoded video input for playback as well as
+ * encoded video output from recording. 
+ */
+typedef enum OMX_DATAUNITTYPE {
+    OMX_DataUnitCodedPicture,
+    OMX_DataUnitVideoSegment,
+    OMX_DataUnitSeveralSegments,
+    OMX_DataUnitArbitraryStreamSection,
+    OMX_DataUnitKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_DataUnitVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_DataUnitMax = 0x7FFFFFFF
+} OMX_DATAUNITTYPE;
+
+
+/** 
+ * Defines possible encapsulation types for coded video data unit. The 
+ * encapsulation information is used both for encoded video input for 
+ * playback as well as encoded video output from recording. 
+ */
+typedef enum OMX_DATAUNITENCAPSULATIONTYPE {
+    OMX_DataEncapsulationElementaryStream,
+    OMX_DataEncapsulationGenericPayload,
+    OMX_DataEncapsulationRtpPayload,
+    OMX_DataEncapsulationKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_DataEncapsulationVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_DataEncapsulationMax = 0x7FFFFFFF
+} OMX_DATAUNITENCAPSULATIONTYPE;
+
+
+/** 
+ * Structure used to configure the type of being decoded/encoded 
+ */
+typedef struct OMX_PARAM_DATAUNITTYPE {
+    OMX_U32 nSize;            /**< Size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;       /**< Port that this structure applies to */
+    OMX_DATAUNITTYPE eUnitType;
+    OMX_DATAUNITENCAPSULATIONTYPE eEncapsulationType;
+} OMX_PARAM_DATAUNITTYPE;
+
+
+/**
+ * Defines dither types 
+ */
+typedef enum OMX_DITHERTYPE {
+    OMX_DitherNone,
+    OMX_DitherOrdered,
+    OMX_DitherErrorDiffusion,
+    OMX_DitherOther,
+    OMX_DitherKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_DitherVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_DitherMax = 0x7FFFFFFF
+} OMX_DITHERTYPE;
+
+
+/** 
+ * Structure used to configure current type of dithering 
+ */
+typedef struct OMX_CONFIG_DITHERTYPE {
+    OMX_U32 nSize;            /**< Size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */ 
+    OMX_U32 nPortIndex;       /**< Port that this structure applies to */
+    OMX_DITHERTYPE eDither;   /**< Type of dithering to use */
+} OMX_CONFIG_DITHERTYPE;
+
+typedef struct OMX_CONFIG_CAPTUREMODETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;     /**< Port that this structure applies to */
+    OMX_BOOL bContinuous;   /**< If true then ignore frame rate and emit capture 
+                             *   data as fast as possible (otherwise obey port's frame rate). */
+    OMX_BOOL bFrameLimited; /**< If true then terminate capture after the port emits the 
+                             *   specified number of frames (otherwise the port does not 
+                             *   terminate the capture until instructed to do so by the client). 
+                             *   Even if set, the client may manually terminate the capture prior 
+                             *   to reaching the limit. */
+    OMX_U32 nFrameLimit;      /**< Limit on number of frames emitted during a capture (only
+                               *   valid if bFrameLimited is set). */
+} OMX_CONFIG_CAPTUREMODETYPE;
+
+typedef enum OMX_METERINGTYPE {
+    OMX_MeteringModeAverage,     /**< Center-weighted average metering. */
+    OMX_MeteringModeSpot,            /**< Spot (partial) metering. */
+    OMX_MeteringModeMatrix,      /**< Matrix or evaluative metering. */
+    OMX_MeteringKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_MeteringVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_EVModeMax = 0x7fffffff
+} OMX_METERINGTYPE;
+typedef struct OMX_CONFIG_EXPOSUREVALUETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_METERINGTYPE eMetering;
+    OMX_S32 xEVCompensation;      /**< Fixed point value stored as Q16 */
+    OMX_U32 nApertureFNumber;     /**< e.g. nApertureFNumber = 2 implies "f/2" - Q16 format */
+    OMX_BOOL bAutoAperture;            /**< Whether aperture number is defined automatically */
+    OMX_U32 nShutterSpeedMsec;    /**< Shutterspeed in milliseconds */ 
+    OMX_BOOL bAutoShutterSpeed;        /**< Whether shutter speed is defined automatically */ 
+    OMX_U32 nSensitivity;         /**< e.g. nSensitivity = 100 implies "ISO 100" */
+    OMX_BOOL bAutoSensitivity; /**< Whether sensitivity is defined automatically */
+} OMX_CONFIG_EXPOSUREVALUETYPE;
+
+/** 
+ * Focus region configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize           : Size of the structure in bytes
+ *  nVersion        : OMX specification version information
+ *  nPortIndex      : Port that this structure applies to
+ *  bCenter         : Use center region as focus region of interest
+ *  bLeft           : Use left region as focus region of interest
+ *  bRight          : Use right region as focus region of interest
+ *  bTop            : Use top region as focus region of interest
+ *  bBottom         : Use bottom region as focus region of interest
+ *  bTopLeft        : Use top left region as focus region of interest
+ *  bTopRight       : Use top right region as focus region of interest
+ *  bBottomLeft     : Use bottom left region as focus region of interest
+ *  bBottomRight    : Use bottom right region as focus region of interest
+ */
+typedef struct OMX_CONFIG_FOCUSREGIONTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bCenter;
+    OMX_BOOL bLeft;
+    OMX_BOOL bRight;
+    OMX_BOOL bTop;
+    OMX_BOOL bBottom;
+    OMX_BOOL bTopLeft;
+    OMX_BOOL bTopRight;
+    OMX_BOOL bBottomLeft;
+    OMX_BOOL bBottomRight;
+} OMX_CONFIG_FOCUSREGIONTYPE;
+
+/** 
+ * Focus Status type 
+ */
+typedef enum OMX_FOCUSSTATUSTYPE {
+    OMX_FocusStatusOff = 0,
+    OMX_FocusStatusRequest,
+    OMX_FocusStatusReached,
+    OMX_FocusStatusUnableToReach,
+    OMX_FocusStatusLost,
+    OMX_FocusStatusKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_FocusStatusVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_FocusStatusMax = 0x7FFFFFFF
+} OMX_FOCUSSTATUSTYPE;
+
+/** 
+ * Focus status configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize               : Size of the structure in bytes
+ *  nVersion            : OMX specification version information
+ *  nPortIndex          : Port that this structure applies to
+ *  eFocusStatus        : Specifies the focus status
+ *  bCenterStatus       : Use center region as focus region of interest
+ *  bLeftStatus         : Use left region as focus region of interest
+ *  bRightStatus        : Use right region as focus region of interest
+ *  bTopStatus          : Use top region as focus region of interest
+ *  bBottomStatus       : Use bottom region as focus region of interest
+ *  bTopLeftStatus      : Use top left region as focus region of interest
+ *  bTopRightStatus     : Use top right region as focus region of interest
+ *  bBottomLeftStatus   : Use bottom left region as focus region of interest
+ *  bBottomRightStatus  : Use bottom right region as focus region of interest
+ */
+typedef struct OMX_PARAM_FOCUSSTATUSTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_FOCUSSTATUSTYPE eFocusStatus;
+    OMX_BOOL bCenterStatus;
+    OMX_BOOL bLeftStatus;
+    OMX_BOOL bRightStatus;
+    OMX_BOOL bTopStatus;
+    OMX_BOOL bBottomStatus;
+    OMX_BOOL bTopLeftStatus;
+    OMX_BOOL bTopRightStatus;
+    OMX_BOOL bBottomLeftStatus;
+    OMX_BOOL bBottomRightStatus;
+} OMX_PARAM_FOCUSSTATUSTYPE;
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/include/khronos/OMX_Image.h b/include/khronos/OMX_Image.h
new file mode 100644 (file)
index 0000000..a6d4666
--- /dev/null
@@ -0,0 +1,328 @@
+/**
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ */
+
+/** 
+ * @file OMX_Image.h - OpenMax IL version 1.1.2
+ * The structures needed by Image components to exchange parameters and 
+ * configuration data with the components.
+ */
+#ifndef OMX_Image_h
+#define OMX_Image_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/**
+ * Each OMX header must include all required header files to allow the 
+ * header to compile without errors.  The includes below are required  
+ * for this header file to compile successfully 
+ */
+
+#include <OMX_IVCommon.h>
+
+/** @defgroup imaging OpenMAX IL Imaging Domain
+ * @ingroup iv
+ * Structures for OpenMAX IL Imaging domain
+ * @{
+ */
+
+/** 
+ * Enumeration used to define the possible image compression coding. 
+ */
+typedef enum OMX_IMAGE_CODINGTYPE {
+    OMX_IMAGE_CodingUnused,      /**< Value when format is N/A */
+    OMX_IMAGE_CodingAutoDetect,  /**< Auto detection of image format */
+    OMX_IMAGE_CodingJPEG,        /**< JPEG/JFIF image format */
+    OMX_IMAGE_CodingJPEG2K,      /**< JPEG 2000 image format */
+    OMX_IMAGE_CodingEXIF,        /**< EXIF image format */
+    OMX_IMAGE_CodingTIFF,        /**< TIFF image format */
+    OMX_IMAGE_CodingGIF,         /**< Graphics image format */
+    OMX_IMAGE_CodingPNG,         /**< PNG image format */
+    OMX_IMAGE_CodingLZW,         /**< LZW image format */
+    OMX_IMAGE_CodingBMP,         /**< Windows Bitmap format */
+    OMX_IMAGE_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_IMAGE_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_IMAGE_CodingMax = 0x7FFFFFFF
+} OMX_IMAGE_CODINGTYPE;
+
+
+/**
+ * Data structure used to define an image path. The number of image paths 
+ * for input and output will vary by type of the image component.  
+ * 
+ *  Input (aka Source) : Zero Inputs, one Output,
+ *  Splitter           : One Input, 2 or more Outputs,
+ *  Processing Element : One Input, one output,
+ *  Mixer              : 2 or more inputs, one output,
+ *  Output (aka Sink)  : One Input, zero outputs.
+ * 
+ * The PortDefinition structure is used to define all of the parameters 
+ * necessary for the compliant component to setup an input or an output  
+ * image path.  If additional vendor specific data is required, it should  
+ * be transmitted to the component using the CustomCommand function.   
+ * Compliant components will prepopulate this structure with optimal  
+ * values during the OMX_GetParameter() command.
+ *
+ * STRUCT MEMBERS:
+ *  cMIMEType             : MIME type of data for the port
+ *  pNativeRender         : Platform specific reference for a display if a 
+ *                          sync, otherwise this field is 0
+ *  nFrameWidth           : Width of frame to be used on port if 
+ *                          uncompressed format is used.  Use 0 for 
+ *                          unknown, don't care or variable
+ *  nFrameHeight          : Height of frame to be used on port if 
+ *                          uncompressed format is used. Use 0 for 
+ *                          unknown, don't care or variable
+ *  nStride               : Number of bytes per span of an image (i.e. 
+ *                          indicates the number of bytes to get from
+ *                          span N to span N+1, where negative stride 
+ *                          indicates the image is bottom up
+ *  nSliceHeight          : Height used when encoding in slices
+ *  bFlagErrorConcealment : Turns on error concealment if it is supported by 
+ *                          the OMX component
+ *  eCompressionFormat    : Compression format used in this instance of  
+ *                          the component. When OMX_IMAGE_CodingUnused is 
+ *                          specified, eColorFormat is valid
+ *  eColorFormat          : Decompressed format used by this component
+ *  pNativeWindow         : Platform specific reference for a window object if a 
+ *                          display sink , otherwise this field is 0x0. 
+ */
+typedef struct OMX_IMAGE_PORTDEFINITIONTYPE {
+    OMX_STRING cMIMEType;
+    OMX_NATIVE_DEVICETYPE pNativeRender;
+    OMX_U32 nFrameWidth; 
+    OMX_U32 nFrameHeight;
+    OMX_S32 nStride;     
+    OMX_U32 nSliceHeight;
+    OMX_BOOL bFlagErrorConcealment;
+    OMX_IMAGE_CODINGTYPE eCompressionFormat;
+    OMX_COLOR_FORMATTYPE eColorFormat;
+    OMX_NATIVE_WINDOWTYPE pNativeWindow;
+} OMX_IMAGE_PORTDEFINITIONTYPE;
+
+
+/**  
+ * Port format parameter.  This structure is used to enumerate the various 
+ * data input/output format supported by the port.
+ * 
+ * STRUCT MEMBERS:
+ *  nSize              : Size of the structure in bytes
+ *  nVersion           : OMX specification version information
+ *  nPortIndex         : Indicates which port to set
+ *  nIndex             : Indicates the enumeration index for the format from 
+ *                       0x0 to N-1
+ *  eCompressionFormat : Compression format used in this instance of the 
+ *                       component. When OMX_IMAGE_CodingUnused is specified, 
+ *                       eColorFormat is valid
+ *  eColorFormat       : Decompressed format used by this component
+ */
+typedef struct OMX_IMAGE_PARAM_PORTFORMATTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nIndex;
+    OMX_IMAGE_CODINGTYPE eCompressionFormat;
+    OMX_COLOR_FORMATTYPE eColorFormat;
+} OMX_IMAGE_PARAM_PORTFORMATTYPE;
+
+
+/** 
+ * Flash control type 
+ *
+ * ENUMS
+ *  Torch : Flash forced constantly on
+ */
+typedef enum OMX_IMAGE_FLASHCONTROLTYPE {
+    OMX_IMAGE_FlashControlOn = 0,
+    OMX_IMAGE_FlashControlOff,
+    OMX_IMAGE_FlashControlAuto,
+    OMX_IMAGE_FlashControlRedEyeReduction,
+    OMX_IMAGE_FlashControlFillin,
+    OMX_IMAGE_FlashControlTorch,
+    OMX_IMAGE_FlashControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_IMAGE_FlashControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_IMAGE_FlashControlMax = 0x7FFFFFFF
+} OMX_IMAGE_FLASHCONTROLTYPE;
+
+
+/** 
+ * Flash control configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize         : Size of the structure in bytes
+ *  nVersion      : OMX specification version information
+ *  nPortIndex    : Port that this structure applies to
+ *  eFlashControl : Flash control type
+ */
+typedef struct OMX_IMAGE_PARAM_FLASHCONTROLTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_IMAGE_FLASHCONTROLTYPE eFlashControl;
+} OMX_IMAGE_PARAM_FLASHCONTROLTYPE;
+
+
+/** 
+ * Focus control type 
+ */
+typedef enum OMX_IMAGE_FOCUSCONTROLTYPE {
+    OMX_IMAGE_FocusControlOn = 0,
+    OMX_IMAGE_FocusControlOff,
+    OMX_IMAGE_FocusControlAuto,
+    OMX_IMAGE_FocusControlAutoLock,
+    OMX_IMAGE_FocusControlKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_IMAGE_FocusControlVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_IMAGE_FocusControlMax = 0x7FFFFFFF
+} OMX_IMAGE_FOCUSCONTROLTYPE;
+
+/** 
+ * Focus control configuration 
+ *
+ * STRUCT MEMBERS:
+ *  nSize           : Size of the structure in bytes
+ *  nVersion        : OMX specification version information
+ *  nPortIndex      : Port that this structure applies to
+ *  eFocusControl   : Focus control
+ *  nFocusSteps     : Focus can take on values from 0 mm to infinity. 
+ *                    Interest is only in number of steps over this range.
+ *  nFocusStepIndex : Current focus step index
+ */
+typedef struct OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_IMAGE_FOCUSCONTROLTYPE eFocusControl;
+    OMX_U32 nFocusSteps;
+    OMX_U32 nFocusStepIndex;
+} OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE;
+
+
+/** 
+ * Q Factor for JPEG compression, which controls the tradeoff between image
+ * quality and size.  Q Factor provides a more simple means of controlling
+ * JPEG compression quality, without directly programming Quantization
+ * tables for chroma and luma 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes         
+ *  nVersion   : OMX specification version information 
+ *  nPortIndex : Port that this structure applies to 
+ *  nQFactor   : JPEG Q factor value in the range of 1-100. A factor of 1 
+ *               produces the smallest, worst quality images, and a factor 
+ *               of 100 produces the largest, best quality images.  A 
+ *               typical default is 75 for small good quality images               
+ */
+typedef struct OMX_IMAGE_PARAM_QFACTORTYPE {
+    OMX_U32 nSize;            
+    OMX_VERSIONTYPE nVersion; 
+    OMX_U32 nPortIndex;       
+    OMX_U32 nQFactor;                                        
+} OMX_IMAGE_PARAM_QFACTORTYPE;
+
+/** 
+ * Quantization table type 
+ */
+
+typedef enum OMX_IMAGE_QUANTIZATIONTABLETYPE {
+    OMX_IMAGE_QuantizationTableLuma = 0,
+    OMX_IMAGE_QuantizationTableChroma,
+    OMX_IMAGE_QuantizationTableChromaCb,
+    OMX_IMAGE_QuantizationTableChromaCr,
+    OMX_IMAGE_QuantizationTableKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_IMAGE_QuantizationTableVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_IMAGE_QuantizationTableMax = 0x7FFFFFFF
+} OMX_IMAGE_QUANTIZATIONTABLETYPE;
+
+/** 
+ * JPEG quantization tables are used to determine DCT compression for
+ * YUV data, as an alternative to specifying Q factor, providing exact 
+ * control of compression 
+ *
+ * STRUCT MEMBERS:
+ *  nSize                   : Size of the structure in bytes
+ *  nVersion                : OMX specification version information 
+ *  nPortIndex              : Port that this structure applies to
+ *  eQuantizationTable      : Quantization table type
+ *  nQuantizationMatrix[64] : JPEG quantization table of coefficients stored 
+ *                            in increasing columns then by rows of data (i.e. 
+ *                            row 1, ... row 8). Quantization values are in 
+ *                            the range 0-255 and stored in linear order
+ *                            (i.e. the component will zig-zag the 
+ *                            quantization table data if required internally) 
+ */
+typedef struct OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_IMAGE_QUANTIZATIONTABLETYPE eQuantizationTable;
+    OMX_U8 nQuantizationMatrix[64];
+} OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE;
+
+
+/** 
+ * Huffman table type, the same Huffman table is applied for chroma and 
+ * luma component 
+ */
+typedef enum OMX_IMAGE_HUFFMANTABLETYPE {
+    OMX_IMAGE_HuffmanTableAC = 0,
+    OMX_IMAGE_HuffmanTableDC,
+    OMX_IMAGE_HuffmanTableACLuma,
+    OMX_IMAGE_HuffmanTableACChroma,
+    OMX_IMAGE_HuffmanTableDCLuma,
+    OMX_IMAGE_HuffmanTableDCChroma,
+    OMX_IMAGE_HuffmanTableKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_IMAGE_HuffmanTableVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_IMAGE_HuffmanTableMax = 0x7FFFFFFF
+} OMX_IMAGE_HUFFMANTABLETYPE;
+
+/** 
+ * JPEG Huffman table 
+ *
+ * STRUCT MEMBERS:
+ *  nSize                            : Size of the structure in bytes
+ *  nVersion                         : OMX specification version information
+ *  nPortIndex                       : Port that this structure applies to
+ *  eHuffmanTable                    : Huffman table type
+ *  nNumberOfHuffmanCodeOfLength[16] : 0-16, number of Huffman codes of each 
+ *                                     possible length
+ *  nHuffmanTable[256]               : 0-255, the size used for AC and DC 
+ *                                     HuffmanTable are 16 and 162 
+ */
+typedef struct OMX_IMAGE_PARAM_HUFFMANTTABLETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_IMAGE_HUFFMANTABLETYPE eHuffmanTable;
+    OMX_U8 nNumberOfHuffmanCodeOfLength[16];
+    OMX_U8 nHuffmanTable[256];
+}OMX_IMAGE_PARAM_HUFFMANTTABLETYPE;
+
+/** @} */
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/include/khronos/OMX_Index.h b/include/khronos/OMX_Index.h
new file mode 100644 (file)
index 0000000..44d4ea7
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** @file OMX_Index.h - OpenMax IL version 1.1.2
+ *  The OMX_Index header file contains the definitions for both applications
+ *  and components .
+ */
+
+
+#ifndef OMX_Index_h
+#define OMX_Index_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Each OMX header must include all required header files to allow the
+ *  header to compile without errors.  The includes below are required
+ *  for this header file to compile successfully 
+ */
+#include <OMX_Types.h>
+
+
+/** The OMX_INDEXTYPE enumeration is used to select a structure when either
+ *  getting or setting parameters and/or configuration data.  Each entry in 
+ *  this enumeration maps to an OMX specified structure.  When the 
+ *  OMX_GetParameter, OMX_SetParameter, OMX_GetConfig or OMX_SetConfig methods
+ *  are used, the second parameter will always be an entry from this enumeration
+ *  and the third entry will be the structure shown in the comments for the entry.
+ *  For example, if the application is initializing a cropping function, the 
+ *  OMX_SetConfig command would have OMX_IndexConfigCommonInputCrop as the second parameter 
+ *  and would send a pointer to an initialized OMX_RECTTYPE structure as the 
+ *  third parameter.
+ *  
+ *  The enumeration entries named with the OMX_Config prefix are sent using
+ *  the OMX_SetConfig command and the enumeration entries named with the
+ *  OMX_PARAM_ prefix are sent using the OMX_SetParameter command.
+ */
+typedef enum OMX_INDEXTYPE {
+
+    OMX_IndexComponentStartUnused = 0x01000000,
+    OMX_IndexParamPriorityMgmt,             /**< reference: OMX_PRIORITYMGMTTYPE */
+    OMX_IndexParamAudioInit,                /**< reference: OMX_PORT_PARAM_TYPE */
+    OMX_IndexParamImageInit,                /**< reference: OMX_PORT_PARAM_TYPE */
+    OMX_IndexParamVideoInit,                /**< reference: OMX_PORT_PARAM_TYPE */
+    OMX_IndexParamOtherInit,                /**< reference: OMX_PORT_PARAM_TYPE */
+    OMX_IndexParamNumAvailableStreams,      /**< reference: OMX_PARAM_U32TYPE */
+    OMX_IndexParamActiveStream,             /**< reference: OMX_PARAM_U32TYPE */
+    OMX_IndexParamSuspensionPolicy,         /**< reference: OMX_PARAM_SUSPENSIONPOLICYTYPE */
+    OMX_IndexParamComponentSuspended,       /**< reference: OMX_PARAM_SUSPENSIONTYPE */
+    OMX_IndexConfigCapturing,               /**< reference: OMX_CONFIG_BOOLEANTYPE */ 
+    OMX_IndexConfigCaptureMode,             /**< reference: OMX_CONFIG_CAPTUREMODETYPE */ 
+    OMX_IndexAutoPauseAfterCapture,         /**< reference: OMX_CONFIG_BOOLEANTYPE */ 
+    OMX_IndexParamContentURI,               /**< reference: OMX_PARAM_CONTENTURITYPE */
+    OMX_IndexParamCustomContentPipe,        /**< reference: OMX_PARAM_CONTENTPIPETYPE */ 
+    OMX_IndexParamDisableResourceConcealment, /**< reference: OMX_RESOURCECONCEALMENTTYPE */
+    OMX_IndexConfigMetadataItemCount,       /**< reference: OMX_CONFIG_METADATAITEMCOUNTTYPE */
+    OMX_IndexConfigContainerNodeCount,      /**< reference: OMX_CONFIG_CONTAINERNODECOUNTTYPE */
+    OMX_IndexConfigMetadataItem,            /**< reference: OMX_CONFIG_METADATAITEMTYPE */
+    OMX_IndexConfigCounterNodeID,           /**< reference: OMX_CONFIG_CONTAINERNODEIDTYPE */
+    OMX_IndexParamMetadataFilterType,       /**< reference: OMX_PARAM_METADATAFILTERTYPE */
+    OMX_IndexParamMetadataKeyFilter,        /**< reference: OMX_PARAM_METADATAFILTERTYPE */
+    OMX_IndexConfigPriorityMgmt,            /**< reference: OMX_PRIORITYMGMTTYPE */
+    OMX_IndexParamStandardComponentRole,    /**< reference: OMX_PARAM_COMPONENTROLETYPE */
+
+    OMX_IndexPortStartUnused = 0x02000000,
+    OMX_IndexParamPortDefinition,           /**< reference: OMX_PARAM_PORTDEFINITIONTYPE */
+    OMX_IndexParamCompBufferSupplier,       /**< reference: OMX_PARAM_BUFFERSUPPLIERTYPE */ 
+    OMX_IndexReservedStartUnused = 0x03000000,
+
+    /* Audio parameters and configurations */
+    OMX_IndexAudioStartUnused = 0x04000000,
+    OMX_IndexParamAudioPortFormat,          /**< reference: OMX_AUDIO_PARAM_PORTFORMATTYPE */
+    OMX_IndexParamAudioPcm,                 /**< reference: OMX_AUDIO_PARAM_PCMMODETYPE */
+    OMX_IndexParamAudioAac,                 /**< reference: OMX_AUDIO_PARAM_AACPROFILETYPE */
+    OMX_IndexParamAudioRa,                  /**< reference: OMX_AUDIO_PARAM_RATYPE */
+    OMX_IndexParamAudioMp3,                 /**< reference: OMX_AUDIO_PARAM_MP3TYPE */
+    OMX_IndexParamAudioAdpcm,               /**< reference: OMX_AUDIO_PARAM_ADPCMTYPE */
+    OMX_IndexParamAudioG723,                /**< reference: OMX_AUDIO_PARAM_G723TYPE */
+    OMX_IndexParamAudioG729,                /**< reference: OMX_AUDIO_PARAM_G729TYPE */
+    OMX_IndexParamAudioAmr,                 /**< reference: OMX_AUDIO_PARAM_AMRTYPE */
+    OMX_IndexParamAudioWma,                 /**< reference: OMX_AUDIO_PARAM_WMATYPE */
+    OMX_IndexParamAudioSbc,                 /**< reference: OMX_AUDIO_PARAM_SBCTYPE */
+    OMX_IndexParamAudioMidi,                /**< reference: OMX_AUDIO_PARAM_MIDITYPE */
+    OMX_IndexParamAudioGsm_FR,              /**< reference: OMX_AUDIO_PARAM_GSMFRTYPE */
+    OMX_IndexParamAudioMidiLoadUserSound,   /**< reference: OMX_AUDIO_PARAM_MIDILOADUSERSOUNDTYPE */
+    OMX_IndexParamAudioG726,                /**< reference: OMX_AUDIO_PARAM_G726TYPE */
+    OMX_IndexParamAudioGsm_EFR,             /**< reference: OMX_AUDIO_PARAM_GSMEFRTYPE */
+    OMX_IndexParamAudioGsm_HR,              /**< reference: OMX_AUDIO_PARAM_GSMHRTYPE */
+    OMX_IndexParamAudioPdc_FR,              /**< reference: OMX_AUDIO_PARAM_PDCFRTYPE */
+    OMX_IndexParamAudioPdc_EFR,             /**< reference: OMX_AUDIO_PARAM_PDCEFRTYPE */
+    OMX_IndexParamAudioPdc_HR,              /**< reference: OMX_AUDIO_PARAM_PDCHRTYPE */
+    OMX_IndexParamAudioTdma_FR,             /**< reference: OMX_AUDIO_PARAM_TDMAFRTYPE */
+    OMX_IndexParamAudioTdma_EFR,            /**< reference: OMX_AUDIO_PARAM_TDMAEFRTYPE */
+    OMX_IndexParamAudioQcelp8,              /**< reference: OMX_AUDIO_PARAM_QCELP8TYPE */
+    OMX_IndexParamAudioQcelp13,             /**< reference: OMX_AUDIO_PARAM_QCELP13TYPE */
+    OMX_IndexParamAudioEvrc,                /**< reference: OMX_AUDIO_PARAM_EVRCTYPE */
+    OMX_IndexParamAudioSmv,                 /**< reference: OMX_AUDIO_PARAM_SMVTYPE */
+    OMX_IndexParamAudioVorbis,              /**< reference: OMX_AUDIO_PARAM_VORBISTYPE */
+
+    OMX_IndexConfigAudioMidiImmediateEvent, /**< reference: OMX_AUDIO_CONFIG_MIDIIMMEDIATEEVENTTYPE */
+    OMX_IndexConfigAudioMidiControl,        /**< reference: OMX_AUDIO_CONFIG_MIDICONTROLTYPE */
+    OMX_IndexConfigAudioMidiSoundBankProgram, /**< reference: OMX_AUDIO_CONFIG_MIDISOUNDBANKPROGRAMTYPE */
+    OMX_IndexConfigAudioMidiStatus,         /**< reference: OMX_AUDIO_CONFIG_MIDISTATUSTYPE */
+    OMX_IndexConfigAudioMidiMetaEvent,      /**< reference: OMX_AUDIO_CONFIG_MIDIMETAEVENTTYPE */
+    OMX_IndexConfigAudioMidiMetaEventData,  /**< reference: OMX_AUDIO_CONFIG_MIDIMETAEVENTDATATYPE */
+    OMX_IndexConfigAudioVolume,             /**< reference: OMX_AUDIO_CONFIG_VOLUMETYPE */
+    OMX_IndexConfigAudioBalance,            /**< reference: OMX_AUDIO_CONFIG_BALANCETYPE */
+    OMX_IndexConfigAudioChannelMute,        /**< reference: OMX_AUDIO_CONFIG_CHANNELMUTETYPE */
+    OMX_IndexConfigAudioMute,               /**< reference: OMX_AUDIO_CONFIG_MUTETYPE */
+    OMX_IndexConfigAudioLoudness,           /**< reference: OMX_AUDIO_CONFIG_LOUDNESSTYPE */
+    OMX_IndexConfigAudioEchoCancelation,    /**< reference: OMX_AUDIO_CONFIG_ECHOCANCELATIONTYPE */
+    OMX_IndexConfigAudioNoiseReduction,     /**< reference: OMX_AUDIO_CONFIG_NOISEREDUCTIONTYPE */
+    OMX_IndexConfigAudioBass,               /**< reference: OMX_AUDIO_CONFIG_BASSTYPE */
+    OMX_IndexConfigAudioTreble,             /**< reference: OMX_AUDIO_CONFIG_TREBLETYPE */
+    OMX_IndexConfigAudioStereoWidening,     /**< reference: OMX_AUDIO_CONFIG_STEREOWIDENINGTYPE */
+    OMX_IndexConfigAudioChorus,             /**< reference: OMX_AUDIO_CONFIG_CHORUSTYPE */
+    OMX_IndexConfigAudioEqualizer,          /**< reference: OMX_AUDIO_CONFIG_EQUALIZERTYPE */
+    OMX_IndexConfigAudioReverberation,      /**< reference: OMX_AUDIO_CONFIG_REVERBERATIONTYPE */
+    OMX_IndexConfigAudioChannelVolume,      /**< reference: OMX_AUDIO_CONFIG_CHANNELVOLUMETYPE */
+
+    /* Image specific parameters and configurations */
+    OMX_IndexImageStartUnused = 0x05000000,
+    OMX_IndexParamImagePortFormat,          /**< reference: OMX_IMAGE_PARAM_PORTFORMATTYPE */
+    OMX_IndexParamFlashControl,             /**< reference: OMX_IMAGE_PARAM_FLASHCONTROLTYPE */
+    OMX_IndexConfigFocusControl,            /**< reference: OMX_IMAGE_CONFIG_FOCUSCONTROLTYPE */
+    OMX_IndexParamQFactor,                  /**< reference: OMX_IMAGE_PARAM_QFACTORTYPE */
+    OMX_IndexParamQuantizationTable,        /**< reference: OMX_IMAGE_PARAM_QUANTIZATIONTABLETYPE */
+    OMX_IndexParamHuffmanTable,             /**< reference: OMX_IMAGE_PARAM_HUFFMANTTABLETYPE */
+    OMX_IndexConfigFlashControl,            /**< reference: OMX_IMAGE_PARAM_FLASHCONTROLTYPE */
+
+    /* Video specific parameters and configurations */
+    OMX_IndexVideoStartUnused = 0x06000000,
+    OMX_IndexParamVideoPortFormat,          /**< reference: OMX_VIDEO_PARAM_PORTFORMATTYPE */
+    OMX_IndexParamVideoQuantization,        /**< reference: OMX_VIDEO_PARAM_QUANTIZATIONTYPE */
+    OMX_IndexParamVideoFastUpdate,          /**< reference: OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE */
+    OMX_IndexParamVideoBitrate,             /**< reference: OMX_VIDEO_PARAM_BITRATETYPE */
+    OMX_IndexParamVideoMotionVector,        /**< reference: OMX_VIDEO_PARAM_MOTIONVECTORTYPE */
+    OMX_IndexParamVideoIntraRefresh,        /**< reference: OMX_VIDEO_PARAM_INTRAREFRESHTYPE */
+    OMX_IndexParamVideoErrorCorrection,     /**< reference: OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE */
+    OMX_IndexParamVideoVBSMC,               /**< reference: OMX_VIDEO_PARAM_VBSMCTYPE */
+    OMX_IndexParamVideoMpeg2,               /**< reference: OMX_VIDEO_PARAM_MPEG2TYPE */
+    OMX_IndexParamVideoMpeg4,               /**< reference: OMX_VIDEO_PARAM_MPEG4TYPE */
+    OMX_IndexParamVideoWmv,                 /**< reference: OMX_VIDEO_PARAM_WMVTYPE */
+    OMX_IndexParamVideoRv,                  /**< reference: OMX_VIDEO_PARAM_RVTYPE */
+    OMX_IndexParamVideoAvc,                 /**< reference: OMX_VIDEO_PARAM_AVCTYPE */
+    OMX_IndexParamVideoH263,                /**< reference: OMX_VIDEO_PARAM_H263TYPE */
+    OMX_IndexParamVideoProfileLevelQuerySupported, /**< reference: OMX_VIDEO_PARAM_PROFILELEVELTYPE */
+    OMX_IndexParamVideoProfileLevelCurrent, /**< reference: OMX_VIDEO_PARAM_PROFILELEVELTYPE */
+    OMX_IndexConfigVideoBitrate,            /**< reference: OMX_VIDEO_CONFIG_BITRATETYPE */
+    OMX_IndexConfigVideoFramerate,          /**< reference: OMX_CONFIG_FRAMERATETYPE */
+    OMX_IndexConfigVideoIntraVOPRefresh,    /**< reference: OMX_CONFIG_INTRAREFRESHVOPTYPE */
+    OMX_IndexConfigVideoIntraMBRefresh,     /**< reference: OMX_CONFIG_MACROBLOCKERRORMAPTYPE */
+    OMX_IndexConfigVideoMBErrorReporting,   /**< reference: OMX_CONFIG_MBERRORREPORTINGTYPE */
+    OMX_IndexParamVideoMacroblocksPerFrame, /**< reference: OMX_PARAM_MACROBLOCKSTYPE */
+    OMX_IndexConfigVideoMacroBlockErrorMap, /**< reference: OMX_CONFIG_MACROBLOCKERRORMAPTYPE */
+    OMX_IndexParamVideoSliceFMO,            /**< reference: OMX_VIDEO_PARAM_AVCSLICEFMO */
+    OMX_IndexConfigVideoAVCIntraPeriod,     /**< reference: OMX_VIDEO_CONFIG_AVCINTRAPERIOD */
+    OMX_IndexConfigVideoNalSize,            /**< reference: OMX_VIDEO_CONFIG_NALSIZE */
+
+    /* Image & Video common Configurations */
+    OMX_IndexCommonStartUnused = 0x07000000,
+    OMX_IndexParamCommonDeblocking,         /**< reference: OMX_PARAM_DEBLOCKINGTYPE */
+    OMX_IndexParamCommonSensorMode,         /**< reference: OMX_PARAM_SENSORMODETYPE */
+    OMX_IndexParamCommonInterleave,         /**< reference: OMX_PARAM_INTERLEAVETYPE */
+    OMX_IndexConfigCommonColorFormatConversion, /**< reference: OMX_CONFIG_COLORCONVERSIONTYPE */
+    OMX_IndexConfigCommonScale,             /**< reference: OMX_CONFIG_SCALEFACTORTYPE */
+    OMX_IndexConfigCommonImageFilter,       /**< reference: OMX_CONFIG_IMAGEFILTERTYPE */
+    OMX_IndexConfigCommonColorEnhancement,  /**< reference: OMX_CONFIG_COLORENHANCEMENTTYPE */
+    OMX_IndexConfigCommonColorKey,          /**< reference: OMX_CONFIG_COLORKEYTYPE */
+    OMX_IndexConfigCommonColorBlend,        /**< reference: OMX_CONFIG_COLORBLENDTYPE */
+    OMX_IndexConfigCommonFrameStabilisation,/**< reference: OMX_CONFIG_FRAMESTABTYPE */
+    OMX_IndexConfigCommonRotate,            /**< reference: OMX_CONFIG_ROTATIONTYPE */
+    OMX_IndexConfigCommonMirror,            /**< reference: OMX_CONFIG_MIRRORTYPE */
+    OMX_IndexConfigCommonOutputPosition,    /**< reference: OMX_CONFIG_POINTTYPE */
+    OMX_IndexConfigCommonInputCrop,         /**< reference: OMX_CONFIG_RECTTYPE */
+    OMX_IndexConfigCommonOutputCrop,        /**< reference: OMX_CONFIG_RECTTYPE */
+    OMX_IndexConfigCommonDigitalZoom,       /**< reference: OMX_CONFIG_SCALEFACTORTYPE */
+    OMX_IndexConfigCommonOpticalZoom,       /**< reference: OMX_CONFIG_SCALEFACTORTYPE*/
+    OMX_IndexConfigCommonWhiteBalance,      /**< reference: OMX_CONFIG_WHITEBALCONTROLTYPE */
+    OMX_IndexConfigCommonExposure,          /**< reference: OMX_CONFIG_EXPOSURECONTROLTYPE */
+    OMX_IndexConfigCommonContrast,          /**< reference: OMX_CONFIG_CONTRASTTYPE */
+    OMX_IndexConfigCommonBrightness,        /**< reference: OMX_CONFIG_BRIGHTNESSTYPE */
+    OMX_IndexConfigCommonBacklight,         /**< reference: OMX_CONFIG_BACKLIGHTTYPE */
+    OMX_IndexConfigCommonGamma,             /**< reference: OMX_CONFIG_GAMMATYPE */
+    OMX_IndexConfigCommonSaturation,        /**< reference: OMX_CONFIG_SATURATIONTYPE */
+    OMX_IndexConfigCommonLightness,         /**< reference: OMX_CONFIG_LIGHTNESSTYPE */
+    OMX_IndexConfigCommonExclusionRect,     /**< reference: OMX_CONFIG_RECTTYPE */
+    OMX_IndexConfigCommonDithering,         /**< reference: OMX_CONFIG_DITHERTYPE */
+    OMX_IndexConfigCommonPlaneBlend,        /**< reference: OMX_CONFIG_PLANEBLENDTYPE */
+    OMX_IndexConfigCommonExposureValue,     /**< reference: OMX_CONFIG_EXPOSUREVALUETYPE */
+    OMX_IndexConfigCommonOutputSize,        /**< reference: OMX_FRAMESIZETYPE */
+    OMX_IndexParamCommonExtraQuantData,     /**< reference: OMX_OTHER_EXTRADATATYPE */
+    OMX_IndexConfigCommonFocusRegion,       /**< reference: OMX_CONFIG_FOCUSREGIONTYPE */
+    OMX_IndexConfigCommonFocusStatus,       /**< reference: OMX_PARAM_FOCUSSTATUSTYPE */
+    OMX_IndexConfigCommonTransitionEffect,  /**< reference: OMX_CONFIG_TRANSITIONEFFECTTYPE */
+
+    /* Reserved Configuration range */
+    OMX_IndexOtherStartUnused = 0x08000000,
+    OMX_IndexParamOtherPortFormat,          /**< reference: OMX_OTHER_PARAM_PORTFORMATTYPE */
+    OMX_IndexConfigOtherPower,              /**< reference: OMX_OTHER_CONFIG_POWERTYPE */
+    OMX_IndexConfigOtherStats,              /**< reference: OMX_OTHER_CONFIG_STATSTYPE */
+
+
+    /* Reserved Time range */
+    OMX_IndexTimeStartUnused = 0x09000000,
+    OMX_IndexConfigTimeScale,               /**< reference: OMX_TIME_CONFIG_SCALETYPE */
+    OMX_IndexConfigTimeClockState,          /**< reference: OMX_TIME_CONFIG_CLOCKSTATETYPE */
+    OMX_IndexConfigTimeActiveRefClock,      /**< reference: OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE */
+    OMX_IndexConfigTimeCurrentMediaTime,    /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (read only) */
+    OMX_IndexConfigTimeCurrentWallTime,     /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (read only) */
+    OMX_IndexConfigTimeCurrentAudioReference, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (write only) */
+    OMX_IndexConfigTimeCurrentVideoReference, /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE (write only) */
+    OMX_IndexConfigTimeMediaTimeRequest,    /**< reference: OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE (write only) */
+    OMX_IndexConfigTimeClientStartTime,     /**<reference:  OMX_TIME_CONFIG_TIMESTAMPTYPE (write only) */
+    OMX_IndexConfigTimePosition,            /**< reference: OMX_TIME_CONFIG_TIMESTAMPTYPE */
+    OMX_IndexConfigTimeSeekMode,            /**< reference: OMX_TIME_CONFIG_SEEKMODETYPE */
+
+
+    OMX_IndexKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    /* Vendor specific area */
+    OMX_IndexVendorStartUnused = 0x7F000000,
+    /* Vendor specific structures should be in the range of 0x7F000000 
+       to 0x7FFFFFFE.  This range is not broken out by vendor, so
+       private indexes are not guaranteed unique and therefore should
+       only be sent to the appropriate component. */
+
+    OMX_IndexMax = 0x7FFFFFFF
+
+} OMX_INDEXTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/include/khronos/OMX_Other.h b/include/khronos/OMX_Other.h
new file mode 100644 (file)
index 0000000..caf7f38
--- /dev/null
@@ -0,0 +1,337 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** @file OMX_Other.h - OpenMax IL version 1.1.2
+ *  The structures needed by Other components to exchange
+ *  parameters and configuration data with the components.
+ */
+
+#ifndef OMX_Other_h
+#define OMX_Other_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/* Each OMX header must include all required header files to allow the
+ *  header to compile without errors.  The includes below are required
+ *  for this header file to compile successfully 
+ */
+
+#include <OMX_Core.h>
+
+
+/** 
+ * Enumeration of possible data types which match to multiple domains or no
+ * domain at all.  For types which are vendor specific, a value above
+ * OMX_OTHER_VENDORTSTART should be used.
+ */
+typedef enum OMX_OTHER_FORMATTYPE {
+    OMX_OTHER_FormatTime = 0, /**< Transmission of various timestamps, elapsed time, 
+                                   time deltas, etc */
+    OMX_OTHER_FormatPower,    /**< Perhaps used for enabling/disabling power 
+                                   management, setting clocks? */
+    OMX_OTHER_FormatStats,    /**< Could be things such as frame rate, frames 
+                                   dropped, etc */
+    OMX_OTHER_FormatBinary,   /**< Arbitrary binary data */
+    OMX_OTHER_FormatVendorReserved = 1000, /**< Starting value for vendor specific 
+                                                formats */
+
+    OMX_OTHER_FormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_OTHER_FormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_OTHER_FormatMax = 0x7FFFFFFF
+} OMX_OTHER_FORMATTYPE;
+
+/** 
+ * Enumeration of seek modes.
+ */
+typedef enum OMX_TIME_SEEKMODETYPE {
+    OMX_TIME_SeekModeFast = 0, /**< Prefer seeking to an approximation
+                                * of the requested seek position over   
+                                * the actual seek position if it
+                                * results in a faster seek. */
+    OMX_TIME_SeekModeAccurate, /**< Prefer seeking to the actual seek 
+                                * position over an approximation
+                                * of the requested seek position even
+                                * if it results in a slower seek. */
+    OMX_TIME_SeekModeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_TIME_SeekModeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_TIME_SeekModeMax = 0x7FFFFFFF
+} OMX_TIME_SEEKMODETYPE;
+
+/* Structure representing the seekmode of the component */
+typedef struct OMX_TIME_CONFIG_SEEKMODETYPE {
+    OMX_U32 nSize;                  /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;       /**< OMX specification version information */
+    OMX_TIME_SEEKMODETYPE eType;    /**< The seek mode */
+} OMX_TIME_CONFIG_SEEKMODETYPE;
+
+/** Structure representing a time stamp used with the following configs 
+ * on the Clock Component (CC):
+ * 
+ * OMX_IndexConfigTimeCurrentWallTime: query of the CC\92s current wall  
+ *     time
+ * OMX_IndexConfigTimeCurrentMediaTime: query of the CC\92s current media
+ *     time
+ * OMX_IndexConfigTimeCurrentAudioReference and  
+ * OMX_IndexConfigTimeCurrentVideoReference: audio/video reference 
+ *     clock sending SC its reference time
+ * OMX_IndexConfigTimeClientStartTime: a Clock Component client sends 
+ *     this structure to the Clock Component via a SetConfig on its 
+ *     client port when it receives a buffer with
+ *     OMX_BUFFERFLAG_STARTTIME set. It must use the timestamp
+ *     specified by that buffer for nStartTimestamp. 
+ *
+ * It\92s also used with the following config on components in general:
+ *
+ * OMX_IndexConfigTimePosition: IL client querying component position 
+ * (GetConfig) or commanding a component to seek to the given location
+ * (SetConfig)
+ */    
+typedef struct OMX_TIME_CONFIG_TIMESTAMPTYPE {
+    OMX_U32 nSize;               /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;    /**< OMX specification version
+                                  *   information */
+    OMX_U32 nPortIndex;     /**< port that this structure applies to */
+    OMX_TICKS nTimestamp;           /**< timestamp .*/ 
+} OMX_TIME_CONFIG_TIMESTAMPTYPE;  
+
+/** Enumeration of possible reference clocks to the media time. */
+typedef enum OMX_TIME_UPDATETYPE {
+      OMX_TIME_UpdateRequestFulfillment,    /**< Update is the fulfillment of a media time request. */
+      OMX_TIME_UpdateScaleChanged,             /**< Update was generated because the scale chagned. */
+      OMX_TIME_UpdateClockStateChanged,     /**< Update was generated because the clock state changed. */
+      OMX_TIME_UpdateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+      OMX_TIME_UpdateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+      OMX_TIME_UpdateMax = 0x7FFFFFFF
+} OMX_TIME_UPDATETYPE;
+
+/** Enumeration of possible reference clocks to the media time. */
+typedef enum OMX_TIME_REFCLOCKTYPE {
+      OMX_TIME_RefClockNone,    /**< Use no references. */
+      OMX_TIME_RefClockAudio,  /**< Use references sent through OMX_IndexConfigTimeCurrentAudioReference */
+      OMX_TIME_RefClockVideo,   /**< Use references sent through OMX_IndexConfigTimeCurrentVideoReference */
+      OMX_TIME_RefClockKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+      OMX_TIME_RefClockVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+      OMX_TIME_RefClockMax = 0x7FFFFFFF
+} OMX_TIME_REFCLOCKTYPE;
+
+/** Enumeration of clock states. */
+typedef enum OMX_TIME_CLOCKSTATE {
+      OMX_TIME_ClockStateRunning,             /**< Clock running. */
+      OMX_TIME_ClockStateWaitingForStartTime, /**< Clock waiting until the 
+                                               *   prescribed clients emit their
+                                               *   start time. */
+      OMX_TIME_ClockStateStopped,             /**< Clock stopped. */
+      OMX_TIME_ClockStateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+      OMX_TIME_ClockStateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+      OMX_TIME_ClockStateMax = 0x7FFFFFFF
+} OMX_TIME_CLOCKSTATE;
+
+/** Structure representing a media time request to the clock component.
+ *
+ *  A client component sends this structure to the Clock Component via a SetConfig
+ *  on its client port to specify a media timestamp the Clock Component
+ *  should emit.  The Clock Component should fulfill the request by sending a
+ *  OMX_TIME_MEDIATIMETYPE when its media clock matches the requested 
+ *  timestamp.
+ *
+ *  The client may require a media time request be fulfilled slightly
+ *  earlier than the media time specified. In this case the client specifies 
+ *  an offset which is equal to the difference between wall time corresponding 
+ *  to the requested media time and the wall time when it will be 
+ *  fulfilled. 
+ *
+ *  A client component may uses these requests and the OMX_TIME_MEDIATIMETYPE to
+ *  time events according to timestamps. If a client must perform an operation O at
+ *  a time T (e.g. deliver a video frame at its corresponding timestamp), it makes a 
+ *  media time request at T (perhaps specifying an offset to ensure the request fulfillment
+ *  is a little early). When the clock component passes the resulting OMX_TIME_MEDIATIMETYPE
+ *  structure back to the client component, the client may perform operation O (perhaps having
+ *  to wait a slight amount more time itself as specified by the return values).
+ */
+
+typedef struct OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version information */
+    OMX_U32 nPortIndex;         /**< port that this structure applies to */
+    OMX_PTR pClientPrivate;     /**< Client private data to disabiguate this media time 
+                                 *   from others (e.g. the number of the frame to deliver). 
+                                 *   Duplicated in the media time structure that fulfills 
+                                 *   this request. A value of zero is reserved for time scale 
+                                 *   updates. */
+    OMX_TICKS nMediaTimestamp;  /**< Media timestamp requested.*/ 
+    OMX_TICKS nOffset;          /**< Amount of wall clock time by which this
+                                 *   request should be fulfilled early */
+} OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE;
+
+/**< Structure sent from the clock component client either when fulfilling 
+ *   a media time request or when the time scale has changed. 
+ *
+ *   In the former case the Clock Component fills this structure and times its emission 
+ *   to a client component (via the client port) according to the corresponding media 
+ *   time request sent by the client. The Clock Component should time the emission to occur
+ *   when the requested timestamp matches the Clock Component's media time but also the 
+ *   prescribed offset early. 
+ *
+ *   Upon scale changes the clock component clears the nClientPrivate data, sends the current
+ *   media time and sets the nScale to the new scale via the client port. It emits a 
+ *   OMX_TIME_MEDIATIMETYPE to all clients independent of any requests. This allows clients to 
+ *   alter processing to accomodate scaling. For instance a video component might skip inter-frames 
+ *   in the case of extreme fastforward. Likewise an audio component might add or remove samples 
+ *   from an audio frame to scale audio data. 
+ *
+ *   It is expected that some clock components may not be able to fulfill requests
+ *   at exactly the prescribed time. This is acceptable so long as the request is 
+ *   fulfilled at least as early as described and not later. This structure provides 
+ *   fields the client may use to wait for the remaining time.
+ *
+ *   The client may use either the nOffset or nWallTimeAtMedia fields to determine the 
+ *   wall time until the nMediaTimestamp actually occurs. In the latter case the
+ *   client can get a more accurate value for offset by getting the current wall
+ *   from the cloc component and subtracting it from nWallTimeAtMedia. 
+ */
+
+typedef struct OMX_TIME_MEDIATIMETYPE {
+    OMX_U32 nSize;                  /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;       /**< OMX specification version information */
+    OMX_U32 nClientPrivate;         /**< Client private data to disabiguate this media time 
+                                     *   from others. Copied from the media time request. 
+                                     *   A value of zero is reserved for time scale updates. */
+    OMX_TIME_UPDATETYPE eUpdateType; /**< Reason for the update */
+    OMX_TICKS nMediaTimestamp;      /**< Media time requested. If no media time was 
+                                     *   requested then this is the current media time. */ 
+    OMX_TICKS nOffset;              /**< Amount of wall clock time by which this
+                                     *   request was actually fulfilled early */
+
+    OMX_TICKS nWallTimeAtMediaTime; /**< Wall time corresponding to nMediaTimeStamp.
+                                     *   A client may compare this value to current
+                                     *   media time obtained from the Clock Component to determine
+                                     *   the wall time until the media timestamp is really
+                                     *   current. */
+    OMX_S32 xScale;                 /**< Current media time scale in Q16 format. */
+    OMX_TIME_CLOCKSTATE eState;     /* Seeking Change. Added 7/12.*/
+                                    /**< State of the media time. */
+} OMX_TIME_MEDIATIMETYPE;  
+
+/** Structure representing the current media time scale factor. Applicable only to clock 
+ *  component, other components see scale changes via OMX_TIME_MEDIATIMETYPE buffers sent via
+ *  the clock component client ports. Upon recieving this config the clock component changes 
+ *  the rate by which the media time increases or decreases effectively implementing trick modes. 
+ */ 
+typedef struct OMX_TIME_CONFIG_SCALETYPE {
+    OMX_U32 nSize;                  /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;       /**< OMX specification version information */
+    OMX_S32 xScale;                 /**< This is a value in Q16 format which is used for
+                                     * scaling the media time */
+} OMX_TIME_CONFIG_SCALETYPE;
+/** Bits used to identify a clock port. Used in OMX_TIME_CONFIG_CLOCKSTATETYPE\92s nWaitMask field */
+#define OMX_CLOCKPORT0 0x00000001
+#define OMX_CLOCKPORT1 0x00000002
+#define OMX_CLOCKPORT2 0x00000004
+#define OMX_CLOCKPORT3 0x00000008
+#define OMX_CLOCKPORT4 0x00000010
+#define OMX_CLOCKPORT5 0x00000020
+#define OMX_CLOCKPORT6 0x00000040
+#define OMX_CLOCKPORT7 0x00000080
+
+/** Structure representing the current mode of the media clock. 
+ *  IL Client uses this config to change or query the mode of the 
+ *  media clock of the clock component. Applicable only to clock
+ *  component. 
+ *  
+ *  On a SetConfig if eState is OMX_TIME_ClockStateRunning media time
+ *  starts immediately at the prescribed start time. If
+ *  OMX_TIME_ClockStateWaitingForStartTime the Clock Component ignores
+ *  the given nStartTime and waits for all clients specified in the 
+ *  nWaitMask to send starttimes (via 
+ *  OMX_IndexConfigTimeClientStartTime). The Clock Component then starts 
+ *  the media clock using the earliest start time supplied. */    
+typedef struct OMX_TIME_CONFIG_CLOCKSTATETYPE {
+    OMX_U32 nSize;              /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;   /**< OMX specification version 
+                                 *   information */
+    OMX_TIME_CLOCKSTATE eState; /**< State of the media time. */
+    OMX_TICKS nStartTime;       /**< Start time of the media time. */
+    OMX_TICKS nOffset;          /**< Time to offset the media time by 
+                                 * (e.g. preroll). Media time will be
+                                 * reported to be nOffset ticks earlier.     
+                                 */
+    OMX_U32 nWaitMask;          /**< Mask of OMX_CLOCKPORT values. */
+} OMX_TIME_CONFIG_CLOCKSTATETYPE;
+
+/** Structure representing the reference clock currently being used to
+ *  compute media time. IL client uses this config to change or query the 
+ *  clock component's active reference clock */
+typedef struct OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE {
+    OMX_U32 nSize;                  /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion;       /**< OMX specification version information */
+    OMX_TIME_REFCLOCKTYPE eClock;   /**< Reference clock used to compute media time */                        
+} OMX_TIME_CONFIG_ACTIVEREFCLOCKTYPE;
+
+/** Descriptor for setting specifics of power type.
+ *  Note: this structure is listed for backwards compatibility. */
+typedef struct OMX_OTHER_CONFIG_POWERTYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_BOOL bEnablePM;       /**< Flag to enable Power Management */
+} OMX_OTHER_CONFIG_POWERTYPE;
+
+
+/** Descriptor for setting specifics of stats type.
+ *  Note: this structure is listed for backwards compatibility. */
+typedef struct OMX_OTHER_CONFIG_STATSTYPE {
+    OMX_U32 nSize;            /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    /* what goes here */
+} OMX_OTHER_CONFIG_STATSTYPE;
+
+
+/**
+ * The PortDefinition structure is used to define all of the parameters 
+ * necessary for the compliant component to setup an input or an output other 
+ * path.
+ */
+typedef struct OMX_OTHER_PORTDEFINITIONTYPE {
+    OMX_OTHER_FORMATTYPE eFormat;  /**< Type of data expected for this channel */
+} OMX_OTHER_PORTDEFINITIONTYPE;
+
+/**  Port format parameter.  This structure is used to enumerate
+  *  the various data input/output format supported by the port.
+  */
+typedef struct OMX_OTHER_PARAM_PORTFORMATTYPE {
+    OMX_U32 nSize; /**< size of the structure in bytes */
+    OMX_VERSIONTYPE nVersion; /**< OMX specification version information */
+    OMX_U32 nPortIndex; /**< Indicates which port to set */
+    OMX_U32 nIndex; /**< Indicates the enumeration index for the format from 0x0 to N-1 */
+    OMX_OTHER_FORMATTYPE eFormat; /**< Type of data expected for this channel */
+} OMX_OTHER_PARAM_PORTFORMATTYPE; 
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/include/khronos/OMX_Types.h b/include/khronos/OMX_Types.h
new file mode 100644 (file)
index 0000000..31be916
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** OMX_Types.h - OpenMax IL version 1.1.2
+ *  The OMX_Types header file contains the primitive type definitions used by 
+ *  the core, the application and the component.  This file may need to be
+ *  modified to be used on systems that do not have "char" set to 8 bits, 
+ *  "short" set to 16 bits and "long" set to 32 bits.
+ */
+
+#ifndef OMX_Types_h
+#define OMX_Types_h
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/** The OMX_API and OMX_APIENTRY are platform specific definitions used
+ *  to declare OMX function prototypes.  They are modified to meet the
+ *  requirements for a particular platform */
+#ifdef __SYMBIAN32__   
+#   ifdef __OMX_EXPORTS
+#       define OMX_API __declspec(dllexport)
+#   else
+#       ifdef _WIN32
+#           define OMX_API __declspec(dllexport) 
+#       else
+#           define OMX_API __declspec(dllimport)
+#       endif
+#   endif
+#else
+#   ifdef _WIN32
+#      ifdef __OMX_EXPORTS
+#          define OMX_API __declspec(dllexport)
+#      else
+#          define OMX_API __declspec(dllimport)
+#      endif
+#   else
+#      ifdef __OMX_EXPORTS
+#          define OMX_API
+#      else
+#          define OMX_API extern
+#      endif
+#   endif
+#endif
+
+#ifndef OMX_APIENTRY
+#define OMX_APIENTRY 
+#endif 
+
+/** OMX_IN is used to identify inputs to an OMX function.  This designation 
+    will also be used in the case of a pointer that points to a parameter 
+    that is used as an output. */
+#ifndef OMX_IN
+#define OMX_IN
+#endif
+
+/** OMX_OUT is used to identify outputs from an OMX function.  This 
+    designation will also be used in the case of a pointer that points 
+    to a parameter that is used as an input. */
+#ifndef OMX_OUT
+#define OMX_OUT
+#endif
+
+
+/** OMX_INOUT is used to identify parameters that may be either inputs or
+    outputs from an OMX function at the same time.  This designation will 
+    also be used in the case of a pointer that  points to a parameter that 
+    is used both as an input and an output. */
+#ifndef OMX_INOUT
+#define OMX_INOUT
+#endif
+
+/** OMX_ALL is used to as a wildcard to select all entities of the same type
+ *  when specifying the index, or referring to a object by an index.  (i.e.
+ *  use OMX_ALL to indicate all N channels). When used as a port index
+ *  for a config or parameter this OMX_ALL denotes that the config or
+ *  parameter applies to the entire component not just one port. */
+#define OMX_ALL 0xFFFFFFFF
+
+/** In the following we define groups that help building doxygen documentation */
+
+/** @defgroup core OpenMAX IL core
+ * Functions and structure related to the OMX IL core
+ */
+ /** @defgroup comp OpenMAX IL component
+ * Functions and structure related to the OMX IL component
+ */
+/** @defgroup rpm Resource and Policy Management 
+ * Structures for resource and policy management of components
+ */
+
+/** @defgroup buf Buffer Management
+ * Buffer handling functions and structures
+ */
+  
+/** @defgroup tun Tunneling
+ * @ingroup core comp
+ * Structures and functions to manage tunnels among component ports
+ */
+/** @defgroup cp Content Pipes
+ *  @ingroup core
+ */
+ /** @defgroup metadata Metadata handling
+  * 
+  */ 
+
+/** OMX_U8 is an 8 bit unsigned quantity that is byte aligned */
+typedef unsigned char OMX_U8;
+
+/** OMX_S8 is an 8 bit signed quantity that is byte aligned */
+typedef signed char OMX_S8;
+
+/** OMX_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */
+typedef unsigned short OMX_U16;
+
+/** OMX_S16 is a 16 bit signed quantity that is 16 bit word aligned */
+typedef signed short OMX_S16;
+
+/** OMX_U32 is a 32 bit unsigned quantity that is 32 bit word aligned */
+typedef unsigned long OMX_U32;
+
+/** OMX_S32 is a 32 bit signed quantity that is 32 bit word aligned */
+typedef signed long OMX_S32;
+
+
+/* Users with compilers that cannot accept the "long long" designation should
+   define the OMX_SKIP64BIT macro.  It should be noted that this may cause 
+   some components to fail to compile if the component was written to require
+   64 bit integral types.  However, these components would NOT compile anyway
+   since the compiler does not support the way the component was written.
+*/
+#ifndef OMX_SKIP64BIT
+#ifdef __SYMBIAN32__
+/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned long long OMX_U64;
+
+/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed long long OMX_S64;
+
+#elif defined(WIN32)
+
+/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */   
+typedef unsigned __int64  OMX_U64;
+
+/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed   __int64  OMX_S64;
+
+#else /* WIN32 */
+
+/** OMX_U64 is a 64 bit unsigned quantity that is 64 bit word aligned */
+typedef unsigned long long OMX_U64;
+
+/** OMX_S64 is a 64 bit signed quantity that is 64 bit word aligned */
+typedef signed long long OMX_S64;
+
+#endif /* WIN32 */
+#endif
+
+
+/** The OMX_BOOL type is intended to be used to represent a true or a false 
+    value when passing parameters to and from the OMX core and components.  The
+    OMX_BOOL is a 32 bit quantity and is aligned on a 32 bit word boundary.
+ */
+typedef enum OMX_BOOL {
+    OMX_FALSE = 0,
+    OMX_TRUE = !OMX_FALSE,
+    OMX_BOOL_MAX = 0x7FFFFFFF
+} OMX_BOOL; 
+/** The OMX_PTR type is intended to be used to pass pointers between the OMX
+    applications and the OMX Core and components.  This is a 32 bit pointer and
+    is aligned on a 32 bit boundary.
+ */
+typedef void* OMX_PTR;
+
+/** The OMX_STRING type is intended to be used to pass "C" type strings between
+    the application and the core and component.  The OMX_STRING type is a 32 
+    bit pointer to a zero terminated string.  The  pointer is word aligned and 
+    the string is byte aligned.  
+ */
+typedef char* OMX_STRING;
+
+/** The OMX_BYTE type is intended to be used to pass arrays of bytes such as
+    buffers between the application and the component and core.  The OMX_BYTE 
+    type is a 32 bit pointer to a zero terminated string.  The  pointer is word
+    aligned and the string is byte aligned.
+ */
+typedef unsigned char* OMX_BYTE;
+
+/** OMX_UUIDTYPE is a very long unique identifier to uniquely identify
+    at runtime.  This identifier should be generated by a component in a way
+    that guarantees that every instance of the identifier running on the system
+    is unique. */
+typedef unsigned char OMX_UUIDTYPE[128];
+
+/** The OMX_DIRTYPE enumeration is used to indicate if a port is an input or
+    an output port.  This enumeration is common across all component types.    
+ */
+typedef enum OMX_DIRTYPE
+{
+    OMX_DirInput,              /**< Port is an input port */
+    OMX_DirOutput,             /**< Port is an output port */
+    OMX_DirMax = 0x7FFFFFFF
+} OMX_DIRTYPE;
+
+/** The OMX_ENDIANTYPE enumeration is used to indicate the bit ordering 
+    for numerical data (i.e. big endian, or little endian).    
+ */
+typedef enum OMX_ENDIANTYPE
+{
+    OMX_EndianBig, /**< big endian */
+    OMX_EndianLittle, /**< little endian */
+    OMX_EndianMax = 0x7FFFFFFF
+} OMX_ENDIANTYPE;
+
+
+/** The OMX_NUMERICALDATATYPE enumeration is used to indicate if data 
+    is signed or unsigned
+ */
+typedef enum OMX_NUMERICALDATATYPE
+{
+    OMX_NumericalDataSigned, /**< signed data */
+    OMX_NumericalDataUnsigned, /**< unsigned data */
+    OMX_NumercialDataMax = 0x7FFFFFFF
+} OMX_NUMERICALDATATYPE;
+
+
+/** Unsigned bounded value type */
+typedef struct OMX_BU32 {
+    OMX_U32 nValue; /**< actual value */
+    OMX_U32 nMin;   /**< minimum for value (i.e. nValue >= nMin) */
+    OMX_U32 nMax;   /**< maximum for value (i.e. nValue <= nMax) */
+} OMX_BU32;
+
+
+/** Signed bounded value type */
+typedef struct OMX_BS32 {
+    OMX_S32 nValue; /**< actual value */
+    OMX_S32 nMin;   /**< minimum for value (i.e. nValue >= nMin) */
+    OMX_S32 nMax;   /**< maximum for value (i.e. nValue <= nMax) */
+} OMX_BS32;
+
+
+/** Structure representing some time or duration in microseconds. This structure
+  *  must be interpreted as a signed 64 bit value. The quantity is signed to accommodate 
+  *  negative deltas and preroll scenarios. The quantity is represented in microseconds 
+  *  to accomodate high resolution timestamps (e.g. DVD presentation timestamps based
+  *  on a 90kHz clock) and to allow more accurate and synchronized delivery (e.g. 
+  *  individual audio samples delivered at 192 kHz). The quantity is 64 bit to 
+  *  accommodate a large dynamic range (signed 32 bit values would allow only for plus
+  *  or minus 35 minutes).
+  *
+  *  Implementations with limited precision may convert the signed 64 bit value to 
+  *  a signed 32 bit value internally but risk loss of precision.  
+  */
+#ifndef OMX_SKIP64BIT
+typedef OMX_S64 OMX_TICKS;
+#else
+typedef struct OMX_TICKS
+{
+    OMX_U32 nLowPart;    /** low bits of the signed 64 bit tick value */
+    OMX_U32 nHighPart;   /** high bits of the signed 64 bit tick value */
+} OMX_TICKS;
+#endif
+#define OMX_TICKS_PER_SECOND 1000000
+
+/** Define the public interface for the OMX Handle.  The core will not use
+    this value internally, but the application should only use this value.
+ */
+typedef void* OMX_HANDLETYPE;
+
+typedef struct OMX_MARKTYPE
+{
+    OMX_HANDLETYPE hMarkTargetComponent;   /**< The component that will 
+                                                generate a mark event upon 
+                                                processing the mark. */
+    OMX_PTR pMarkData;   /**< Application specific data associated with 
+                              the mark sent on a mark event to disambiguate 
+                              this mark from others. */
+} OMX_MARKTYPE;
+
+
+/** OMX_NATIVE_DEVICETYPE is used to map a OMX video port to the
+ *  platform & operating specific object used to reference the display 
+ *  or can be used by a audio port for native audio rendering */
+typedef void* OMX_NATIVE_DEVICETYPE;
+
+/** OMX_NATIVE_WINDOWTYPE is used to map a OMX video port to the
+ *  platform & operating specific object used to reference the window */
+typedef void* OMX_NATIVE_WINDOWTYPE;
+
+/** The OMX_VERSIONTYPE union is used to specify the version for
+    a structure or component.  For a component, the version is entirely
+    specified by the component vendor.  Components doing the same function
+    from different vendors may or may not have the same version.  For 
+    structures, the version shall be set by the entity that allocates the
+    structure.  For structures specified in the OMX 1.1 specification, the
+    value of the version shall be set to 1.1.0.0 in all cases.  Access to the
+    OMX_VERSIONTYPE can be by a single 32 bit access (e.g. by nVersion) or
+    by accessing one of the structure elements to, for example, check only
+    the Major revision.
+ */
+typedef union OMX_VERSIONTYPE
+{
+    struct
+    {
+        OMX_U8 nVersionMajor;   /**< Major version accessor element */
+        OMX_U8 nVersionMinor;   /**< Minor version accessor element */
+        OMX_U8 nRevision;       /**< Revision version accessor element */
+        OMX_U8 nStep;           /**< Step version accessor element */
+    } s;
+    OMX_U32 nVersion;           /**< 32 bit value to make accessing the
+                                    version easily done in a single word
+                                    size copy/compare operation */
+} OMX_VERSIONTYPE;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
diff --git a/include/khronos/OMX_Video.h b/include/khronos/OMX_Video.h
new file mode 100644 (file)
index 0000000..163e450
--- /dev/null
@@ -0,0 +1,1060 @@
+/**
+ * Copyright (c) 2008 The Khronos Group Inc. 
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject
+ * to the following conditions: 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software. 
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ *
+ */
+
+/** 
+ *  @file OMX_Video.h - OpenMax IL version 1.1.2
+ *  The structures is needed by Video components to exchange parameters 
+ *  and configuration data with OMX components.
+ */
+#ifndef OMX_Video_h
+#define OMX_Video_h
+
+/** @defgroup video OpenMAX IL Video Domain
+ * @ingroup iv
+ * Structures for OpenMAX IL Video domain
+ * @{
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+
+/**
+ * Each OMX header must include all required header files to allow the
+ * header to compile without errors.  The includes below are required
+ * for this header file to compile successfully 
+ */
+
+#include <OMX_IVCommon.h>
+
+
+/**
+ * Enumeration used to define the possible video compression codings.  
+ * NOTE:  This essentially refers to file extensions. If the coding is 
+ *        being used to specify the ENCODE type, then additional work 
+ *        must be done to configure the exact flavor of the compression 
+ *        to be used.  For decode cases where the user application can 
+ *        not differentiate between MPEG-4 and H.264 bit streams, it is 
+ *        up to the codec to handle this.
+ */
+typedef enum OMX_VIDEO_CODINGTYPE {
+    OMX_VIDEO_CodingUnused,     /**< Value when coding is N/A */
+    OMX_VIDEO_CodingAutoDetect, /**< Autodetection of coding type */
+    OMX_VIDEO_CodingMPEG2,      /**< AKA: H.262 */
+    OMX_VIDEO_CodingH263,       /**< H.263 */
+    OMX_VIDEO_CodingMPEG4,      /**< MPEG-4 */
+    OMX_VIDEO_CodingWMV,        /**< all versions of Windows Media Video */
+    OMX_VIDEO_CodingRV,         /**< all versions of Real Video */
+    OMX_VIDEO_CodingAVC,        /**< H.264/AVC */
+    OMX_VIDEO_CodingMJPEG,      /**< Motion JPEG */
+    OMX_VIDEO_CodingKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_CodingVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_CodingMax = 0x7FFFFFFF
+} OMX_VIDEO_CODINGTYPE;
+
+
+/**
+ * Data structure used to define a video path.  The number of Video paths for 
+ * input and output will vary by type of the Video component.  
+ * 
+ *    Input (aka Source) : zero Inputs, one Output,
+ *    Splitter           : one Input, 2 or more Outputs,
+ *    Processing Element : one Input, one output,
+ *    Mixer              : 2 or more inputs, one output,
+ *    Output (aka Sink)  : one Input, zero outputs.
+ * 
+ * The PortDefinition structure is used to define all of the parameters 
+ * necessary for the compliant component to setup an input or an output video 
+ * path.  If additional vendor specific data is required, it should be 
+ * transmitted to the component using the CustomCommand function.  Compliant 
+ * components will prepopulate this structure with optimal values during the 
+ * GetDefaultInitParams command.
+ *
+ * STRUCT MEMBERS:
+ *  cMIMEType             : MIME type of data for the port
+ *  pNativeRender         : Platform specific reference for a display if a 
+ *                          sync, otherwise this field is 0
+ *  nFrameWidth           : Width of frame to be used on channel if 
+ *                          uncompressed format is used.  Use 0 for unknown,
+ *                          don't care or variable
+ *  nFrameHeight          : Height of frame to be used on channel if 
+ *                          uncompressed format is used. Use 0 for unknown,
+ *                          don't care or variable
+ *  nStride               : Number of bytes per span of an image 
+ *                          (i.e. indicates the number of bytes to get
+ *                          from span N to span N+1, where negative stride
+ *                          indicates the image is bottom up
+ *  nSliceHeight          : Height used when encoding in slices
+ *  nBitrate              : Bit rate of frame to be used on channel if 
+ *                          compressed format is used. Use 0 for unknown, 
+ *                          don't care or variable
+ *  xFramerate            : Frame rate to be used on channel if uncompressed 
+ *                          format is used. Use 0 for unknown, don't care or 
+ *                          variable.  Units are Q16 frames per second.
+ *  bFlagErrorConcealment : Turns on error concealment if it is supported by 
+ *                          the OMX component
+ *  eCompressionFormat    : Compression format used in this instance of the 
+ *                          component. When OMX_VIDEO_CodingUnused is 
+ *                          specified, eColorFormat is used
+ *  eColorFormat : Decompressed format used by this component
+ *  pNativeWindow : Platform specific reference for a window object if a 
+ *                          display sink , otherwise this field is 0x0. 
+ */
+typedef struct OMX_VIDEO_PORTDEFINITIONTYPE {
+    OMX_STRING cMIMEType;
+    OMX_NATIVE_DEVICETYPE pNativeRender;
+    OMX_U32 nFrameWidth;
+    OMX_U32 nFrameHeight;
+    OMX_S32 nStride;
+    OMX_U32 nSliceHeight;
+    OMX_U32 nBitrate;
+    OMX_U32 xFramerate;
+    OMX_BOOL bFlagErrorConcealment;
+    OMX_VIDEO_CODINGTYPE eCompressionFormat;
+    OMX_COLOR_FORMATTYPE eColorFormat;
+    OMX_NATIVE_WINDOWTYPE pNativeWindow;
+} OMX_VIDEO_PORTDEFINITIONTYPE;
+
+/**  
+ * Port format parameter.  This structure is used to enumerate the various 
+ * data input/output format supported by the port.
+ * 
+ * STRUCT MEMBERS:
+ *  nSize              : Size of the structure in bytes
+ *  nVersion           : OMX specification version information
+ *  nPortIndex         : Indicates which port to set
+ *  nIndex             : Indicates the enumeration index for the format from 
+ *                       0x0 to N-1
+ *  eCompressionFormat : Compression format used in this instance of the 
+ *                       component. When OMX_VIDEO_CodingUnused is specified, 
+ *                       eColorFormat is used 
+ *  eColorFormat       : Decompressed format used by this component
+ *  xFrameRate         : Indicates the video frame rate in Q16 format
+ */
+typedef struct OMX_VIDEO_PARAM_PORTFORMATTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nIndex;
+    OMX_VIDEO_CODINGTYPE eCompressionFormat; 
+    OMX_COLOR_FORMATTYPE eColorFormat;
+    OMX_U32 xFramerate;
+} OMX_VIDEO_PARAM_PORTFORMATTYPE;
+
+
+/**
+ * This is a structure for configuring video compression quantization 
+ * parameter values.  Codecs may support different QP values for different
+ * frame types.
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version info
+ *  nPortIndex : Port that this structure applies to
+ *  nQpI       : QP value to use for index frames
+ *  nQpP       : QP value to use for P frames
+ *  nQpB       : QP values to use for bidirectional frames 
+ */
+typedef struct OMX_VIDEO_PARAM_QUANTIZATIONTYPE {
+    OMX_U32 nSize;            
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nQpI;
+    OMX_U32 nQpP;
+    OMX_U32 nQpB;
+} OMX_VIDEO_PARAM_QUANTIZATIONTYPE;
+
+
+/** 
+ * Structure for configuration of video fast update parameters. 
+ *  
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version info 
+ *  nPortIndex : Port that this structure applies to
+ *  bEnableVFU : Enable/Disable video fast update
+ *  nFirstGOB  : Specifies the number of the first macroblock row
+ *  nFirstMB   : specifies the first MB relative to the specified first GOB
+ *  nNumMBs    : Specifies the number of MBs to be refreshed from nFirstGOB 
+ *               and nFirstMB
+ */
+typedef struct OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE {
+    OMX_U32 nSize;            
+    OMX_VERSIONTYPE nVersion; 
+    OMX_U32 nPortIndex;       
+    OMX_BOOL bEnableVFU;      
+    OMX_U32 nFirstGOB;                            
+    OMX_U32 nFirstMB;                            
+    OMX_U32 nNumMBs;                                  
+} OMX_VIDEO_PARAM_VIDEOFASTUPDATETYPE;
+
+
+/** 
+ * Enumeration of possible bitrate control types 
+ */
+typedef enum OMX_VIDEO_CONTROLRATETYPE {
+    OMX_Video_ControlRateDisable,
+    OMX_Video_ControlRateVariable,
+    OMX_Video_ControlRateConstant,
+    OMX_Video_ControlRateVariableSkipFrames,
+    OMX_Video_ControlRateConstantSkipFrames,
+    OMX_Video_ControlRateKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_Video_ControlRateVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_Video_ControlRateMax = 0x7FFFFFFF
+} OMX_VIDEO_CONTROLRATETYPE;
+
+
+/** 
+ * Structure for configuring bitrate mode of a codec. 
+ *
+ * STRUCT MEMBERS:
+ *  nSize          : Size of the struct in bytes
+ *  nVersion       : OMX spec version info
+ *  nPortIndex     : Port that this struct applies to
+ *  eControlRate   : Control rate type enum
+ *  nTargetBitrate : Target bitrate to encode with
+ */
+typedef struct OMX_VIDEO_PARAM_BITRATETYPE {
+    OMX_U32 nSize;                          
+    OMX_VERSIONTYPE nVersion;               
+    OMX_U32 nPortIndex;                     
+    OMX_VIDEO_CONTROLRATETYPE eControlRate; 
+    OMX_U32 nTargetBitrate;                 
+} OMX_VIDEO_PARAM_BITRATETYPE;
+
+
+/** 
+ * Enumeration of possible motion vector (MV) types 
+ */
+typedef enum OMX_VIDEO_MOTIONVECTORTYPE {
+    OMX_Video_MotionVectorPixel,
+    OMX_Video_MotionVectorHalfPel,
+    OMX_Video_MotionVectorQuarterPel,
+    OMX_Video_MotionVectorEighthPel,
+    OMX_Video_MotionVectorKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_Video_MotionVectorVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_Video_MotionVectorMax = 0x7FFFFFFF
+} OMX_VIDEO_MOTIONVECTORTYPE;
+
+
+/**
+ * Structure for configuring the number of motion vectors used as well
+ * as their accuracy.
+ * 
+ * STRUCT MEMBERS:
+ *  nSize            : Size of the struct in bytes
+ *  nVersion         : OMX spec version info
+ *  nPortIndex       : port that this structure applies to
+ *  eAccuracy        : Enumerated MV accuracy
+ *  bUnrestrictedMVs : Allow unrestricted MVs
+ *  bFourMV          : Allow use of 4 MVs
+ *  sXSearchRange    : Search range in horizontal direction for MVs
+ *  sYSearchRange    : Search range in vertical direction for MVs
+ */
+typedef struct OMX_VIDEO_PARAM_MOTIONVECTORTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_VIDEO_MOTIONVECTORTYPE eAccuracy;
+    OMX_BOOL bUnrestrictedMVs;
+    OMX_BOOL bFourMV;
+    OMX_S32 sXSearchRange;
+    OMX_S32 sYSearchRange;
+} OMX_VIDEO_PARAM_MOTIONVECTORTYPE;
+
+
+/** 
+ * Enumeration of possible methods to use for Intra Refresh 
+ */
+typedef enum OMX_VIDEO_INTRAREFRESHTYPE {
+    OMX_VIDEO_IntraRefreshCyclic,
+    OMX_VIDEO_IntraRefreshAdaptive,
+    OMX_VIDEO_IntraRefreshBoth,
+    OMX_VIDEO_IntraRefreshKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_IntraRefreshVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_IntraRefreshMax = 0x7FFFFFFF
+} OMX_VIDEO_INTRAREFRESHTYPE;
+
+
+/**
+ * Structure for configuring intra refresh mode 
+ * 
+ * STRUCT MEMBERS:
+ *  nSize        : Size of the structure in bytes
+ *  nVersion     : OMX specification version information
+ *  nPortIndex   : Port that this structure applies to
+ *  eRefreshMode : Cyclic, Adaptive, or Both
+ *  nAirMBs      : Number of intra macroblocks to refresh in a frame when 
+ *                 AIR is enabled
+ *  nAirRef      : Number of times a motion marked macroblock has to be  
+ *                 intra coded
+ *  nCirMBs      : Number of consecutive macroblocks to be coded as "intra"  
+ *                 when CIR is enabled
+ */
+typedef struct OMX_VIDEO_PARAM_INTRAREFRESHTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_VIDEO_INTRAREFRESHTYPE eRefreshMode;
+    OMX_U32 nAirMBs;
+    OMX_U32 nAirRef;
+    OMX_U32 nCirMBs;
+} OMX_VIDEO_PARAM_INTRAREFRESHTYPE;
+
+
+/**
+ * Structure for enabling various error correction methods for video 
+ * compression.
+ *
+ * STRUCT MEMBERS:
+ *  nSize                   : Size of the structure in bytes
+ *  nVersion                : OMX specification version information 
+ *  nPortIndex              : Port that this structure applies to 
+ *  bEnableHEC              : Enable/disable header extension codes (HEC)
+ *  bEnableResync           : Enable/disable resynchronization markers
+ *  nResynchMarkerSpacing   : Resynch markers interval (in bits) to be 
+ *                            applied in the stream 
+ *  bEnableDataPartitioning : Enable/disable data partitioning 
+ *  bEnableRVLC             : Enable/disable reversible variable length 
+ *                            coding
+ */
+typedef struct OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bEnableHEC;
+    OMX_BOOL bEnableResync;
+    OMX_U32  nResynchMarkerSpacing;
+    OMX_BOOL bEnableDataPartitioning;
+    OMX_BOOL bEnableRVLC;
+} OMX_VIDEO_PARAM_ERRORCORRECTIONTYPE;
+
+
+/** 
+ * Configuration of variable block-size motion compensation (VBSMC) 
+ * 
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information 
+ *  nPortIndex : Port that this structure applies to
+ *  b16x16     : Enable inter block search 16x16
+ *  b16x8      : Enable inter block search 16x8
+ *  b8x16      : Enable inter block search 8x16
+ *  b8x8       : Enable inter block search 8x8
+ *  b8x4       : Enable inter block search 8x4
+ *  b4x8       : Enable inter block search 4x8
+ *  b4x4       : Enable inter block search 4x4
+ */
+typedef struct OMX_VIDEO_PARAM_VBSMCTYPE {
+    OMX_U32 nSize; 
+    OMX_VERSIONTYPE nVersion; 
+    OMX_U32 nPortIndex;       
+    OMX_BOOL b16x16; 
+    OMX_BOOL b16x8; 
+    OMX_BOOL b8x16;
+    OMX_BOOL b8x8;
+    OMX_BOOL b8x4;
+    OMX_BOOL b4x8;
+    OMX_BOOL b4x4;
+} OMX_VIDEO_PARAM_VBSMCTYPE;
+
+
+/** 
+ * H.263 profile types, each profile indicates support for various 
+ * performance bounds and different annexes.
+ *
+ * ENUMS:
+ *  Baseline           : Baseline Profile: H.263 (V1), no optional modes                                                    
+ *  H320 Coding        : H.320 Coding Efficiency Backward Compatibility 
+ *                       Profile: H.263+ (V2), includes annexes I, J, L.4
+ *                       and T
+ *  BackwardCompatible : Backward Compatibility Profile: H.263 (V1), 
+ *                       includes annex F                                    
+ *  ISWV2              : Interactive Streaming Wireless Profile: H.263+ 
+ *                       (V2), includes annexes I, J, K and T                 
+ *  ISWV3              : Interactive Streaming Wireless Profile: H.263++  
+ *                       (V3), includes profile 3 and annexes V and W.6.3.8   
+ *  HighCompression    : Conversational High Compression Profile: H.263++  
+ *                       (V3), includes profiles 1 & 2 and annexes D and U   
+ *  Internet           : Conversational Internet Profile: H.263++ (V3),  
+ *                       includes profile 5 and annex K                       
+ *  Interlace          : Conversational Interlace Profile: H.263++ (V3),  
+ *                       includes profile 5 and annex W.6.3.11               
+ *  HighLatency        : High Latency Profile: H.263++ (V3), includes  
+ *                       profile 6 and annexes O.1 and P.5                       
+ */
+typedef enum OMX_VIDEO_H263PROFILETYPE {
+    OMX_VIDEO_H263ProfileBaseline            = 0x01,        
+    OMX_VIDEO_H263ProfileH320Coding          = 0x02,          
+    OMX_VIDEO_H263ProfileBackwardCompatible  = 0x04,  
+    OMX_VIDEO_H263ProfileISWV2               = 0x08,               
+    OMX_VIDEO_H263ProfileISWV3               = 0x10,               
+    OMX_VIDEO_H263ProfileHighCompression     = 0x20,     
+    OMX_VIDEO_H263ProfileInternet            = 0x40,            
+    OMX_VIDEO_H263ProfileInterlace           = 0x80,           
+    OMX_VIDEO_H263ProfileHighLatency         = 0x100,         
+    OMX_VIDEO_H263ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_H263ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_H263ProfileMax                 = 0x7FFFFFFF  
+} OMX_VIDEO_H263PROFILETYPE;
+
+
+/** 
+ * H.263 level types, each level indicates support for various frame sizes, 
+ * bit rates, decoder frame rates.
+ */
+typedef enum OMX_VIDEO_H263LEVELTYPE {
+    OMX_VIDEO_H263Level10  = 0x01,  
+    OMX_VIDEO_H263Level20  = 0x02,      
+    OMX_VIDEO_H263Level30  = 0x04,      
+    OMX_VIDEO_H263Level40  = 0x08,      
+    OMX_VIDEO_H263Level45  = 0x10,      
+    OMX_VIDEO_H263Level50  = 0x20,      
+    OMX_VIDEO_H263Level60  = 0x40,      
+    OMX_VIDEO_H263Level70  = 0x80, 
+    OMX_VIDEO_H263LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_H263LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_H263LevelMax = 0x7FFFFFFF  
+} OMX_VIDEO_H263LEVELTYPE;
+
+
+/** 
+ * Specifies the picture type. These values should be OR'd to signal all 
+ * pictures types which are allowed.
+ *
+ * ENUMS:
+ *  Generic Picture Types:          I, P and B
+ *  H.263 Specific Picture Types:   SI and SP
+ *  H.264 Specific Picture Types:   EI and EP
+ *  MPEG-4 Specific Picture Types:  S
+ */
+typedef enum OMX_VIDEO_PICTURETYPE {
+    OMX_VIDEO_PictureTypeI   = 0x01,
+    OMX_VIDEO_PictureTypeP   = 0x02,
+    OMX_VIDEO_PictureTypeB   = 0x04,
+    OMX_VIDEO_PictureTypeSI  = 0x08,
+    OMX_VIDEO_PictureTypeSP  = 0x10,
+    OMX_VIDEO_PictureTypeEI  = 0x11,
+    OMX_VIDEO_PictureTypeEP  = 0x12,
+    OMX_VIDEO_PictureTypeS   = 0x14,
+    OMX_VIDEO_PictureTypeKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_PictureTypeVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_PictureTypeMax = 0x7FFFFFFF
+} OMX_VIDEO_PICTURETYPE;
+
+
+/** 
+ * H.263 Params 
+ *
+ * STRUCT MEMBERS:
+ *  nSize                    : Size of the structure in bytes
+ *  nVersion                 : OMX specification version information 
+ *  nPortIndex               : Port that this structure applies to
+ *  nPFrames                 : Number of P frames between each I frame
+ *  nBFrames                 : Number of B frames between each I frame
+ *  eProfile                 : H.263 profile(s) to use
+ *  eLevel                   : H.263 level(s) to use
+ *  bPLUSPTYPEAllowed        : Indicating that it is allowed to use PLUSPTYPE 
+ *                             (specified in the 1998 version of H.263) to 
+ *                             indicate custom picture sizes or clock 
+ *                             frequencies 
+ *  nAllowedPictureTypes     : Specifies the picture types allowed in the 
+ *                             bitstream
+ *  bForceRoundingTypeToZero : value of the RTYPE bit (bit 6 of MPPTYPE) is 
+ *                             not constrained. It is recommended to change 
+ *                             the value of the RTYPE bit for each reference 
+ *                             picture in error-free communication
+ *  nPictureHeaderRepetition : Specifies the frequency of picture header 
+ *                             repetition
+ *  nGOBHeaderInterval       : Specifies the interval of non-empty GOB  
+ *                             headers in units of GOBs
+ */
+typedef struct OMX_VIDEO_PARAM_H263TYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nPFrames;
+    OMX_U32 nBFrames;
+    OMX_VIDEO_H263PROFILETYPE eProfile;
+       OMX_VIDEO_H263LEVELTYPE eLevel;
+    OMX_BOOL bPLUSPTYPEAllowed;
+    OMX_U32 nAllowedPictureTypes;
+    OMX_BOOL bForceRoundingTypeToZero;
+    OMX_U32 nPictureHeaderRepetition;
+    OMX_U32 nGOBHeaderInterval;
+} OMX_VIDEO_PARAM_H263TYPE;
+
+
+/** 
+ * MPEG-2 profile types, each profile indicates support for various 
+ * performance bounds and different annexes.
+ */
+typedef enum OMX_VIDEO_MPEG2PROFILETYPE {
+    OMX_VIDEO_MPEG2ProfileSimple = 0,  /**< Simple Profile */
+    OMX_VIDEO_MPEG2ProfileMain,        /**< Main Profile */
+    OMX_VIDEO_MPEG2Profile422,         /**< 4:2:2 Profile */
+    OMX_VIDEO_MPEG2ProfileSNR,         /**< SNR Profile */
+    OMX_VIDEO_MPEG2ProfileSpatial,     /**< Spatial Profile */
+    OMX_VIDEO_MPEG2ProfileHigh,        /**< High Profile */
+    OMX_VIDEO_MPEG2ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_MPEG2ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_MPEG2ProfileMax = 0x7FFFFFFF  
+} OMX_VIDEO_MPEG2PROFILETYPE;
+
+
+/** 
+ * MPEG-2 level types, each level indicates support for various frame 
+ * sizes, bit rates, decoder frame rates.  No need 
+ */
+typedef enum OMX_VIDEO_MPEG2LEVELTYPE {
+    OMX_VIDEO_MPEG2LevelLL = 0,  /**< Low Level */ 
+    OMX_VIDEO_MPEG2LevelML,      /**< Main Level */ 
+    OMX_VIDEO_MPEG2LevelH14,     /**< High 1440 */ 
+    OMX_VIDEO_MPEG2LevelHL,      /**< High Level */   
+    OMX_VIDEO_MPEG2LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_MPEG2LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_MPEG2LevelMax = 0x7FFFFFFF  
+} OMX_VIDEO_MPEG2LEVELTYPE;
+
+
+/** 
+ * MPEG-2 params 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to
+ *  nPFrames   : Number of P frames between each I frame
+ *  nBFrames   : Number of B frames between each I frame
+ *  eProfile   : MPEG-2 profile(s) to use
+ *  eLevel     : MPEG-2 levels(s) to use
+ */
+typedef struct OMX_VIDEO_PARAM_MPEG2TYPE {
+    OMX_U32 nSize;           
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;      
+    OMX_U32 nPFrames;        
+    OMX_U32 nBFrames;        
+    OMX_VIDEO_MPEG2PROFILETYPE eProfile;
+       OMX_VIDEO_MPEG2LEVELTYPE eLevel;   
+} OMX_VIDEO_PARAM_MPEG2TYPE;
+
+
+/** 
+ * MPEG-4 profile types, each profile indicates support for various 
+ * performance bounds and different annexes.
+ * 
+ * ENUMS:
+ *  - Simple Profile, Levels 1-3
+ *  - Simple Scalable Profile, Levels 1-2
+ *  - Core Profile, Levels 1-2
+ *  - Main Profile, Levels 2-4
+ *  - N-bit Profile, Level 2
+ *  - Scalable Texture Profile, Level 1
+ *  - Simple Face Animation Profile, Levels 1-2
+ *  - Simple Face and Body Animation (FBA) Profile, Levels 1-2
+ *  - Basic Animated Texture Profile, Levels 1-2
+ *  - Hybrid Profile, Levels 1-2
+ *  - Advanced Real Time Simple Profiles, Levels 1-4
+ *  - Core Scalable Profile, Levels 1-3
+ *  - Advanced Coding Efficiency Profile, Levels 1-4
+ *  - Advanced Core Profile, Levels 1-2
+ *  - Advanced Scalable Texture, Levels 2-3
+ */
+typedef enum OMX_VIDEO_MPEG4PROFILETYPE {
+    OMX_VIDEO_MPEG4ProfileSimple           = 0x01,        
+    OMX_VIDEO_MPEG4ProfileSimpleScalable   = 0x02,    
+    OMX_VIDEO_MPEG4ProfileCore             = 0x04,              
+    OMX_VIDEO_MPEG4ProfileMain             = 0x08,             
+    OMX_VIDEO_MPEG4ProfileNbit             = 0x10,              
+    OMX_VIDEO_MPEG4ProfileScalableTexture  = 0x20,   
+    OMX_VIDEO_MPEG4ProfileSimpleFace       = 0x40,        
+    OMX_VIDEO_MPEG4ProfileSimpleFBA        = 0x80,         
+    OMX_VIDEO_MPEG4ProfileBasicAnimated    = 0x100,     
+    OMX_VIDEO_MPEG4ProfileHybrid           = 0x200,            
+    OMX_VIDEO_MPEG4ProfileAdvancedRealTime = 0x400,  
+    OMX_VIDEO_MPEG4ProfileCoreScalable     = 0x800,      
+    OMX_VIDEO_MPEG4ProfileAdvancedCoding   = 0x1000,    
+    OMX_VIDEO_MPEG4ProfileAdvancedCore     = 0x2000,      
+    OMX_VIDEO_MPEG4ProfileAdvancedScalable = 0x4000,
+    OMX_VIDEO_MPEG4ProfileAdvancedSimple   = 0x8000,
+    OMX_VIDEO_MPEG4ProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_MPEG4ProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_MPEG4ProfileMax              = 0x7FFFFFFF  
+} OMX_VIDEO_MPEG4PROFILETYPE;
+
+
+/** 
+ * MPEG-4 level types, each level indicates support for various frame 
+ * sizes, bit rates, decoder frame rates.  No need 
+ */
+typedef enum OMX_VIDEO_MPEG4LEVELTYPE {
+    OMX_VIDEO_MPEG4Level0  = 0x01,   /**< Level 0 */   
+    OMX_VIDEO_MPEG4Level0b = 0x02,   /**< Level 0b */   
+    OMX_VIDEO_MPEG4Level1  = 0x04,   /**< Level 1 */ 
+    OMX_VIDEO_MPEG4Level2  = 0x08,   /**< Level 2 */ 
+    OMX_VIDEO_MPEG4Level3  = 0x10,   /**< Level 3 */ 
+    OMX_VIDEO_MPEG4Level4  = 0x20,   /**< Level 4 */  
+    OMX_VIDEO_MPEG4Level4a = 0x40,   /**< Level 4a */  
+    OMX_VIDEO_MPEG4Level5  = 0x80,   /**< Level 5 */  
+    OMX_VIDEO_MPEG4LevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_MPEG4LevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_MPEG4LevelMax = 0x7FFFFFFF  
+} OMX_VIDEO_MPEG4LEVELTYPE;
+
+
+/** 
+ * MPEG-4 configuration.  This structure handles configuration options
+ * which are specific to MPEG4 algorithms
+ *
+ * STRUCT MEMBERS:
+ *  nSize                : Size of the structure in bytes
+ *  nVersion             : OMX specification version information
+ *  nPortIndex           : Port that this structure applies to
+ *  nSliceHeaderSpacing  : Number of macroblocks between slice header (H263+ 
+ *                         Annex K). Put zero if not used
+ *  bSVH                 : Enable Short Video Header mode
+ *  bGov                 : Flag to enable GOV
+ *  nPFrames             : Number of P frames between each I frame (also called 
+ *                         GOV period)
+ *  nBFrames             : Number of B frames between each I frame
+ *  nIDCVLCThreshold     : Value of intra DC VLC threshold
+ *  bACPred              : Flag to use ac prediction
+ *  nMaxPacketSize       : Maximum size of packet in bytes.
+ *  nTimeIncRes          : Used to pass VOP time increment resolution for MPEG4. 
+ *                         Interpreted as described in MPEG4 standard.
+ *  eProfile             : MPEG-4 profile(s) to use.
+ *  eLevel               : MPEG-4 level(s) to use.
+ *  nAllowedPictureTypes : Specifies the picture types allowed in the bitstream
+ *  nHeaderExtension     : Specifies the number of consecutive video packet
+ *                         headers within a VOP
+ *  bReversibleVLC       : Specifies whether reversible variable length coding 
+ *                         is in use
+ */
+typedef struct OMX_VIDEO_PARAM_MPEG4TYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nSliceHeaderSpacing;
+    OMX_BOOL bSVH;
+    OMX_BOOL bGov;
+    OMX_U32 nPFrames;
+    OMX_U32 nBFrames;
+    OMX_U32 nIDCVLCThreshold;
+    OMX_BOOL bACPred;
+    OMX_U32 nMaxPacketSize;
+    OMX_U32 nTimeIncRes;
+    OMX_VIDEO_MPEG4PROFILETYPE eProfile;
+    OMX_VIDEO_MPEG4LEVELTYPE eLevel;
+    OMX_U32 nAllowedPictureTypes;
+    OMX_U32 nHeaderExtension;
+    OMX_BOOL bReversibleVLC;
+} OMX_VIDEO_PARAM_MPEG4TYPE;
+
+
+/** 
+ * WMV Versions 
+ */
+typedef enum OMX_VIDEO_WMVFORMATTYPE {
+    OMX_VIDEO_WMVFormatUnused = 0x01,   /**< Format unused or unknown */
+    OMX_VIDEO_WMVFormat7      = 0x02,   /**< Windows Media Video format 7 */
+    OMX_VIDEO_WMVFormat8      = 0x04,   /**< Windows Media Video format 8 */
+    OMX_VIDEO_WMVFormat9      = 0x08,   /**< Windows Media Video format 9 */
+    OMX_VIDEO_WMFFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_WMFFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_WMVFormatMax    = 0x7FFFFFFF
+} OMX_VIDEO_WMVFORMATTYPE;
+
+
+/** 
+ * WMV Params 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to
+ *  eFormat    : Version of WMV stream / data
+ */
+typedef struct OMX_VIDEO_PARAM_WMVTYPE {
+    OMX_U32 nSize; 
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_VIDEO_WMVFORMATTYPE eFormat;
+} OMX_VIDEO_PARAM_WMVTYPE;
+
+
+/** 
+ * Real Video Version 
+ */
+typedef enum OMX_VIDEO_RVFORMATTYPE {
+    OMX_VIDEO_RVFormatUnused = 0, /**< Format unused or unknown */
+    OMX_VIDEO_RVFormat8,          /**< Real Video format 8 */
+    OMX_VIDEO_RVFormat9,          /**< Real Video format 9 */
+    OMX_VIDEO_RVFormatG2,         /**< Real Video Format G2 */
+    OMX_VIDEO_RVFormatKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_RVFormatVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_RVFormatMax = 0x7FFFFFFF
+} OMX_VIDEO_RVFORMATTYPE;
+
+
+/** 
+ * Real Video Params 
+ *
+ * STUCT MEMBERS:
+ *  nSize              : Size of the structure in bytes
+ *  nVersion           : OMX specification version information 
+ *  nPortIndex         : Port that this structure applies to
+ *  eFormat            : Version of RV stream / data
+ *  nBitsPerPixel      : Bits per pixel coded in the frame
+ *  nPaddedWidth       : Padded width in pixel of a video frame
+ *  nPaddedHeight      : Padded Height in pixels of a video frame
+ *  nFrameRate         : Rate of video in frames per second
+ *  nBitstreamFlags    : Flags which internal information about the bitstream
+ *  nBitstreamVersion  : Bitstream version
+ *  nMaxEncodeFrameSize: Max encoded frame size
+ *  bEnablePostFilter  : Turn on/off post filter
+ *  bEnableTemporalInterpolation : Turn on/off temporal interpolation
+ *  bEnableLatencyMode : When enabled, the decoder does not display a decoded 
+ *                       frame until it has detected that no enhancement layer 
+ *                                      frames or dependent B frames will be coming. This 
+ *                                      detection usually occurs when a subsequent non-B 
+ *                                      frame is encountered 
+ */
+typedef struct OMX_VIDEO_PARAM_RVTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_VIDEO_RVFORMATTYPE eFormat;
+    OMX_U16 nBitsPerPixel;
+    OMX_U16 nPaddedWidth;
+    OMX_U16 nPaddedHeight;
+    OMX_U32 nFrameRate;
+    OMX_U32 nBitstreamFlags;
+    OMX_U32 nBitstreamVersion;
+    OMX_U32 nMaxEncodeFrameSize;
+    OMX_BOOL bEnablePostFilter;
+    OMX_BOOL bEnableTemporalInterpolation;
+    OMX_BOOL bEnableLatencyMode;
+} OMX_VIDEO_PARAM_RVTYPE;
+
+
+/** 
+ * AVC profile types, each profile indicates support for various 
+ * performance bounds and different annexes.
+ */
+typedef enum OMX_VIDEO_AVCPROFILETYPE {
+    OMX_VIDEO_AVCProfileBaseline = 0x01,   /**< Baseline profile */
+    OMX_VIDEO_AVCProfileMain     = 0x02,   /**< Main profile */
+    OMX_VIDEO_AVCProfileExtended = 0x04,   /**< Extended profile */
+    OMX_VIDEO_AVCProfileHigh     = 0x08,   /**< High profile */
+    OMX_VIDEO_AVCProfileHigh10   = 0x10,   /**< High 10 profile */
+    OMX_VIDEO_AVCProfileHigh422  = 0x20,   /**< High 4:2:2 profile */
+    OMX_VIDEO_AVCProfileHigh444  = 0x40,   /**< High 4:4:4 profile */
+    OMX_VIDEO_AVCProfileKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_AVCProfileVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_AVCProfileMax      = 0x7FFFFFFF  
+} OMX_VIDEO_AVCPROFILETYPE;
+
+
+/** 
+ * AVC level types, each level indicates support for various frame sizes, 
+ * bit rates, decoder frame rates.  No need 
+ */
+typedef enum OMX_VIDEO_AVCLEVELTYPE {
+    OMX_VIDEO_AVCLevel1   = 0x01,     /**< Level 1 */
+    OMX_VIDEO_AVCLevel1b  = 0x02,     /**< Level 1b */
+    OMX_VIDEO_AVCLevel11  = 0x04,     /**< Level 1.1 */
+    OMX_VIDEO_AVCLevel12  = 0x08,     /**< Level 1.2 */
+    OMX_VIDEO_AVCLevel13  = 0x10,     /**< Level 1.3 */
+    OMX_VIDEO_AVCLevel2   = 0x20,     /**< Level 2 */
+    OMX_VIDEO_AVCLevel21  = 0x40,     /**< Level 2.1 */
+    OMX_VIDEO_AVCLevel22  = 0x80,     /**< Level 2.2 */
+    OMX_VIDEO_AVCLevel3   = 0x100,    /**< Level 3 */
+    OMX_VIDEO_AVCLevel31  = 0x200,    /**< Level 3.1 */
+    OMX_VIDEO_AVCLevel32  = 0x400,    /**< Level 3.2 */
+    OMX_VIDEO_AVCLevel4   = 0x800,    /**< Level 4 */
+    OMX_VIDEO_AVCLevel41  = 0x1000,   /**< Level 4.1 */
+    OMX_VIDEO_AVCLevel42  = 0x2000,   /**< Level 4.2 */
+    OMX_VIDEO_AVCLevel5   = 0x4000,   /**< Level 5 */
+    OMX_VIDEO_AVCLevel51  = 0x8000,   /**< Level 5.1 */
+    OMX_VIDEO_AVCLevelKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_AVCLevelVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_AVCLevelMax = 0x7FFFFFFF  
+} OMX_VIDEO_AVCLEVELTYPE;
+
+
+/** 
+ * AVC loop filter modes 
+ *
+ * OMX_VIDEO_AVCLoopFilterEnable               : Enable
+ * OMX_VIDEO_AVCLoopFilterDisable              : Disable
+ * OMX_VIDEO_AVCLoopFilterDisableSliceBoundary : Disabled on slice boundaries
+ */
+typedef enum OMX_VIDEO_AVCLOOPFILTERTYPE {
+    OMX_VIDEO_AVCLoopFilterEnable = 0,
+    OMX_VIDEO_AVCLoopFilterDisable,
+    OMX_VIDEO_AVCLoopFilterDisableSliceBoundary,
+    OMX_VIDEO_AVCLoopFilterKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_AVCLoopFilterVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_AVCLoopFilterMax = 0x7FFFFFFF
+} OMX_VIDEO_AVCLOOPFILTERTYPE;
+
+
+/** 
+ * AVC params 
+ *
+ * STRUCT MEMBERS:
+ *  nSize                     : Size of the structure in bytes
+ *  nVersion                  : OMX specification version information
+ *  nPortIndex                : Port that this structure applies to
+ *  nSliceHeaderSpacing       : Number of macroblocks between slice header, put  
+ *                              zero if not used
+ *  nPFrames                  : Number of P frames between each I frame
+ *  nBFrames                  : Number of B frames between each I frame
+ *  bUseHadamard              : Enable/disable Hadamard transform
+ *  nRefFrames                : Max number of reference frames to use for inter
+ *                              motion search (1-16)
+ *  nRefIdxTrailing           : Pic param set ref frame index (index into ref
+ *                              frame buffer of trailing frames list), B frame
+ *                              support
+ *  nRefIdxForward            : Pic param set ref frame index (index into ref
+ *                              frame buffer of forward frames list), B frame
+ *                              support
+ *  bEnableUEP                : Enable/disable unequal error protection. This 
+ *                              is only valid of data partitioning is enabled.
+ *  bEnableFMO                : Enable/disable flexible macroblock ordering
+ *  bEnableASO                : Enable/disable arbitrary slice ordering
+ *  bEnableRS                 : Enable/disable sending of redundant slices
+ *  eProfile                  : AVC profile(s) to use
+ *  eLevel                    : AVC level(s) to use
+ *  nAllowedPictureTypes      : Specifies the picture types allowed in the 
+ *                              bitstream
+ *  bFrameMBsOnly             : specifies that every coded picture of the 
+ *                              coded video sequence is a coded frame 
+ *                              containing only frame macroblocks
+ *  bMBAFF                    : Enable/disable switching between frame and 
+ *                              field macroblocks within a picture
+ *  bEntropyCodingCABAC       : Entropy decoding method to be applied for the 
+ *                              syntax elements for which two descriptors appear 
+ *                              in the syntax tables
+ *  bWeightedPPrediction      : Enable/disable weighted prediction shall not 
+ *                              be applied to P and SP slices
+ *  nWeightedBipredicitonMode : Default weighted prediction is applied to B 
+ *                              slices 
+ *  bconstIpred               : Enable/disable intra prediction
+ *  bDirect8x8Inference       : Specifies the method used in the derivation 
+ *                              process for luma motion vectors for B_Skip, 
+ *                              B_Direct_16x16 and B_Direct_8x8 as specified 
+ *                              in subclause 8.4.1.2 of the AVC spec 
+ *  bDirectSpatialTemporal    : Flag indicating spatial or temporal direct
+ *                              mode used in B slice coding (related to 
+ *                              bDirect8x8Inference) . Spatial direct mode is 
+ *                              more common and should be the default.
+ *  nCabacInitIdx             : Index used to init CABAC contexts
+ *  eLoopFilterMode           : Enable/disable loop filter
+ */
+typedef struct OMX_VIDEO_PARAM_AVCTYPE {
+    OMX_U32 nSize;                 
+    OMX_VERSIONTYPE nVersion;      
+    OMX_U32 nPortIndex;            
+    OMX_U32 nSliceHeaderSpacing;  
+    OMX_U32 nPFrames;     
+    OMX_U32 nBFrames;     
+    OMX_BOOL bUseHadamard;
+    OMX_U32 nRefFrames;  
+       OMX_U32 nRefIdx10ActiveMinus1;
+       OMX_U32 nRefIdx11ActiveMinus1;
+    OMX_BOOL bEnableUEP;  
+    OMX_BOOL bEnableFMO;  
+    OMX_BOOL bEnableASO;  
+    OMX_BOOL bEnableRS;   
+    OMX_VIDEO_AVCPROFILETYPE eProfile;
+       OMX_VIDEO_AVCLEVELTYPE eLevel; 
+    OMX_U32 nAllowedPictureTypes;  
+       OMX_BOOL bFrameMBsOnly;                                                                         
+    OMX_BOOL bMBAFF;               
+    OMX_BOOL bEntropyCodingCABAC;  
+    OMX_BOOL bWeightedPPrediction; 
+    OMX_U32 nWeightedBipredicitonMode; 
+    OMX_BOOL bconstIpred ;
+    OMX_BOOL bDirect8x8Inference;  
+       OMX_BOOL bDirectSpatialTemporal;
+       OMX_U32 nCabacInitIdc;
+       OMX_VIDEO_AVCLOOPFILTERTYPE eLoopFilterMode;
+} OMX_VIDEO_PARAM_AVCTYPE;
+
+typedef struct OMX_VIDEO_PARAM_PROFILELEVELTYPE {
+   OMX_U32 nSize;                 
+   OMX_VERSIONTYPE nVersion;      
+   OMX_U32 nPortIndex;            
+   OMX_U32 eProfile;      /**< type is OMX_VIDEO_AVCPROFILETYPE, OMX_VIDEO_H263PROFILETYPE, 
+                                 or OMX_VIDEO_MPEG4PROFILETYPE depending on context */
+   OMX_U32 eLevel;        /**< type is OMX_VIDEO_AVCLEVELTYPE, OMX_VIDEO_H263LEVELTYPE, 
+                                 or OMX_VIDEO_MPEG4PROFILETYPE depending on context */
+   OMX_U32 nProfileIndex; /**< Used to query for individual profile support information,
+                               This parameter is valid only for 
+                               OMX_IndexParamVideoProfileLevelQuerySupported index,
+                               For all other indices this parameter is to be ignored. */
+} OMX_VIDEO_PARAM_PROFILELEVELTYPE;
+
+/** 
+ * Structure for dynamically configuring bitrate mode of a codec. 
+ *
+ * STRUCT MEMBERS:
+ *  nSize          : Size of the struct in bytes
+ *  nVersion       : OMX spec version info
+ *  nPortIndex     : Port that this struct applies to
+ *  nEncodeBitrate : Target average bitrate to be generated in bps
+ */
+typedef struct OMX_VIDEO_CONFIG_BITRATETYPE {
+    OMX_U32 nSize;                          
+    OMX_VERSIONTYPE nVersion;               
+    OMX_U32 nPortIndex;                     
+    OMX_U32 nEncodeBitrate;                 
+} OMX_VIDEO_CONFIG_BITRATETYPE;
+
+/** 
+ * Defines Encoder Frame Rate setting
+ *
+ * STRUCT MEMBERS:
+ *  nSize            : Size of the structure in bytes
+ *  nVersion         : OMX specification version information 
+ *  nPortIndex       : Port that this structure applies to
+ *  xEncodeFramerate : Encoding framerate represented in Q16 format
+ */
+typedef struct OMX_CONFIG_FRAMERATETYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 xEncodeFramerate; /* Q16 format */
+} OMX_CONFIG_FRAMERATETYPE;
+
+typedef struct OMX_CONFIG_INTRAREFRESHVOPTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL IntraRefreshVOP;
+} OMX_CONFIG_INTRAREFRESHVOPTYPE;
+
+typedef struct OMX_CONFIG_MACROBLOCKERRORMAPTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nErrMapSize;           /* Size of the Error Map in bytes */
+    OMX_U8  ErrMap[1];             /* Error map hint */
+} OMX_CONFIG_MACROBLOCKERRORMAPTYPE;
+
+typedef struct OMX_CONFIG_MBERRORREPORTINGTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_BOOL bEnabled;
+} OMX_CONFIG_MBERRORREPORTINGTYPE;
+
+typedef struct OMX_PARAM_MACROBLOCKSTYPE {
+    OMX_U32 nSize;
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nMacroblocks;
+} OMX_PARAM_MACROBLOCKSTYPE;
+
+/** 
+ * AVC Slice Mode modes 
+ *
+ * OMX_VIDEO_SLICEMODE_AVCDefault   : Normal frame encoding, one slice per frame
+ * OMX_VIDEO_SLICEMODE_AVCMBSlice   : NAL mode, number of MBs per frame
+ * OMX_VIDEO_SLICEMODE_AVCByteSlice : NAL mode, number of bytes per frame
+ */
+typedef enum OMX_VIDEO_AVCSLICEMODETYPE {
+    OMX_VIDEO_SLICEMODE_AVCDefault = 0,
+    OMX_VIDEO_SLICEMODE_AVCMBSlice,
+    OMX_VIDEO_SLICEMODE_AVCByteSlice,
+    OMX_VIDEO_SLICEMODE_AVCKhronosExtensions = 0x6F000000, /**< Reserved region for introducing Khronos Standard Extensions */ 
+    OMX_VIDEO_SLICEMODE_AVCVendorStartUnused = 0x7F000000, /**< Reserved region for introducing Vendor Extensions */
+    OMX_VIDEO_SLICEMODE_AVCLevelMax = 0x7FFFFFFF
+} OMX_VIDEO_AVCSLICEMODETYPE;
+
+/** 
+ * AVC FMO Slice Mode Params 
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to
+ *  nNumSliceGroups : Specifies the number of slice groups
+ *  nSliceGroupMapType : Specifies the type of slice groups
+ *  eSliceMode : Specifies the type of slice
+ */
+typedef struct OMX_VIDEO_PARAM_AVCSLICEFMO {
+    OMX_U32 nSize; 
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U8 nNumSliceGroups;
+    OMX_U8 nSliceGroupMapType;
+    OMX_VIDEO_AVCSLICEMODETYPE eSliceMode;
+} OMX_VIDEO_PARAM_AVCSLICEFMO;
+
+/** 
+ * AVC IDR Period Configs
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to
+ *  nIDRPeriod : Specifies periodicity of IDR frames
+ *  nPFrames : Specifies internal of coding Intra frames
+ */
+typedef struct OMX_VIDEO_CONFIG_AVCINTRAPERIOD {
+    OMX_U32 nSize; 
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nIDRPeriod;
+    OMX_U32 nPFrames;
+} OMX_VIDEO_CONFIG_AVCINTRAPERIOD;
+
+/** 
+ * AVC NAL Size Configs
+ *
+ * STRUCT MEMBERS:
+ *  nSize      : Size of the structure in bytes
+ *  nVersion   : OMX specification version information
+ *  nPortIndex : Port that this structure applies to
+ *  nNaluBytes : Specifies the NAL unit size
+ */
+typedef struct OMX_VIDEO_CONFIG_NALSIZE {
+    OMX_U32 nSize; 
+    OMX_VERSIONTYPE nVersion;
+    OMX_U32 nPortIndex;
+    OMX_U32 nNaluBytes;
+} OMX_VIDEO_CONFIG_NALSIZE;
+
+/** @} */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif
+/* File EOF */
+
diff --git a/osal/Android.mk b/osal/Android.mk
new file mode 100644 (file)
index 0000000..c58f5e0
--- /dev/null
@@ -0,0 +1,43 @@
+LOCAL_PATH := $(call my-dir)
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_SRC_FILES := \
+       Exynos_OSAL_Android.cpp \
+       Exynos_OSAL_Event.c \
+       Exynos_OSAL_Queue.c \
+       Exynos_OSAL_ETC.c \
+       Exynos_OSAL_Mutex.c \
+       Exynos_OSAL_Thread.c \
+       Exynos_OSAL_Memory.c \
+       Exynos_OSAL_Semaphore.c \
+       Exynos_OSAL_Library.c \
+       Exynos_OSAL_Log.c \
+       Exynos_OSAL_SharedMemory.c
+
+LOCAL_PRELINK_MODULE := false
+LOCAL_MODULE := libExynosOMX_OSAL
+
+LOCAL_CFLAGS :=
+
+ifeq ($(BOARD_USE_S3D_SUPPORT), true)
+LOCAL_CFLAGS += -DS3D_SUPPORT
+endif
+
+LOCAL_STATIC_LIBRARIES := liblog libcutils
+
+LOCAL_C_INCLUDES := $(EXYNOS_OMX_INC)/khronos \
+       $(EXYNOS_OMX_INC)/exynos \
+       $(EXYNOS_OMX_TOP)/osal \
+       $(EXYNOS_OMX_COMPONENT)/common \
+       $(EXYNOS_OMX_COMPONENT)/video/dec \
+       $(EXYNOS_OMX_COMPONENT)/video/enc \
+       $(EXYNOS_OMX_TOP)/video/dec \
+       $(EXYNOS_OMX_TOP)/video/enc \
+       hardware/samsung_slsi/exynos5/include \
+       frameworks/native/include/media/hardware \
+       frameworks/native/include/media/openmax \
+       hardware/samsung_slsi/exynos5/exynos_omx/codecs/exynos_codecs/video/exynos5/mfc_v4l2/include
+
+include $(BUILD_STATIC_LIBRARY)
diff --git a/osal/Exynos_OSAL_Android.cpp b/osal/Exynos_OSAL_Android.cpp
new file mode 100644 (file)
index 0000000..142580c
--- /dev/null
@@ -0,0 +1,658 @@
+/*
+ * 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_OSAL_Android.cpp
+ * @brief
+ * @author      Seungbeom Kim (sbcrux.kim@samsung.com)
+ * @author      Hyeyeon Chung (hyeon.chung@samsung.com)
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @author      Jinsung Yang (jsgood.yang@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <system/window.h>
+#include <ui/GraphicBuffer.h>
+#include <ui/GraphicBufferMapper.h>
+#include <ui/Rect.h>
+#include <media/hardware/HardwareAPI.h>
+#include <hardware/hardware.h>
+#include <media/hardware/OMXPluginBase.h>
+#include <media/hardware/MetadataBufferType.h>
+#include <gralloc_priv.h>
+
+#include "Exynos_OSAL_Semaphore.h"
+#include "Exynos_OMX_Baseport.h"
+#include "Exynos_OMX_Basecomponent.h"
+#include "Exynos_OMX_Macros.h"
+#include "Exynos_OMX_Vdec.h"
+#include "Exynos_OMX_Venc.h"
+#include "Exynos_OSAL_Android.h"
+#include "exynos_format.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "Exynos_OSAL_Android"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+using namespace android;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+OMX_ERRORTYPE Exynos_OSAL_LockANBHandle(
+    OMX_IN OMX_U32 handle,
+    OMX_IN OMX_U32 width,
+    OMX_IN OMX_U32 height,
+    OMX_IN OMX_COLOR_FORMATTYPE format,
+    OMX_OUT OMX_PTR planes)
+{
+    FunctionIn();
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    GraphicBufferMapper &mapper = GraphicBufferMapper::get();
+    buffer_handle_t bufferHandle = (buffer_handle_t) handle;
+    private_handle_t *priv_hnd = (private_handle_t *) bufferHandle;
+    Rect bounds(width, height);
+    ExynosVideoPlane *vplanes = (ExynosVideoPlane *) planes;
+    void *vaddr[MAX_BUFFER_PLANE];
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: handle: 0x%x", __func__, handle);
+
+    int usage = 0;
+
+    switch (format) {
+    case OMX_COLOR_FormatYUV420Planar:
+    case OMX_COLOR_FormatYUV420SemiPlanar:
+    case OMX_SEC_COLOR_FormatNV12Tiled:
+        usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN;
+        break;
+    default:
+        usage = GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN;
+        break;
+    }
+
+    if (mapper.lock(bufferHandle, usage, bounds, vaddr) != 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: mapper.lock() fail", __func__);
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    vplanes[0].fd = priv_hnd->fd;
+    vplanes[0].offset = 0;
+    vplanes[0].addr = vaddr[0];
+    vplanes[1].fd = priv_hnd->fd1;
+    vplanes[1].offset = 0;
+    vplanes[1].addr = vaddr[1];
+    vplanes[2].fd = priv_hnd->fd2;
+    vplanes[2].offset = 0;
+    vplanes[2].addr = vaddr[2];
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: buffer locked: 0x%x", __func__, *vaddr);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_UnlockANBHandle(OMX_IN OMX_U32 handle)
+{
+    FunctionIn();
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    GraphicBufferMapper &mapper = GraphicBufferMapper::get();
+    buffer_handle_t bufferHandle = (buffer_handle_t) handle;
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: handle: 0x%x", __func__, handle);
+
+    if (mapper.unlock(bufferHandle) != 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: mapper.unlock() fail", __func__);
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: buffer unlocked: 0x%x", __func__, handle);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_COLOR_FORMATTYPE Exynos_OSAL_GetANBColorFormat(OMX_IN OMX_U32 handle)
+{
+    FunctionIn();
+
+    OMX_COLOR_FORMATTYPE ret = OMX_COLOR_FormatUnused;
+    private_handle_t *priv_hnd = (private_handle_t *) handle;
+
+    ret = Exynos_OSAL_Hal2OMXPixelFormat(priv_hnd->format);
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "ColorFormat: 0x%x", ret);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_LockANB(
+    OMX_IN OMX_PTR pBuffer,
+    OMX_IN OMX_U32 width,
+    OMX_IN OMX_U32 height,
+    OMX_IN OMX_COLOR_FORMATTYPE format,
+    OMX_OUT OMX_U32 *pStride,
+    OMX_OUT OMX_PTR planes)
+{
+    FunctionIn();
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    android_native_buffer_t *pANB = (android_native_buffer_t *) pBuffer;
+
+    ret = Exynos_OSAL_LockANBHandle((OMX_U32)pANB->handle, width, height, format, planes);
+    *pStride = pANB->stride;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_UnlockANB(OMX_IN OMX_PTR pBuffer)
+{
+    FunctionIn();
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    android_native_buffer_t *pANB = (android_native_buffer_t *) pBuffer;
+
+    ret = Exynos_OSAL_UnlockANBHandle((OMX_U32)pANB->handle);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE useAndroidNativeBuffer(
+    EXYNOS_OMX_BASEPORT      *pExynosPort,
+    OMX_BUFFERHEADERTYPE **ppBufferHdr,
+    OMX_U32                nPortIndex,
+    OMX_PTR                pAppPrivate,
+    OMX_U32                nSizeBytes,
+    OMX_U8                *pBuffer)
+{
+    OMX_ERRORTYPE         ret = OMX_ErrorNone;
+    OMX_BUFFERHEADERTYPE *temp_bufferHeader = NULL;
+    unsigned int          i = 0;
+    OMX_U32               width, height;
+    OMX_U32               stride;
+    ExynosVideoPlane      planes[MAX_BUFFER_PLANE];
+
+    FunctionIn();
+
+    if (pExynosPort == NULL) {
+        ret = OMX_ErrorBadParameter;
+        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;
+
+            width = pExynosPort->portDefinition.format.video.nFrameWidth;
+            height = pExynosPort->portDefinition.format.video.nFrameHeight;
+            Exynos_OSAL_LockANB(temp_bufferHeader->pBuffer, width, height,
+                                pExynosPort->portDefinition.format.video.eColorFormat,
+                                &stride, planes);
+            pExynosPort->extendBufferHeader[i].buf_fd[0] = planes[0].fd;
+            pExynosPort->extendBufferHeader[i].pYUVBuf[0] = planes[0].addr;
+            pExynosPort->extendBufferHeader[i].buf_fd[1] = planes[1].fd;
+            pExynosPort->extendBufferHeader[i].pYUVBuf[1] = planes[1].addr;
+            pExynosPort->extendBufferHeader[i].buf_fd[2] = planes[2].fd;
+            pExynosPort->extendBufferHeader[i].pYUVBuf[2] = planes[2].addr;
+            Exynos_OSAL_UnlockANB(temp_bufferHeader->pBuffer);
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "useAndroidNativeBuffer: buf %d pYUVBuf[0]:0x%x (fd:%d), pYUVBuf[1]:0x%x (fd:%d)",
+                            i, pExynosPort->extendBufferHeader[i].pYUVBuf[0], planes[0].fd,
+                            pExynosPort->extendBufferHeader[i].pYUVBuf[1], planes[1].fd);
+
+            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_OSAL_GetANBParameter(
+    OMX_IN OMX_HANDLETYPE hComponent,
+    OMX_IN OMX_INDEXTYPE  nIndex,
+    OMX_INOUT OMX_PTR     ComponentParameterStructure)
+{
+    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 (pExynosComponent->currentState == OMX_StateInvalid ) {
+        ret = OMX_ErrorInvalidState;
+        goto EXIT;
+    }
+
+    if (ComponentParameterStructure == NULL) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    switch (nIndex) {
+    case OMX_IndexParamGetAndroidNativeBuffer:
+    {
+        GetAndroidNativeBufferUsageParams *pANBParams = (GetAndroidNativeBufferUsageParams *) ComponentParameterStructure;
+        OMX_U32 portIndex = pANBParams->nPortIndex;
+
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: OMX_IndexParamGetAndroidNativeBuffer", __func__);
+
+        ret = Exynos_OMX_Check_SizeVersion(pANBParams, sizeof(GetAndroidNativeBufferUsageParams));
+        if (ret != OMX_ErrorNone) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_Check_SizeVersion(GetAndroidNativeBufferUsageParams) is failed", __func__);
+            goto EXIT;
+        }
+
+        if (portIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        /* NOTE: OMX_IndexParamGetAndroidNativeBuffer returns original 'nUsage' without any
+         * modifications since currently not defined what the 'nUsage' is for.
+         */
+        pANBParams->nUsage |= (GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_EXTERNAL_DISP);
+    }
+        break;
+
+    default:
+    {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Unsupported index (%d)", __func__, nIndex);
+        ret = OMX_ErrorUnsupportedIndex;
+        goto EXIT;
+    }
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_SetANBParameter(
+    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;
+
+    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_IndexParamEnableAndroidBuffers:
+    {
+        EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+        EnableAndroidNativeBuffersParams *pANBParams = (EnableAndroidNativeBuffersParams *) ComponentParameterStructure;
+        OMX_U32 portIndex = pANBParams->nPortIndex;
+        EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: OMX_IndexParamEnableAndroidNativeBuffers", __func__);
+
+        ret = Exynos_OMX_Check_SizeVersion(pANBParams, sizeof(EnableAndroidNativeBuffersParams));
+        if (ret != OMX_ErrorNone) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_Check_SizeVersion(EnableAndroidNativeBuffersParams) is failed", __func__);
+            goto EXIT;
+        }
+
+        if (portIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+        if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        /* ANB and DPB Buffer Sharing */
+        pExynosPort->bIsANBEnabled = pANBParams->enable;
+        if ((portIndex == OUTPUT_PORT_INDEX) &&
+            (pExynosPort->bIsANBEnabled == OMX_TRUE) &&
+            ((pExynosPort->bufferProcessType & BUFFER_ANBSHARE) == BUFFER_ANBSHARE)) {
+            pExynosPort->bufferProcessType = BUFFER_SHARE;
+            pExynosPort->portDefinition.format.video.eColorFormat = (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12Tiled;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "OMX_IndexParamEnableAndroidBuffers & bufferProcessType change to BUFFER_SHARE");
+        }
+    }
+        break;
+
+    case OMX_IndexParamUseAndroidNativeBuffer:
+    {
+        EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
+        UseAndroidNativeBufferParams *pANBParams = (UseAndroidNativeBufferParams *) ComponentParameterStructure;
+        OMX_U32 portIndex = pANBParams->nPortIndex;
+        EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+        android_native_buffer_t *pANB;
+        OMX_U32 nSizeBytes;
+
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: OMX_IndexParamUseAndroidNativeBuffer, portIndex: %d", __func__, portIndex);
+
+        ret = Exynos_OMX_Check_SizeVersion(pANBParams, sizeof(UseAndroidNativeBufferParams));
+        if (ret != OMX_ErrorNone) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_Check_SizeVersion(UseAndroidNativeBufferParams) is failed", __func__);
+            goto EXIT;
+        }
+
+        if (portIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+        if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        if (pExynosPort->portState != OMX_StateIdle) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Port state should be IDLE", __func__);
+            ret = OMX_ErrorIncorrectStateOperation;
+            goto EXIT;
+        }
+
+        pANB = pANBParams->nativeBuffer.get();
+
+        /* MALI alignment restriction */
+        nSizeBytes = ALIGN(pANB->width, 16) * ALIGN(pANB->height, 16);
+        nSizeBytes += ALIGN(pANB->width / 2, 16) * ALIGN(pANB->height / 2, 16) * 2;
+
+        ret = useAndroidNativeBuffer(pExynosPort,
+                                     pANBParams->bufferHeader,
+                                     pANBParams->nPortIndex,
+                                     pANBParams->pAppPrivate,
+                                     nSizeBytes,
+                                     (OMX_U8 *) pANB);
+        if (ret != OMX_ErrorNone) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: useAndroidNativeBuffer is failed: err=0x%x", __func__,ret);
+            goto EXIT;
+        }
+    }
+        break;
+
+    case OMX_IndexParamStoreMetaDataBuffer:
+    {
+        EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;;
+        StoreMetaDataInBuffersParams *pANBParams = (StoreMetaDataInBuffersParams *) ComponentParameterStructure;
+        OMX_U32 portIndex = pANBParams->nPortIndex;
+        EXYNOS_OMX_BASEPORT *pExynosPort = NULL;
+
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: OMX_IndexParamStoreMetaDataBuffer", __func__);
+
+        ret = Exynos_OMX_Check_SizeVersion(pANBParams, sizeof(StoreMetaDataInBuffersParams));
+        if (ret != OMX_ErrorNone) {
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Exynos_OMX_Check_SizeVersion(StoreMetaDataInBuffersParams) is failed", __func__);
+            goto EXIT;
+        }
+
+        if (portIndex >= pExynosComponent->portParam.nPorts) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pExynosPort = &pExynosComponent->pExynosPort[portIndex];
+        if (CHECK_PORT_TUNNELED(pExynosPort) && CHECK_PORT_BUFFER_SUPPLIER(pExynosPort)) {
+            ret = OMX_ErrorBadPortIndex;
+            goto EXIT;
+        }
+
+        pExynosPort->bStoreMetaData = pANBParams->bStoreMetaData;
+        pVideoEnc->bFirstInput = OMX_TRUE;
+    }
+        break;
+
+    default:
+    {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s: Unsupported index (%d)", __func__, nIndex);
+        ret = OMX_ErrorUnsupportedIndex;
+        goto EXIT;
+    }
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_GetInfoFromMetaData(OMX_IN OMX_BYTE pBuffer,
+                                           OMX_OUT OMX_PTR *ppBuf)
+{
+    OMX_ERRORTYPE      ret = OMX_ErrorNone;
+    MetadataBufferType type;
+
+    FunctionIn();
+
+/*
+ * meta data contains the following data format.
+ * payload depends on the MetadataBufferType
+ * --------------------------------------------------------------
+ * | MetadataBufferType                         |          payload                           |
+ * --------------------------------------------------------------
+ *
+ * If MetadataBufferType is kMetadataBufferTypeCameraSource, then
+ * --------------------------------------------------------------
+ * | kMetadataBufferTypeCameraSource  | physical addr. of Y |physical addr. of CbCr |
+ * --------------------------------------------------------------
+ *
+ * If MetadataBufferType is kMetadataBufferTypeGrallocSource, then
+ * --------------------------------------------------------------
+ * | kMetadataBufferTypeGrallocSource    | buffer_handle_t |
+ * --------------------------------------------------------------
+ */
+
+    /* MetadataBufferType */
+    Exynos_OSAL_Memcpy(&type, (MetadataBufferType *)pBuffer, sizeof(MetadataBufferType));
+
+    if (type == kMetadataBufferTypeCameraSource) {
+        void *pAddress = NULL;
+
+        /* Address. of Y */
+        Exynos_OSAL_Memcpy(&pAddress, pBuffer + sizeof(MetadataBufferType), sizeof(void *));
+        ppBuf[0] = (void *)pAddress;
+
+        /* Address. of CbCr */
+        Exynos_OSAL_Memcpy(&pAddress, pBuffer + sizeof(MetadataBufferType) + sizeof(void *), sizeof(void *));
+        ppBuf[1] = (void *)pAddress;
+
+    } else if (type == kMetadataBufferTypeGrallocSource) {
+        buffer_handle_t    pBufHandle;
+
+        /* buffer_handle_t */
+        Exynos_OSAL_Memcpy(&pBufHandle, pBuffer + sizeof(MetadataBufferType), sizeof(buffer_handle_t));
+        ppBuf[0] = (OMX_PTR)pBufHandle;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_COLOR_FORMATTYPE Exynos_OSAL_Hal2OMXPixelFormat(
+    unsigned int hal_format)
+{
+    OMX_COLOR_FORMATTYPE omx_format;
+    switch (hal_format) {
+    case HAL_PIXEL_FORMAT_YCbCr_422_I:
+        omx_format = OMX_COLOR_FormatYCbYCr;
+        break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_P:
+        omx_format = OMX_COLOR_FormatYUV420Planar;
+        break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_SP:
+        omx_format = OMX_COLOR_FormatYUV420SemiPlanar;
+        break;
+    case HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED:
+        omx_format = (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12TPhysicalAddress;
+        break;
+    case HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED:
+        omx_format = (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12Tiled;
+        break;
+    case HAL_PIXEL_FORMAT_ARGB888:
+        omx_format = OMX_COLOR_Format32bitARGB8888;
+        break;
+    default:
+        omx_format = OMX_COLOR_FormatYUV420Planar;
+        break;
+    }
+    return omx_format;
+}
+
+unsigned int Exynos_OSAL_OMX2HalPixelFormat(
+    OMX_COLOR_FORMATTYPE omx_format)
+{
+    unsigned int hal_format;
+    switch (omx_format) {
+    case OMX_COLOR_FormatYCbYCr:
+        hal_format = HAL_PIXEL_FORMAT_YCbCr_422_I;
+        break;
+    case OMX_COLOR_FormatYUV420Planar:
+        hal_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
+        break;
+    case OMX_COLOR_FormatYUV420SemiPlanar:
+        hal_format = HAL_PIXEL_FORMAT_YCbCr_420_SP;
+        break;
+    case OMX_SEC_COLOR_FormatNV12TPhysicalAddress:
+        hal_format = HAL_PIXEL_FORMAT_CUSTOM_YCbCr_420_SP_TILED;
+        break;
+    case OMX_SEC_COLOR_FormatNV12Tiled:
+        hal_format = HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED;
+        break;
+    case OMX_COLOR_Format32bitARGB8888:
+        hal_format = HAL_PIXEL_FORMAT_ARGB888;
+        break;
+    default:
+        hal_format = HAL_PIXEL_FORMAT_YCbCr_420_P;
+        break;
+    }
+    return hal_format;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/osal/Exynos_OSAL_Android.h b/osal/Exynos_OSAL_Android.h
new file mode 100644 (file)
index 0000000..cfe8c36
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * 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_OSAL_Android.h
+ * @brief
+ * @author      Seungbeom Kim (sbcrux.kim@samsung.com)
+ * @author      Hyeyeon Chung (hyeon.chung@samsung.com)
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @author      Jinsung Yang (jsgood.yang@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef Exynos_OSAL_ANDROID
+#define Exynos_OSAL_ANDROID
+
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+#include "OMX_Index.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_ERRORTYPE Exynos_OSAL_GetANBParameter(OMX_IN OMX_HANDLETYPE hComponent,
+                                          OMX_IN OMX_INDEXTYPE nIndex,
+                                          OMX_INOUT OMX_PTR ComponentParameterStructure);
+
+OMX_ERRORTYPE Exynos_OSAL_SetANBParameter(OMX_IN OMX_HANDLETYPE hComponent,
+                                          OMX_IN OMX_INDEXTYPE nIndex,
+                                          OMX_IN OMX_PTR ComponentParameterStructure);
+
+OMX_ERRORTYPE Exynos_OSAL_LockANB(OMX_IN OMX_PTR pBuffer,
+                                  OMX_IN OMX_U32 width,
+                                  OMX_IN OMX_U32 height,
+                                  OMX_IN OMX_COLOR_FORMATTYPE format,
+                                  OMX_OUT OMX_U32 *pStride,
+                                  OMX_OUT OMX_PTR planes);
+
+OMX_ERRORTYPE Exynos_OSAL_UnlockANB(OMX_IN OMX_PTR pBuffer);
+
+OMX_ERRORTYPE Exynos_OSAL_LockANBHandle(OMX_IN OMX_U32 pBuffer,
+                                        OMX_IN OMX_U32 width,
+                                        OMX_IN OMX_U32 height,
+                                        OMX_IN OMX_COLOR_FORMATTYPE format,
+                                        OMX_OUT OMX_PTR planes);
+
+OMX_ERRORTYPE Exynos_OSAL_UnlockANBHandle(OMX_IN OMX_U32 pBuffer);
+
+OMX_ERRORTYPE Exynos_OSAL_GetInfoFromMetaData(OMX_IN OMX_BYTE pBuffer,
+                                              OMX_OUT OMX_PTR *pOutBuffer);
+
+OMX_ERRORTYPE Exynos_OSAL_CheckANB(OMX_IN EXYNOS_OMX_DATA *pBuffer,
+                                   OMX_OUT OMX_BOOL *bIsANBEnabled);
+
+OMX_COLOR_FORMATTYPE Exynos_OSAL_Hal2OMXPixelFormat(unsigned int hal_format);
+
+unsigned int Exynos_OSAL_OMX2HalPixelFormat(OMX_COLOR_FORMATTYPE omx_format);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/osal/Exynos_OSAL_ETC.c b/osal/Exynos_OSAL_ETC.c
new file mode 100644 (file)
index 0000000..e6d73ed
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ *
+ * 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_OSAL_ETC.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 <sys/time.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_ETC.h"
+#include "Exynos_OSAL_Log.h"
+
+static struct timeval perfStart[PERF_ID_MAX+1], perfStop[PERF_ID_MAX+1];
+static unsigned long perfTime[PERF_ID_MAX+1], totalPerfTime[PERF_ID_MAX+1];
+static unsigned int perfFrameCount[PERF_ID_MAX+1], perfOver30ms[PERF_ID_MAX+1];
+
+#ifndef HAVE_GETLINE
+ssize_t getline(char **ppLine, size_t *pLen, FILE *pStream)
+{
+    char *pCurrentPointer = NULL;
+    size_t const chunk = 512;
+
+    size_t defaultBufferSize = chunk + 1;
+    size_t retSize = 0;
+
+    if (*ppLine == NULL) {
+        *ppLine = (char *)malloc(defaultBufferSize);
+        if (*ppLine == NULL) {
+            retSize = -1;
+            goto EXIT;
+        }
+        *pLen = defaultBufferSize;
+    }
+    else {
+        if (*pLen < defaultBufferSize) {
+            *ppLine = (char *)realloc(*ppLine, defaultBufferSize);
+            if (*ppLine == NULL) {
+                retSize = -1;
+                goto EXIT;
+            }
+            *pLen = defaultBufferSize;
+        }
+    }
+
+    while (1) {
+        size_t i;
+        size_t j = 0;
+        size_t readByte = 0;
+
+        pCurrentPointer = *ppLine + readByte;
+
+        i = fread(pCurrentPointer, 1, chunk, pStream);
+        if (i < chunk && ferror(pStream)) {
+            retSize = -1;
+            goto EXIT;
+        }
+        while (j < i) {
+            ++j;
+            if (*pCurrentPointer++ == (char)'\n') {
+                *pCurrentPointer = '\0';
+                if (j != i) {
+                    if (fseek(pStream, j - i, SEEK_CUR)) {
+                        retSize = -1;
+                        goto EXIT;
+                }
+                    if (feof(pStream))
+                        clearerr(pStream);
+                }
+                readByte += j;
+                retSize = readByte;
+                goto EXIT;
+            }
+        }
+
+        readByte += j;
+        if (feof(pStream)) {
+            if (readByte) {
+                retSize = readByte;
+                goto EXIT;
+            }
+            if (!i) {
+                retSize = -1;
+                goto EXIT;
+            }
+        }
+
+        i = ((readByte + (chunk * 2)) / chunk) * chunk;
+        if (i != *pLen) {
+            *ppLine = (char *)realloc(*ppLine, i);
+            if (*ppLine == NULL) {
+                retSize = -1;
+                goto EXIT;
+        }
+            *pLen = i;
+        }
+    }
+
+EXIT:
+    return retSize;
+}
+#endif /* HAVE_GETLINE */
+
+OMX_PTR Exynos_OSAL_Strcpy(OMX_PTR dest, OMX_PTR src)
+{
+    return strcpy(dest, src);
+}
+
+OMX_PTR Exynos_OSAL_Strncpy(OMX_PTR dest, OMX_PTR src, size_t num)
+{
+    return strncpy(dest, src, num);
+}
+
+OMX_S32 Exynos_OSAL_Strcmp(OMX_PTR str1, OMX_PTR str2)
+{
+    return strcmp(str1, str2);
+}
+
+OMX_S32 Exynos_OSAL_Strncmp(OMX_PTR str1, OMX_PTR str2, size_t num)
+{
+    return strncmp(str1, str2, num);
+}
+
+OMX_PTR Exynos_OSAL_Strcat(OMX_PTR dest, OMX_PTR src)
+{
+    return strcat(dest, src);
+}
+
+OMX_PTR Exynos_OSAL_Strncat(OMX_PTR dest, OMX_PTR src, size_t num)
+{
+    return strncat(dest, src, num);
+}
+
+size_t Exynos_OSAL_Strlen(const char *str)
+{
+    return strlen(str);
+}
+
+static OMX_U32 MeasureTime(struct timeval *start, struct timeval *stop)
+{
+    unsigned long sec, usec, time;
+
+    sec = stop->tv_sec - start->tv_sec;
+    if (stop->tv_usec >= start->tv_usec) {
+        usec = stop->tv_usec - start->tv_usec;
+    } else {
+        usec = stop->tv_usec + 1000000 - start->tv_usec;
+        sec--;
+    }
+
+    time = sec * 1000000 + (usec);
+
+    return time;
+}
+
+void Exynos_OSAL_PerfInit(PERF_ID_TYPE id)
+{
+    memset(&perfStart[id], 0, sizeof(perfStart[id]));
+    memset(&perfStop[id], 0, sizeof(perfStop[id]));
+    perfTime[id] = 0;
+    totalPerfTime[id] = 0;
+    perfFrameCount[id] = 0;
+    perfOver30ms[id] = 0;
+}
+
+void Exynos_OSAL_PerfStart(PERF_ID_TYPE id)
+{
+    gettimeofday(&perfStart[id], NULL);
+}
+
+void Exynos_OSAL_PerfStop(PERF_ID_TYPE id)
+{
+    gettimeofday(&perfStop[id], NULL);
+
+    perfTime[id] = MeasureTime(&perfStart[id], &perfStop[id]);
+    totalPerfTime[id] += perfTime[id];
+    perfFrameCount[id]++;
+
+    if (perfTime[id] > 30000)
+        perfOver30ms[id]++;
+}
+
+OMX_U32 Exynos_OSAL_PerfFrame(PERF_ID_TYPE id)
+{
+    return perfTime[id];
+}
+
+OMX_U32 Exynos_OSAL_PerfTotal(PERF_ID_TYPE id)
+{
+    return totalPerfTime[id];
+}
+
+OMX_U32 Exynos_OSAL_PerfFrameCount(PERF_ID_TYPE id)
+{
+    return perfFrameCount[id];
+}
+
+int Exynos_OSAL_PerfOver30ms(PERF_ID_TYPE id)
+{
+    return perfOver30ms[id];
+}
+
+void Exynos_OSAL_PerfPrint(OMX_STRING prefix, PERF_ID_TYPE id)
+{
+    OMX_U32 perfTotal;
+    int frameCount;
+
+    frameCount = Exynos_OSAL_PerfFrameCount(id);
+    perfTotal = Exynos_OSAL_PerfTotal(id);
+
+    Exynos_OSAL_Log(EXYNOS_LOG_INFO, "%s Frame Count: %d", prefix, frameCount);
+    Exynos_OSAL_Log(EXYNOS_LOG_INFO, "%s Avg Time: %.2f ms, Over 30ms: %d",
+                prefix, (float)perfTotal / (float)(frameCount * 1000),
+                Exynos_OSAL_PerfOver30ms(id));
+}
diff --git a/osal/Exynos_OSAL_ETC.h b/osal/Exynos_OSAL_ETC.h
new file mode 100644 (file)
index 0000000..efbc51d
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ *
+ * 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_OSAL_ETC.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef Exynos_OSAL_ETC
+#define Exynos_OSAL_ETC
+
+#include "OMX_Types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_PTR Exynos_OSAL_Strcpy(OMX_PTR dest, OMX_PTR src);
+OMX_S32 Exynos_OSAL_Strncmp(OMX_PTR str1, OMX_PTR str2, size_t num);
+OMX_S32 Exynos_OSAL_Strcmp(OMX_PTR str1, OMX_PTR str2);
+OMX_PTR Exynos_OSAL_Strcat(OMX_PTR dest, OMX_PTR src);
+size_t Exynos_OSAL_Strlen(const char *str);
+ssize_t getline(char **ppLine, size_t *len, FILE *stream);
+
+/* perf */
+typedef enum _PERF_ID_TYPE {
+    PERF_ID_CSC = 0,
+    PERF_ID_DEC,
+    PERF_ID_ENC,
+    PERF_ID_USER,
+    PERF_ID_MAX,
+} PERF_ID_TYPE;
+
+void Exynos_OSAL_PerfInit(PERF_ID_TYPE id);
+void Exynos_OSAL_PerfStart(PERF_ID_TYPE id);
+void Exynos_OSAL_PerfStop(PERF_ID_TYPE id);
+OMX_U32 Exynos_OSAL_PerfFrame(PERF_ID_TYPE id);
+OMX_U32 Exynos_OSAL_PerfTotal(PERF_ID_TYPE id);
+OMX_U32 Exynos_OSAL_PerfFrameCount(PERF_ID_TYPE id);
+int Exynos_OSAL_PerfOver30ms(PERF_ID_TYPE id);
+void Exynos_OSAL_PerfPrint(OMX_STRING prefix, PERF_ID_TYPE id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/osal/Exynos_OSAL_Event.c b/osal/Exynos_OSAL_Event.c
new file mode 100644 (file)
index 0000000..ef14f85
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ *
+ * 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_OSAL_Event.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 <pthread.h>
+#include <errno.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_Mutex.h"
+#include "Exynos_OSAL_Event.h"
+
+#undef  EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "Exynos_OSAL_EVENT"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+OMX_ERRORTYPE Exynos_OSAL_SignalCreate(OMX_HANDLETYPE *eventHandle)
+{
+    Exynos_OSAL_THREADEVENT *event;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    event = (Exynos_OSAL_THREADEVENT *)Exynos_OSAL_Malloc(sizeof(Exynos_OSAL_THREADEVENT));
+    if (!event) {
+        ret = OMX_ErrorInsufficientResources;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Memset(event, 0, sizeof(Exynos_OSAL_THREADEVENT));
+    event->signal = OMX_FALSE;
+
+    ret = Exynos_OSAL_MutexCreate(&event->mutex);
+    if (ret != OMX_ErrorNone) {
+        Exynos_OSAL_Free(event);
+        goto EXIT;
+    }
+
+    if (pthread_cond_init(&event->condition, NULL)) {
+        Exynos_OSAL_MutexTerminate(event->mutex);
+        Exynos_OSAL_Free(event);
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    *eventHandle = (OMX_HANDLETYPE)event;
+    ret = OMX_ErrorNone;
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_SignalTerminate(OMX_HANDLETYPE eventHandle)
+{
+    Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if (!event) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    ret = Exynos_OSAL_MutexLock(event->mutex);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    if (pthread_cond_destroy(&event->condition)) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    ret = Exynos_OSAL_MutexUnlock(event->mutex);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    ret = Exynos_OSAL_MutexTerminate(event->mutex);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Free(event);
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_SignalReset(OMX_HANDLETYPE eventHandle)
+{
+    Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if (!event) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    ret = Exynos_OSAL_MutexLock(event->mutex);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    event->signal = OMX_FALSE;
+
+    Exynos_OSAL_MutexUnlock(event->mutex);
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_SignalSet(OMX_HANDLETYPE eventHandle)
+{
+    Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if (!event) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    ret = Exynos_OSAL_MutexLock(event->mutex);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    event->signal = OMX_TRUE;
+    pthread_cond_signal(&event->condition);
+
+    Exynos_OSAL_MutexUnlock(event->mutex);
+
+EXIT:
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_SignalWait(OMX_HANDLETYPE eventHandle, OMX_U32 ms)
+{
+    Exynos_OSAL_THREADEVENT *event = (Exynos_OSAL_THREADEVENT *)eventHandle;
+    OMX_ERRORTYPE         ret = OMX_ErrorNone;
+    struct timespec       timeout;
+    struct timeval        now;
+    int                   funcret = 0;
+    OMX_U32               tv_us;
+
+    FunctionIn();
+
+    if (!event) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    gettimeofday(&now, NULL);
+
+    tv_us = now.tv_usec + ms * 1000;
+    timeout.tv_sec = now.tv_sec + tv_us / 1000000;
+    timeout.tv_nsec = (tv_us % 1000000) * 1000;
+
+    ret = Exynos_OSAL_MutexLock(event->mutex);
+    if (ret != OMX_ErrorNone) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+
+    if (ms == 0) {
+        if (!event->signal)
+            ret = OMX_ErrorTimeout;
+    } else if (ms == DEF_MAX_WAIT_TIME) {
+        while (!event->signal)
+            pthread_cond_wait(&event->condition, (pthread_mutex_t *)(event->mutex));
+        ret = OMX_ErrorNone;
+    } else {
+        while (!event->signal) {
+            funcret = pthread_cond_timedwait(&event->condition, (pthread_mutex_t *)(event->mutex), &timeout);
+            if ((!event->signal) && (funcret == ETIMEDOUT)) {
+                ret = OMX_ErrorTimeout;
+                break;
+            }
+        }
+    }
+
+    Exynos_OSAL_MutexUnlock(event->mutex);
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
diff --git a/osal/Exynos_OSAL_Event.h b/osal/Exynos_OSAL_Event.h
new file mode 100644 (file)
index 0000000..f7ccd89
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ *
+ * 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_OSAL_Event.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef Exynos_OSAL_EVENT
+#define Exynos_OSAL_EVENT
+
+#include <pthread.h>
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+
+
+#define DEF_MAX_WAIT_TIME 0xFFFFFFFF
+
+typedef struct _Exynos_OSAL_THREADEVENT
+{
+    OMX_BOOL       signal;
+    OMX_HANDLETYPE mutex;
+    pthread_cond_t condition;
+} Exynos_OSAL_THREADEVENT;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+OMX_ERRORTYPE Exynos_OSAL_SignalCreate(OMX_HANDLETYPE *eventHandle);
+OMX_ERRORTYPE Exynos_OSAL_SignalTerminate(OMX_HANDLETYPE eventHandle);
+OMX_ERRORTYPE Exynos_OSAL_SignalReset(OMX_HANDLETYPE eventHandle);
+OMX_ERRORTYPE Exynos_OSAL_SignalSet(OMX_HANDLETYPE eventHandle);
+OMX_ERRORTYPE Exynos_OSAL_SignalWait(OMX_HANDLETYPE eventHandle, OMX_U32 ms);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/osal/Exynos_OSAL_Library.c b/osal/Exynos_OSAL_Library.c
new file mode 100644 (file)
index 0000000..88775ee
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ *
+ * 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_OSAL_Library.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 <dlfcn.h>
+
+#include "Exynos_OSAL_Library.h"
+
+
+void *Exynos_OSAL_dlopen(const char *filename, int flag)
+{
+    return dlopen(filename, flag);
+}
+
+void *Exynos_OSAL_dlsym(void *handle, const char *symbol)
+{
+    return dlsym(handle, symbol);
+}
+
+int Exynos_OSAL_dlclose(void *handle)
+{
+    return dlclose(handle);
+}
+
+const char *Exynos_OSAL_dlerror(void)
+{
+    return dlerror();
+}
diff --git a/osal/Exynos_OSAL_Library.h b/osal/Exynos_OSAL_Library.h
new file mode 100644 (file)
index 0000000..16bbd2a
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ *
+ * 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_OSAL_Library.h
+ * @brief
+ * @author     SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *    2012.02.20 : Create
+ */
+
+#ifndef Exynos_OSAL_LIBRARY
+#define Exynos_OSAL_LIBRARY
+
+#include "OMX_Types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void *Exynos_OSAL_dlopen(const char *filename, int flag);
+void *Exynos_OSAL_dlsym(void *handle, const char *symbol);
+int   Exynos_OSAL_dlclose(void *handle);
+const char *Exynos_OSAL_dlerror(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/osal/Exynos_OSAL_Log.c b/osal/Exynos_OSAL_Log.c
new file mode 100644 (file)
index 0000000..d4b0b8d
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ *
+ * 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_OSAL_Log.c
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#include <utils/Log.h>
+
+#include "Exynos_OSAL_Log.h"
+
+
+void _Exynos_OSAL_Log(EXYNOS_LOG_LEVEL logLevel, const char *tag, const char *msg, ...)
+{
+    va_list argptr;
+
+    va_start(argptr, msg);
+
+    switch (logLevel) {
+    case EXYNOS_LOG_TRACE:
+        __android_log_vprint(ANDROID_LOG_DEBUG, tag, msg, argptr);
+        break;
+    case EXYNOS_LOG_INFO:
+        __android_log_vprint(ANDROID_LOG_INFO, tag, msg, argptr);
+        break;
+    case EXYNOS_LOG_WARNING:
+        __android_log_vprint(ANDROID_LOG_WARN, tag, msg, argptr);
+        break;
+    case EXYNOS_LOG_ERROR:
+        __android_log_vprint(ANDROID_LOG_ERROR, tag, msg, argptr);
+        break;
+    default:
+        __android_log_vprint(ANDROID_LOG_VERBOSE, tag, msg, argptr);
+    }
+
+    va_end(argptr);
+}
diff --git a/osal/Exynos_OSAL_Log.h b/osal/Exynos_OSAL_Log.h
new file mode 100644 (file)
index 0000000..891d48c
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ *
+ * 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_OSAL_Log.h
+ * @brief
+ * @author      Yunji Kim (yunji.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ *   2012.8.27 : Add trace function
+ */
+
+#ifndef EXYNOS_OSAL_LOG
+#define EXYNOS_OSAL_LOG
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef EXYNOS_LOG_OFF
+#define EXYNOS_LOG
+#endif
+
+#ifndef EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_LOG"
+#endif
+
+#ifdef EXYNOS_TRACE_ON
+#define EXYNOS_TRACE
+#endif
+
+typedef enum _LOG_LEVEL
+{
+    EXYNOS_LOG_TRACE,
+    EXYNOS_LOG_INFO,
+    EXYNOS_LOG_WARNING,
+    EXYNOS_LOG_ERROR
+} EXYNOS_LOG_LEVEL;
+
+#ifdef EXYNOS_LOG
+#define Exynos_OSAL_Log(a, ...)    ((void)_Exynos_OSAL_Log(a, EXYNOS_LOG_TAG, __VA_ARGS__))
+#else
+#define Exynos_OSAL_Log(a, ...)                                                \
+    do {                                                                \
+        if (a == EXYNOS_LOG_ERROR)                                     \
+            ((void)_Exynos_OSAL_Log(a, EXYNOS_LOG_TAG, __VA_ARGS__)); \
+    } while (0)
+#endif
+
+#ifdef EXYNOS_TRACE
+#define FunctionIn() _Exynos_OSAL_Log(EXYNOS_LOG_TRACE, EXYNOS_LOG_TAG, "%s In , Line: %d", __FUNCTION__, __LINE__)
+#define FunctionOut() _Exynos_OSAL_Log(EXYNOS_LOG_TRACE, EXYNOS_LOG_TAG, "%s Out , Line: %d", __FUNCTION__, __LINE__)
+#else
+#define FunctionIn() ((void *)0)
+#define FunctionOut() ((void *)0)
+#endif
+
+extern void _Exynos_OSAL_Log(EXYNOS_LOG_LEVEL logLevel, const char *tag, const char *msg, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/osal/Exynos_OSAL_Memory.c b/osal/Exynos_OSAL_Memory.c
new file mode 100644 (file)
index 0000000..6783c17
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ *
+ * 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_OSAL_Memory.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_OSAL_Memory.h"
+
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+static int mem_cnt = 0;
+
+OMX_PTR Exynos_OSAL_Malloc(OMX_U32 size)
+{
+    mem_cnt++;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "alloc count: %d", mem_cnt);
+
+    return (OMX_PTR)malloc(size);
+}
+
+void Exynos_OSAL_Free(OMX_PTR addr)
+{
+    mem_cnt--;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "free count: %d", mem_cnt);
+
+    if (addr)
+        free(addr);
+
+    return;
+}
+
+OMX_PTR Exynos_OSAL_Memset(OMX_PTR dest, OMX_S32 c, OMX_S32 n)
+{
+    return memset(dest, c, n);
+}
+
+OMX_PTR Exynos_OSAL_Memcpy(OMX_PTR dest, OMX_PTR src, OMX_S32 n)
+{
+    return memcpy(dest, src, n);
+}
+
+OMX_PTR Exynos_OSAL_Memmove(OMX_PTR dest, OMX_PTR src, OMX_S32 n)
+{
+    return memmove(dest, src, n);
+}
diff --git a/osal/Exynos_OSAL_Memory.h b/osal/Exynos_OSAL_Memory.h
new file mode 100644 (file)
index 0000000..757d81c
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ *
+ * 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_OSAL_Memory.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef Exynos_OSAL_MEMORY
+#define Exynos_OSAL_MEMORY
+
+#include "OMX_Types.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_PTR Exynos_OSAL_Malloc(OMX_U32 size);
+void    Exynos_OSAL_Free(OMX_PTR addr);
+OMX_PTR Exynos_OSAL_Memset(OMX_PTR dest, OMX_S32 c, OMX_S32 n);
+OMX_PTR Exynos_OSAL_Memcpy(OMX_PTR dest, OMX_PTR src, OMX_S32 n);
+OMX_PTR Exynos_OSAL_Memmove(OMX_PTR dest, OMX_PTR src, OMX_S32 n);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/osal/Exynos_OSAL_Mutex.c b/osal/Exynos_OSAL_Mutex.c
new file mode 100644 (file)
index 0000000..4ef773c
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ *
+ * 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_OSAL_Mutex.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 <pthread.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_Mutex.h"
+
+OMX_ERRORTYPE Exynos_OSAL_MutexCreate(OMX_HANDLETYPE *mutexHandle)
+{
+    pthread_mutex_t *mutex;
+
+    mutex = (pthread_mutex_t *)Exynos_OSAL_Malloc(sizeof(pthread_mutex_t));
+    if (!mutex)
+        return OMX_ErrorInsufficientResources;
+
+    if (pthread_mutex_init(mutex, NULL) != 0) {
+        Exynos_OSAL_Free(mutex);
+        return OMX_ErrorUndefined;
+    }
+
+    *mutexHandle = (OMX_HANDLETYPE)mutex;
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_MutexTerminate(OMX_HANDLETYPE mutexHandle)
+{
+    pthread_mutex_t *mutex = (pthread_mutex_t *)mutexHandle;
+
+    if (mutex == NULL)
+        return OMX_ErrorBadParameter;
+
+    if (pthread_mutex_destroy(mutex) != 0)
+        return OMX_ErrorUndefined;
+
+    Exynos_OSAL_Free(mutex);
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_MutexLock(OMX_HANDLETYPE mutexHandle)
+{
+    pthread_mutex_t *mutex = (pthread_mutex_t *)mutexHandle;
+    int result;
+
+    if (mutex == NULL)
+        return OMX_ErrorBadParameter;
+
+    if (pthread_mutex_lock(mutex) != 0)
+        return OMX_ErrorUndefined;
+
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_MutexUnlock(OMX_HANDLETYPE mutexHandle)
+{
+    pthread_mutex_t *mutex = (pthread_mutex_t *)mutexHandle;
+    int result;
+
+    if (mutex == NULL)
+        return OMX_ErrorBadParameter;
+
+    if (pthread_mutex_unlock(mutex) != 0)
+        return OMX_ErrorUndefined;
+
+    return OMX_ErrorNone;
+}
diff --git a/osal/Exynos_OSAL_Mutex.h b/osal/Exynos_OSAL_Mutex.h
new file mode 100644 (file)
index 0000000..d8875ed
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ *
+ * 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_OSAL_Mutex.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+*/
+
+#ifndef Exynos_OSAL_MUTEX
+#define Exynos_OSAL_MUTEX
+
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_ERRORTYPE Exynos_OSAL_MutexCreate(OMX_HANDLETYPE *mutexHandle);
+OMX_ERRORTYPE Exynos_OSAL_MutexTerminate(OMX_HANDLETYPE mutexHandle);
+OMX_ERRORTYPE Exynos_OSAL_MutexLock(OMX_HANDLETYPE mutexHandle);
+OMX_ERRORTYPE Exynos_OSAL_MutexUnlock(OMX_HANDLETYPE mutexHandle);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/osal/Exynos_OSAL_Queue.c b/osal/Exynos_OSAL_Queue.c
new file mode 100644 (file)
index 0000000..4f226f7
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ *
+ * 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_OSAL_Queue.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_OSAL_Memory.h"
+#include "Exynos_OSAL_Mutex.h"
+#include "Exynos_OSAL_Queue.h"
+
+
+OMX_ERRORTYPE Exynos_OSAL_QueueCreate(EXYNOS_QUEUE *queueHandle, int maxNumElem)
+{
+    int i = 0;
+    EXYNOS_QElem *newqelem = NULL;
+    EXYNOS_QElem *currentqelem = NULL;
+    EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle;
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if (!queue)
+        return OMX_ErrorBadParameter;
+
+    ret = Exynos_OSAL_MutexCreate(&queue->qMutex);
+    if (ret != OMX_ErrorNone)
+        return ret;
+
+    queue->first = (EXYNOS_QElem *)Exynos_OSAL_Malloc(sizeof(EXYNOS_QElem));
+    if (queue->first == NULL)
+        return OMX_ErrorInsufficientResources;
+
+    Exynos_OSAL_Memset(queue->first, 0, sizeof(EXYNOS_QElem));
+    currentqelem = queue->last = queue->first;
+    queue->numElem = 0;
+    queue->maxNumElem = maxNumElem;
+    for (i = 0; i < (queue->maxNumElem - 2); i++) {
+        newqelem = (EXYNOS_QElem *)Exynos_OSAL_Malloc(sizeof(EXYNOS_QElem));
+        if (newqelem == NULL) {
+            while (queue->first != NULL) {
+                currentqelem = queue->first->qNext;
+                Exynos_OSAL_Free((OMX_PTR)queue->first);
+                queue->first = currentqelem;
+            }
+            return OMX_ErrorInsufficientResources;
+        } else {
+            Exynos_OSAL_Memset(newqelem, 0, sizeof(EXYNOS_QElem));
+            currentqelem->qNext = newqelem;
+            currentqelem = newqelem;
+        }
+    }
+
+    currentqelem->qNext = queue->first;
+
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_QueueTerminate(EXYNOS_QUEUE *queueHandle)
+{
+    int i = 0;
+    EXYNOS_QElem *currentqelem = NULL;
+    EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    if (!queue)
+        return OMX_ErrorBadParameter;
+
+    for ( i = 0; i < (queue->maxNumElem - 2); i++) {
+        currentqelem = queue->first->qNext;
+        Exynos_OSAL_Free(queue->first);
+        queue->first = currentqelem;
+    }
+
+    if(queue->first) {
+        Exynos_OSAL_Free(queue->first);
+        queue->first = NULL;
+    }
+
+    ret = Exynos_OSAL_MutexTerminate(queue->qMutex);
+
+    return ret;
+}
+
+int Exynos_OSAL_Queue(EXYNOS_QUEUE *queueHandle, void *data)
+{
+    EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle;
+    if (queue == NULL)
+        return -1;
+
+    Exynos_OSAL_MutexLock(queue->qMutex);
+
+    if ((queue->last->data != NULL) || (queue->numElem >= queue->maxNumElem)) {
+        Exynos_OSAL_MutexUnlock(queue->qMutex);
+        return -1;
+    }
+    queue->last->data = data;
+    queue->last = queue->last->qNext;
+    queue->numElem++;
+
+    Exynos_OSAL_MutexUnlock(queue->qMutex);
+    return 0;
+}
+
+void *Exynos_OSAL_Dequeue(EXYNOS_QUEUE *queueHandle)
+{
+    void *data = NULL;
+    EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle;
+    if (queue == NULL)
+        return NULL;
+
+    Exynos_OSAL_MutexLock(queue->qMutex);
+
+    if ((queue->first->data == NULL) || (queue->numElem <= 0)) {
+        Exynos_OSAL_MutexUnlock(queue->qMutex);
+        return NULL;
+    }
+    data = queue->first->data;
+    queue->first->data = NULL;
+    queue->first = queue->first->qNext;
+    queue->numElem--;
+
+    Exynos_OSAL_MutexUnlock(queue->qMutex);
+    return data;
+}
+
+int Exynos_OSAL_GetElemNum(EXYNOS_QUEUE *queueHandle)
+{
+    int ElemNum = 0;
+    EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle;
+    if (queue == NULL)
+        return -1;
+
+    Exynos_OSAL_MutexLock(queue->qMutex);
+    ElemNum = queue->numElem;
+    Exynos_OSAL_MutexUnlock(queue->qMutex);
+    return ElemNum;
+}
+
+int Exynos_OSAL_SetElemNum(EXYNOS_QUEUE *queueHandle, int ElemNum)
+{
+    EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle;
+    if (queue == NULL)
+        return -1;
+
+    Exynos_OSAL_MutexLock(queue->qMutex);
+    queue->numElem = ElemNum; 
+    Exynos_OSAL_MutexUnlock(queue->qMutex);
+    return ElemNum;
+}
+
+int Exynos_OSAL_ResetQueue(EXYNOS_QUEUE *queueHandle)
+{
+    EXYNOS_QUEUE *queue = (EXYNOS_QUEUE *)queueHandle;
+    EXYNOS_QElem *currentqelem = NULL;
+
+    if (queue == NULL)
+        return -1;
+
+    Exynos_OSAL_MutexLock(queue->qMutex);
+    queue->first->data = NULL;
+    currentqelem = queue->first->qNext;
+    while (currentqelem != queue->first) {
+        currentqelem->data = NULL;
+        currentqelem = currentqelem->qNext;
+    }
+    queue->last = queue->first;
+    queue->numElem = 0x00;
+    Exynos_OSAL_MutexUnlock(queue->qMutex);
+
+    return 0;
+}
diff --git a/osal/Exynos_OSAL_Queue.h b/osal/Exynos_OSAL_Queue.h
new file mode 100644 (file)
index 0000000..6300b45
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ *
+ * 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_OSAL_Queue.h
+ * @brief
+ * @author    SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version    2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OSAL_QUEUE
+#define EXYNOS_OSAL_QUEUE
+
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+
+#define QUEUE_ELEMENTS        10
+#define MAX_QUEUE_ELEMENTS    40
+
+typedef struct _EXYNOS_QElem
+{
+    void             *data;
+    struct _EXYNOS_QElem *qNext;
+} EXYNOS_QElem;
+
+typedef struct _EXYNOS_QUEUE
+{
+    EXYNOS_QElem     *first;
+    EXYNOS_QElem     *last;
+    int            numElem;
+    int            maxNumElem;
+    OMX_HANDLETYPE qMutex;
+} EXYNOS_QUEUE;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_ERRORTYPE Exynos_OSAL_QueueCreate(EXYNOS_QUEUE *queueHandle, int maxNumElem);
+OMX_ERRORTYPE Exynos_OSAL_QueueTerminate(EXYNOS_QUEUE *queueHandle);
+int           Exynos_OSAL_Queue(EXYNOS_QUEUE *queueHandle, void *data);
+void         *Exynos_OSAL_Dequeue(EXYNOS_QUEUE *queueHandle);
+int           Exynos_OSAL_GetElemNum(EXYNOS_QUEUE *queueHandle);
+int           Exynos_OSAL_SetElemNum(EXYNOS_QUEUE *queueHandle, int ElemNum);
+int           Exynos_OSAL_ResetQueue(EXYNOS_QUEUE *queueHandle);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/osal/Exynos_OSAL_Semaphore.c b/osal/Exynos_OSAL_Semaphore.c
new file mode 100644 (file)
index 0000000..b31b952
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ *
+ * 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_OSAL_Semaphore.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 <pthread.h>
+#include <semaphore.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_Semaphore.h"
+
+#undef EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_LOG_SEMA"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+OMX_ERRORTYPE Exynos_OSAL_SemaphoreCreate(OMX_HANDLETYPE *semaphoreHandle)
+{
+    sem_t *sema;
+
+    sema = (sem_t *)Exynos_OSAL_Malloc(sizeof(sem_t));
+    if (!sema)
+        return OMX_ErrorInsufficientResources;
+
+    if (sem_init(sema, 0, 0) != 0) {
+        Exynos_OSAL_Free(sema);
+        return OMX_ErrorUndefined;
+    }
+
+    *semaphoreHandle = (OMX_HANDLETYPE)sema;
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_SemaphoreTerminate(OMX_HANDLETYPE semaphoreHandle)
+{
+    sem_t *sema = (sem_t *)semaphoreHandle;
+
+    if (sema == NULL)
+        return OMX_ErrorBadParameter;
+
+    if (sem_destroy(sema) != 0)
+        return OMX_ErrorUndefined;
+
+    Exynos_OSAL_Free(sema);
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_SemaphoreWait(OMX_HANDLETYPE semaphoreHandle)
+{
+    sem_t *sema = (sem_t *)semaphoreHandle;
+
+    FunctionIn();
+
+    if (sema == NULL)
+        return OMX_ErrorBadParameter;
+
+    if (sem_wait(sema) != 0)
+        return OMX_ErrorUndefined;
+
+    FunctionOut();
+
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_SemaphorePost(OMX_HANDLETYPE semaphoreHandle)
+{
+    sem_t *sema = (sem_t *)semaphoreHandle;
+
+    FunctionIn();
+
+    if (sema == NULL)
+        return OMX_ErrorBadParameter;
+
+    if (sem_post(sema) != 0)
+        return OMX_ErrorUndefined;
+
+    FunctionOut();
+
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_Set_SemaphoreCount(OMX_HANDLETYPE semaphoreHandle, OMX_S32 val)
+{
+    sem_t *sema = (sem_t *)semaphoreHandle;
+
+    if (sema == NULL)
+        return OMX_ErrorBadParameter;
+
+    if (sem_init(sema, 0, val) != 0)
+        return OMX_ErrorUndefined;
+
+    return OMX_ErrorNone;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_Get_SemaphoreCount(OMX_HANDLETYPE semaphoreHandle, OMX_S32 *val)
+{
+    sem_t *sema = (sem_t *)semaphoreHandle;
+    int semaVal = 0;
+
+    if (sema == NULL)
+        return OMX_ErrorBadParameter;
+
+    if (sem_getvalue(sema, &semaVal) != 0)
+        return OMX_ErrorUndefined;
+
+    *val = (OMX_S32)semaVal;
+
+    return OMX_ErrorNone;
+}
diff --git a/osal/Exynos_OSAL_Semaphore.h b/osal/Exynos_OSAL_Semaphore.h
new file mode 100644 (file)
index 0000000..626a79c
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ *
+ * 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_OSAL_Semaphore.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef Exynos_OSAL_SEMAPHORE
+#define Exynos_OSAL_SEMAPHORE
+
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_ERRORTYPE Exynos_OSAL_SemaphoreCreate(OMX_HANDLETYPE *semaphoreHandle);
+OMX_ERRORTYPE Exynos_OSAL_SemaphoreTerminate(OMX_HANDLETYPE semaphoreHandle);
+OMX_ERRORTYPE Exynos_OSAL_SemaphoreWait(OMX_HANDLETYPE semaphoreHandle);
+OMX_ERRORTYPE Exynos_OSAL_SemaphorePost(OMX_HANDLETYPE semaphoreHandle);
+OMX_ERRORTYPE Exynos_OSAL_Set_SemaphoreCount(OMX_HANDLETYPE semaphoreHandle, OMX_S32 val);
+OMX_ERRORTYPE Exynos_OSAL_Get_SemaphoreCount(OMX_HANDLETYPE semaphoreHandle, OMX_S32 *val);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/osal/Exynos_OSAL_SharedMemory.c b/osal/Exynos_OSAL_SharedMemory.c
new file mode 100644 (file)
index 0000000..775d48b
--- /dev/null
@@ -0,0 +1,469 @@
+/*
+ *
+ * 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_OSAL_SharedMemory.c
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ *              Taehwan Kim (t_h.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <pthread.h>
+#include <cutils/log.h>
+#include <cutils/atomic.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+#include "Exynos_OSAL_SharedMemory.h"
+#include "ion.h"
+
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+static int mem_cnt = 0;
+
+struct EXYNOS_SHAREDMEM_LIST;
+typedef struct _EXYNOS_SHAREDMEM_LIST
+{
+    OMX_U32                        IONBuffer;
+    OMX_PTR                        mapAddr;
+    OMX_U32                        allocSize;
+    bool                           owner;
+    struct _EXYNOS_SHAREDMEM_LIST *pNextMemory;
+} EXYNOS_SHAREDMEM_LIST;
+
+typedef struct _EXYNOS_SHARED_MEMORY
+{
+    OMX_HANDLETYPE         hIONHandle;
+    EXYNOS_SHAREDMEM_LIST *pAllocMemory;
+    OMX_HANDLETYPE         hSMMutex;
+} EXYNOS_SHARED_MEMORY;
+
+
+OMX_HANDLETYPE Exynos_OSAL_SharedMemory_Open()
+{
+    EXYNOS_SHARED_MEMORY *pHandle = NULL;
+    ion_client            IONClient = 0;
+
+    pHandle = (EXYNOS_SHARED_MEMORY *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHARED_MEMORY));
+    Exynos_OSAL_Memset(pHandle, 0, sizeof(EXYNOS_SHARED_MEMORY));
+    if (pHandle == NULL)
+        goto EXIT;
+
+    IONClient = (OMX_HANDLETYPE)ion_client_create();
+    if (IONClient <= 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_client_create Error: %d", IONClient);
+        Exynos_OSAL_Free((void *)pHandle);
+        pHandle = NULL;
+        goto EXIT;
+    }
+
+    pHandle->hIONHandle = IONClient;
+
+    Exynos_OSAL_MutexCreate(&pHandle->hSMMutex);
+
+EXIT:
+    return (OMX_HANDLETYPE)pHandle;
+}
+
+void Exynos_OSAL_SharedMemory_Close(OMX_HANDLETYPE handle)
+{
+    EXYNOS_SHARED_MEMORY  *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
+    EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
+    EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
+    EXYNOS_SHAREDMEM_LIST *pDeleteElement = NULL;
+
+    if (pHandle == NULL)
+        goto EXIT;
+
+    Exynos_OSAL_MutexLock(pHandle->hSMMutex);
+    pCurrentElement = pSMList = pHandle->pAllocMemory;
+
+    while (pCurrentElement != NULL) {
+        pDeleteElement = pCurrentElement;
+        pCurrentElement = pCurrentElement->pNextMemory;
+
+        if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize))
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail");
+
+        pDeleteElement->mapAddr = NULL;
+        pDeleteElement->allocSize = 0;
+
+        if (pDeleteElement->owner)
+            ion_free(pDeleteElement->IONBuffer);
+        pDeleteElement->IONBuffer = 0;
+
+        Exynos_OSAL_Free(pDeleteElement);
+
+        mem_cnt--;
+        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt);
+    }
+
+    pHandle->pAllocMemory = pSMList = NULL;
+    Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+
+    Exynos_OSAL_MutexTerminate(pHandle->hSMMutex);
+    pHandle->hSMMutex = NULL;
+
+    ion_client_destroy((ion_client)pHandle->hIONHandle);
+    pHandle->hIONHandle = NULL;
+
+    Exynos_OSAL_Free(pHandle);
+
+EXIT:
+    return;
+}
+
+OMX_PTR Exynos_OSAL_SharedMemory_Alloc(OMX_HANDLETYPE handle, OMX_U32 size, MEMORY_TYPE memoryType)
+{
+    EXYNOS_SHARED_MEMORY  *pHandle         = (EXYNOS_SHARED_MEMORY *)handle;
+    EXYNOS_SHAREDMEM_LIST *pSMList         = NULL;
+    EXYNOS_SHAREDMEM_LIST *pElement        = NULL;
+    EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
+    ion_buffer             IONBuffer       = 0;
+    OMX_PTR                pBuffer         = NULL;
+    unsigned int mask;
+    unsigned int flag;
+
+    if (pHandle == NULL)
+        goto EXIT;
+
+    pElement = (EXYNOS_SHAREDMEM_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHAREDMEM_LIST));
+    Exynos_OSAL_Memset(pElement, 0, sizeof(EXYNOS_SHAREDMEM_LIST));
+    pElement->owner = true;
+
+    switch (memoryType) {
+    case SECURE_MEMORY:
+        mask = ION_HEAP_EXYNOS_CONTIG_MASK;
+        flag = ION_EXYNOS_MFC_INPUT_MASK;
+        break;
+    case NORMAL_MEMORY:
+        mask = ION_HEAP_EXYNOS_MASK;
+        flag = 0;
+        break;
+    case SYSTEM_MEMORY:
+        mask = ION_HEAP_SYSTEM_MASK;
+        flag = ION_FLAG_CACHED;
+        break;
+    default:
+        pBuffer = NULL;
+        goto EXIT;
+        break;
+    }
+
+    IONBuffer = ion_alloc((ion_client)pHandle->hIONHandle, size, 0, mask, flag);
+
+    if (IONBuffer <= 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_alloc Error: %d", IONBuffer);
+        Exynos_OSAL_Free((OMX_PTR)pElement);
+        goto EXIT;
+    }
+
+    pBuffer = ion_map(IONBuffer, size, 0);
+    if (pBuffer == MAP_FAILED) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_map Error");
+        ion_free(IONBuffer);
+        Exynos_OSAL_Free((OMX_PTR)pElement);
+        pBuffer = NULL;
+        goto EXIT;
+    }
+
+    pElement->IONBuffer = IONBuffer;
+    pElement->mapAddr = pBuffer;
+    pElement->allocSize = size;
+    pElement->pNextMemory = NULL;
+
+    Exynos_OSAL_MutexLock(pHandle->hSMMutex);
+    pSMList = pHandle->pAllocMemory;
+    if (pSMList == NULL) {
+        pHandle->pAllocMemory = pSMList = pElement;
+    } else {
+        pCurrentElement = pSMList;
+        while (pCurrentElement->pNextMemory != NULL) {
+            pCurrentElement = pCurrentElement->pNextMemory;
+        }
+        pCurrentElement->pNextMemory = pElement;
+    }
+    Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+
+    mem_cnt++;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory alloc count: %d", mem_cnt);
+
+EXIT:
+    return pBuffer;
+}
+
+void Exynos_OSAL_SharedMemory_Free(OMX_HANDLETYPE handle, OMX_PTR pBuffer)
+{
+    EXYNOS_SHARED_MEMORY  *pHandle         = (EXYNOS_SHARED_MEMORY *)handle;
+    EXYNOS_SHAREDMEM_LIST *pSMList         = NULL;
+    EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
+    EXYNOS_SHAREDMEM_LIST *pDeleteElement  = NULL;
+
+    if (pHandle == NULL)
+        goto EXIT;
+
+    Exynos_OSAL_MutexLock(pHandle->hSMMutex);
+    pSMList = pHandle->pAllocMemory;
+    if (pSMList == NULL) {
+        Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+        goto EXIT;
+    }
+
+    pCurrentElement = pSMList;
+    if (pSMList->mapAddr == pBuffer) {
+        pDeleteElement = pSMList;
+        pHandle->pAllocMemory = pSMList = pSMList->pNextMemory;
+    } else {
+        while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
+               (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr != pBuffer))
+            pCurrentElement = pCurrentElement->pNextMemory;
+
+        if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
+            (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr == pBuffer)) {
+            pDeleteElement = pCurrentElement->pNextMemory;
+            pCurrentElement->pNextMemory = pDeleteElement->pNextMemory;
+        } else {
+            Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory");
+            goto EXIT;
+        }
+    }
+    Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+
+    if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail");
+        goto EXIT;
+    }
+    pDeleteElement->mapAddr = NULL;
+    pDeleteElement->allocSize = 0;
+
+    if (pDeleteElement->owner)
+        ion_free(pDeleteElement->IONBuffer);
+    pDeleteElement->IONBuffer = 0;
+
+    Exynos_OSAL_Free(pDeleteElement);
+
+    mem_cnt--;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt);
+
+EXIT:
+    return;
+}
+
+OMX_PTR Exynos_OSAL_SharedMemory_Map(OMX_HANDLETYPE handle, OMX_U32 size, unsigned int ionfd)
+{
+    EXYNOS_SHARED_MEMORY  *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
+    EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
+    EXYNOS_SHAREDMEM_LIST *pElement = NULL;
+    EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
+    ion_buffer IONBuffer = 0;
+    OMX_PTR pBuffer = NULL;
+
+    if (pHandle == NULL)
+        goto EXIT;
+
+    pElement = (EXYNOS_SHAREDMEM_LIST *)Exynos_OSAL_Malloc(sizeof(EXYNOS_SHAREDMEM_LIST));
+    Exynos_OSAL_Memset(pElement, 0, sizeof(EXYNOS_SHAREDMEM_LIST));
+
+    IONBuffer = (OMX_PTR)ionfd;
+
+    if (IONBuffer <= 0) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_alloc Error: %d", IONBuffer);
+        Exynos_OSAL_Free((void*)pElement);
+        goto EXIT;
+    }
+
+    pBuffer = ion_map(IONBuffer, size, 0);
+    if (pBuffer == NULL) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_map Error");
+        ion_free(IONBuffer);
+        Exynos_OSAL_Free((void*)pElement);
+        goto EXIT;
+    }
+
+    pElement->IONBuffer = IONBuffer;
+    pElement->mapAddr = pBuffer;
+    pElement->allocSize = size;
+    pElement->pNextMemory = NULL;
+
+    Exynos_OSAL_MutexLock(pHandle->hSMMutex);
+    pSMList = pHandle->pAllocMemory;
+    if (pSMList == NULL) {
+        pHandle->pAllocMemory = pSMList = pElement;
+    } else {
+        pCurrentElement = pSMList;
+        while (pCurrentElement->pNextMemory != NULL) {
+            pCurrentElement = pCurrentElement->pNextMemory;
+        }
+        pCurrentElement->pNextMemory = pElement;
+    }
+    Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+
+    mem_cnt++;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory alloc count: %d", mem_cnt);
+
+EXIT:
+    return pBuffer;
+}
+
+void Exynos_OSAL_SharedMemory_Unmap(OMX_HANDLETYPE handle, unsigned int ionfd)
+{
+    EXYNOS_SHARED_MEMORY  *pHandle = (EXYNOS_SHARED_MEMORY *)handle;
+    EXYNOS_SHAREDMEM_LIST *pSMList = NULL;
+    EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
+    EXYNOS_SHAREDMEM_LIST *pDeleteElement = NULL;
+
+    if (pHandle == NULL)
+        goto EXIT;
+
+    Exynos_OSAL_MutexLock(pHandle->hSMMutex);
+    pSMList = pHandle->pAllocMemory;
+    if (pSMList == NULL) {
+        Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+        goto EXIT;
+    }
+
+    pCurrentElement = pSMList;
+    if (pSMList->IONBuffer == ionfd) {
+        pDeleteElement = pSMList;
+        pHandle->pAllocMemory = pSMList = pSMList->pNextMemory;
+    } else {
+        while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
+               (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer != ionfd))
+            pCurrentElement = pCurrentElement->pNextMemory;
+
+        if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
+            (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer == ionfd)) {
+            pDeleteElement = pCurrentElement->pNextMemory;
+            pCurrentElement->pNextMemory = pDeleteElement->pNextMemory;
+        } else {
+            Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Can not find SharedMemory");
+            goto EXIT;
+        }
+    }
+    Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+
+    if (ion_unmap(pDeleteElement->mapAddr, pDeleteElement->allocSize)) {
+        Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "ion_unmap fail");
+        goto EXIT;
+    }
+    pDeleteElement->mapAddr = NULL;
+    pDeleteElement->allocSize = 0;
+    pDeleteElement->IONBuffer = 0;
+
+    Exynos_OSAL_Free(pDeleteElement);
+
+    mem_cnt--;
+    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "SharedMemory free count: %d", mem_cnt);
+
+EXIT:
+    return;
+}
+
+int Exynos_OSAL_SharedMemory_VirtToION(OMX_HANDLETYPE handle, OMX_PTR pBuffer)
+{
+    EXYNOS_SHARED_MEMORY  *pHandle         = (EXYNOS_SHARED_MEMORY *)handle;
+    EXYNOS_SHAREDMEM_LIST *pSMList         = NULL;
+    EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
+    EXYNOS_SHAREDMEM_LIST *pFindElement    = NULL;
+    int ion_addr = 0;
+    if (pHandle == NULL || pBuffer == NULL)
+        goto EXIT;
+
+    Exynos_OSAL_MutexLock(pHandle->hSMMutex);
+    pSMList = pHandle->pAllocMemory;
+    if (pSMList == NULL) {
+        Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+        goto EXIT;
+    }
+
+    pCurrentElement = pSMList;
+    if (pSMList->mapAddr == pBuffer) {
+        pFindElement = pSMList;
+    } else {
+        while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
+               (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr != pBuffer))
+            pCurrentElement = pCurrentElement->pNextMemory;
+
+        if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
+            (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->mapAddr == pBuffer)) {
+            pFindElement = pCurrentElement->pNextMemory;
+        } else {
+            Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+            Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Can not find SharedMemory");
+            goto EXIT;
+        }
+    }
+    Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+
+    ion_addr = pFindElement->IONBuffer;
+
+EXIT:
+    return ion_addr;
+}
+
+OMX_PTR Exynos_OSAL_SharedMemory_IONToVirt(OMX_HANDLETYPE handle, int ion_addr)
+{
+    EXYNOS_SHARED_MEMORY  *pHandle         = (EXYNOS_SHARED_MEMORY *)handle;
+    EXYNOS_SHAREDMEM_LIST *pSMList         = NULL;
+    EXYNOS_SHAREDMEM_LIST *pCurrentElement = NULL;
+    EXYNOS_SHAREDMEM_LIST *pFindElement    = NULL;
+    OMX_PTR pBuffer = NULL;
+    if (pHandle == NULL || ion_addr == 0)
+        goto EXIT;
+
+    Exynos_OSAL_MutexLock(pHandle->hSMMutex);
+    pSMList = pHandle->pAllocMemory;
+    if (pSMList == NULL) {
+        Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+        goto EXIT;
+    }
+
+    pCurrentElement = pSMList;
+    if (pSMList->IONBuffer == ion_addr) {
+        pFindElement = pSMList;
+    } else {
+        while ((pCurrentElement != NULL) && (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
+               (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer != ion_addr))
+            pCurrentElement = pCurrentElement->pNextMemory;
+
+        if ((((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory)) != NULL) &&
+            (((EXYNOS_SHAREDMEM_LIST *)(pCurrentElement->pNextMemory))->IONBuffer == ion_addr)) {
+            pFindElement = pCurrentElement->pNextMemory;
+        } else {
+            Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+            Exynos_OSAL_Log(EXYNOS_LOG_WARNING, "Can not find SharedMemory");
+            goto EXIT;
+        }
+    }
+    Exynos_OSAL_MutexUnlock(pHandle->hSMMutex);
+
+    pBuffer = pFindElement->mapAddr;
+
+EXIT:
+    return pBuffer;
+}
diff --git a/osal/Exynos_OSAL_SharedMemory.h b/osal/Exynos_OSAL_SharedMemory.h
new file mode 100644 (file)
index 0000000..6b644c7
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ *
+ * 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_OSAL_SharedMemory.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ *              Taehwan Kim (t_h.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef EXYNOS_OSAL_SHAREDMEMORY
+#define EXYNOS_OSAL_SHAREDMEMORY
+
+#include "OMX_Types.h"
+
+typedef enum _MEMORY_TYPE
+{
+    NORMAL_MEMORY = 0x00,
+    SECURE_MEMORY = 0x01,
+    SYSTEM_MEMORY = 0x02
+} MEMORY_TYPE;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_HANDLETYPE Exynos_OSAL_SharedMemory_Open();
+void Exynos_OSAL_SharedMemory_Close(OMX_HANDLETYPE handle);
+OMX_PTR Exynos_OSAL_SharedMemory_Alloc(OMX_HANDLETYPE handle, OMX_U32 size, MEMORY_TYPE memoryType);
+void Exynos_OSAL_SharedMemory_Free(OMX_HANDLETYPE handle, OMX_PTR pBuffer);
+int Exynos_OSAL_SharedMemory_VirtToION(OMX_HANDLETYPE handle, OMX_PTR pBuffer);
+OMX_PTR Exynos_OSAL_SharedMemory_IONToVirt(OMX_HANDLETYPE handle, int ion_addr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/osal/Exynos_OSAL_Thread.c b/osal/Exynos_OSAL_Thread.c
new file mode 100644 (file)
index 0000000..9e9554f
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ *
+ * 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_OSAL_Thread.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 <pthread.h>
+#include <semaphore.h>
+#include <errno.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "Exynos_OSAL_Memory.h"
+#include "Exynos_OSAL_Thread.h"
+
+#undef EXYNOS_LOG_TAG
+#define EXYNOS_LOG_TAG    "EXYNOS_LOG_THREAD"
+#define EXYNOS_LOG_OFF
+#include "Exynos_OSAL_Log.h"
+
+
+typedef struct _EXYNOS_THREAD_HANDLE_TYPE
+{
+    pthread_t          pthread;
+    pthread_attr_t     attr;
+    struct sched_param schedparam;
+    int                stack_size;
+} EXYNOS_THREAD_HANDLE_TYPE;
+
+
+OMX_ERRORTYPE Exynos_OSAL_ThreadCreate(OMX_HANDLETYPE *threadHandle, OMX_PTR function_name, OMX_PTR argument)
+{
+    FunctionIn();
+
+    int result = 0;
+    int detach_ret = 0;
+    EXYNOS_THREAD_HANDLE_TYPE *thread;
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+
+    thread = Exynos_OSAL_Malloc(sizeof(EXYNOS_THREAD_HANDLE_TYPE));
+    Exynos_OSAL_Memset(thread, 0, sizeof(EXYNOS_THREAD_HANDLE_TYPE));
+
+    pthread_attr_init(&thread->attr);
+    if (thread->stack_size != 0)
+        pthread_attr_setstacksize(&thread->attr, thread->stack_size);
+
+    /* set priority */
+    if (thread->schedparam.sched_priority != 0)
+        pthread_attr_setschedparam(&thread->attr, &thread->schedparam);
+
+    detach_ret = pthread_attr_setdetachstate(&thread->attr, PTHREAD_CREATE_JOINABLE);
+    if (detach_ret != 0) {
+        Exynos_OSAL_Free(thread);
+        *threadHandle = NULL;
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    result = pthread_create(&thread->pthread, &thread->attr, function_name, (void *)argument);
+    /* pthread_setschedparam(thread->pthread, SCHED_RR, &thread->schedparam); */
+
+    switch (result) {
+    case 0:
+        *threadHandle = (OMX_HANDLETYPE)thread;
+        ret = OMX_ErrorNone;
+        break;
+    case EAGAIN:
+        Exynos_OSAL_Free(thread);
+        *threadHandle = NULL;
+        ret = OMX_ErrorInsufficientResources;
+        break;
+    default:
+        Exynos_OSAL_Free(thread);
+        *threadHandle = NULL;
+        ret = OMX_ErrorUndefined;
+        break;
+    }
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_ThreadTerminate(OMX_HANDLETYPE threadHandle)
+{
+    FunctionIn();
+
+    OMX_ERRORTYPE ret = OMX_ErrorNone;
+    EXYNOS_THREAD_HANDLE_TYPE *thread = (EXYNOS_THREAD_HANDLE_TYPE *)threadHandle;
+
+    if (!thread) {
+        ret = OMX_ErrorBadParameter;
+        goto EXIT;
+    }
+    if (pthread_join(thread->pthread, NULL) != 0) {
+        ret = OMX_ErrorUndefined;
+        goto EXIT;
+    }
+
+    Exynos_OSAL_Free(thread);
+    ret = OMX_ErrorNone;
+
+EXIT:
+    FunctionOut();
+
+    return ret;
+}
+
+OMX_ERRORTYPE Exynos_OSAL_ThreadCancel(OMX_HANDLETYPE threadHandle)
+{
+    EXYNOS_THREAD_HANDLE_TYPE *thread = (EXYNOS_THREAD_HANDLE_TYPE *)threadHandle;
+
+    if (!thread)
+        return OMX_ErrorBadParameter;
+
+    /* thread_cancel(thread->pthread); */
+    pthread_exit(&thread->pthread);
+    pthread_join(thread->pthread, NULL);
+
+    Exynos_OSAL_Free(thread);
+    return OMX_ErrorNone;
+}
+
+void Exynos_OSAL_ThreadExit(void *value_ptr)
+{
+    pthread_exit(value_ptr);
+    return;
+}
+
+void Exynos_OSAL_SleepMillisec(OMX_U32 ms)
+{
+    usleep(ms * 1000);
+    return;
+}
diff --git a/osal/Exynos_OSAL_Thread.h b/osal/Exynos_OSAL_Thread.h
new file mode 100644 (file)
index 0000000..2048cb9
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ *
+ * 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_OSAL_Thread.h
+ * @brief
+ * @author      SeungBeom Kim (sbcrux.kim@samsung.com)
+ * @version     2.0.0
+ * @history
+ *   2012.02.20 : Create
+ */
+
+#ifndef Exynos_OSAL_THREAD
+#define Exynos_OSAL_THREAD
+
+#include "OMX_Types.h"
+#include "OMX_Core.h"
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+OMX_ERRORTYPE Exynos_OSAL_ThreadCreate(OMX_HANDLETYPE *threadHandle, OMX_PTR function_name, OMX_PTR argument);
+OMX_ERRORTYPE Exynos_OSAL_ThreadTerminate(OMX_HANDLETYPE threadHandle);
+OMX_ERRORTYPE Exynos_OSAL_ThreadCancel(OMX_HANDLETYPE threadHandle);
+void          Exynos_OSAL_ThreadExit(void *value_ptr);
+void          Exynos_OSAL_SleepMillisec(OMX_U32 ms);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif