exynos_omx: multi_thread: input and output buffer struct Integration.
authorSeungBeom Kim <sbcrux.kim@samsung.com>
Wed, 4 Jul 2012 06:25:59 +0000 (15:25 +0900)
committerDima Zavin <dima@android.com>
Tue, 24 Jul 2012 22:12:42 +0000 (15:12 -0700)
- remove CODEC_DEC_INPUT_BUFFER
- remove CODEC_DEC_OUTPUT_BUFFER
- add new struct  CODEC_DEC_BUFFER

Change-Id: Ie4afaf5f41834606c9f5220a0f9b031f0d05b807
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.c
exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h
exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c
exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c
exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c

index 0e0feb5ed74ccd55383867425a6c609f31a4abac..da539d2ded513ce45d4050856a5b059e6bfcd3b2 100644 (file)
@@ -131,13 +131,11 @@ OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosCo
 {
     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
     EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;
-    CODEC_DEC_INPUT_BUFFER *pInputCodecBuffer = (CODEC_DEC_INPUT_BUFFER*)codecBuffer;
+    CODEC_DEC_BUFFER *pInputCodecBuffer = (CODEC_DEC_BUFFER *)codecBuffer;
 
-    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: buffer=%p\n", __func__, codecBuffer);
-
-    pData->buffer.singlePlaneBuffer.dataBuffer = pInputCodecBuffer->VirAddr;
-    pData->buffer.singlePlaneBuffer.fd = pInputCodecBuffer->fd;
-    pData->allocSize     = pInputCodecBuffer->bufferSize;
+    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;
@@ -199,6 +197,131 @@ void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U3
     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[0],             /* y addr */
+        pSrcBuf[1],             /* u addr or uv addr */
+        pSrcBuf[2],             /* v addr or none */
+        0);                     /* ion fd */
+    csc_set_dst_buffer(
+        pVideoDec->csc_handle,  /* handle */
+        pYUVBuf[0],             /* y addr */
+        pYUVBuf[1],             /* u addr or uv addr */
+        pYUVBuf[2],             /* v addr or none */
+        0);                     /* ion 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;
@@ -209,9 +332,6 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
     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();
 
@@ -242,30 +362,14 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
 
             /* reset dataBuffer */
             Exynos_ResetDataBuffer(inputUseBuffer);
-
-            flagEOF = OMX_TRUE;
         } else if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
             checkInputStream = inputUseBuffer->bufferHeader->pBuffer + inputUseBuffer->usedDataLen;
             checkInputStreamLen = inputUseBuffer->remainDataLen;
 
-            if (srcInputData->dataLen == 0) {
-                previousFrameEOF = OMX_TRUE;
-            } else {
-                previousFrameEOF = OMX_FALSE;
-            }
-
-            flagEOF = OMX_TRUE;
             pExynosComponent->bUseFlagEOF = OMX_TRUE;
 
-            checkedSize = checkInputStreamLen;
-
-            if (flagEOF == OMX_TRUE) {
-                copySize = checkedSize;
-                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
-            } else {
-                copySize = checkInputStreamLen;
-                Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_FALSE");
-            }
+            copySize = checkInputStreamLen;
+            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
 
             if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) {
                 if (copySize > 0) {
@@ -288,7 +392,7 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
                 pExynosComponent->pCallbacks->EventHandler((OMX_HANDLETYPE)pOMXComponent,
                                                         pExynosComponent->callbackData,
                                                         OMX_EventError, OMX_ErrorUndefined, 0, NULL);
-                flagEOF = OMX_FALSE;
+                ret = OMX_FALSE;
             }
 
             Exynos_InputBufferReturn(pOMXComponent);
@@ -301,20 +405,16 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
             pExynosComponent->bSaveFlagEOS = OMX_TRUE;
         }
 
-        if (flagEOF == 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;
-        } else {
-            ret = OMX_FALSE;
+        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:
@@ -377,33 +477,13 @@ OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
         if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
             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, };
-            int fds[MAX_BUFFER_PLANE];
-
-            CSC_ERRORCODE cscRet = CSC_ErrorNone;
-            CSC_METHOD csc_method = CSC_METHOD_SW;
-            unsigned int cacheable = 1;
 
             pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)dstOutputData->extInfo;
-#if 0
-            pVideoDec->exynos_codec_getCodecOutputPrivateData(dstOutputData->pPrivate, pSrcBuf, NULL);
-#else
-            pSrcBuf[0] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[0];
-            pSrcBuf[1] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[1];
-            pSrcBuf[2] = dstOutputData->buffer.multiPlaneBuffer.dataBuffer[2];
-#endif
+
             width = pBufferInfo->imageWidth;
             height = pBufferInfo->imageHeight;
             imageSize = width * height;
-            colorFormat = pBufferInfo->ColorFormat;
-
-            pYUVBuf[0]  = (unsigned char *)pOutputBuf;
-            pYUVBuf[1]  = (unsigned char *)pOutputBuf + imageSize;
-            pYUVBuf[2]  = (unsigned char *)pOutputBuf + imageSize + imageSize / 4;
 
             if ((dstOutputData->remainDataLen <= (outputUseBuffer->allocSize - outputUseBuffer->dataLen)) &&
                 (!CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
@@ -416,81 +496,12 @@ OMX_BOOL Exynos_Postprocess_OutputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
                 outputUseBuffer->timeStamp = dstOutputData->timeStamp;
 
                 if (outputUseBuffer->remainDataLen > 0) {
-#ifdef USE_ANB
-                    void *pPhys[MAX_BUFFER_PLANE];
-                    
-                    if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
-                        OMX_U32 stride;
-                        ExynosVideoPlane planes[MAX_BUFFER_PLANE];
-                        Exynos_OSAL_LockANB(outputUseBuffer->bufferHeader->pBuffer, width, height, exynosOutputPort->portDefinition.format.video.eColorFormat, &stride, planes);
-                        width = stride;
-                        fds[0] = planes[0].fd;
-                        fds[1] = planes[1].fd;
-                        fds[2] = planes[2].fd;
-                        pYUVBuf[0] = planes[0].addr;
-                        pYUVBuf[1] = planes[1].addr;
-                        pYUVBuf[2] = planes[2].addr;
-                        outputUseBuffer->dataLen = sizeof(void *);
-                    }
-#endif
-                    if (exynosOutputPort->portDefinition.format.video.eColorFormat == (OMX_COLOR_FORMATTYPE)OMX_SEC_COLOR_FormatNV12TPhysicalAddress) {
-                        /* if use Post copy address structure */
-                        Exynos_OSAL_Memcpy(pYUVBuf[0], &(pSrcBuf[0]), sizeof(void *));
-                        Exynos_OSAL_Memcpy((unsigned char *)pYUVBuf[0] + (sizeof(void *) * 1), &(pSrcBuf[1]), sizeof(void *));
-                        Exynos_OSAL_Memcpy((unsigned char *)pYUVBuf[0] + (sizeof(void *) * 2), &(pSrcBuf[0]), sizeof(void *));
-                        Exynos_OSAL_Memcpy((unsigned char *)pYUVBuf[0] + (sizeof(void *) * 3), &(pSrcBuf[1]), sizeof(void *));
-                        outputUseBuffer->dataLen = sizeof(void *) * 4;
-                    } else {
-                        csc_get_method(pVideoDec->csc_handle, &csc_method);
-                        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[0],             /* y addr */
-                            pSrcBuf[1],             /* u addr or uv addr */
-                            pSrcBuf[2],             /* v addr or none */
-                            0);                     /* ion fd */
-                        csc_set_dst_buffer(
-                            pVideoDec->csc_handle,  /* handle */
-                            pYUVBuf[0],             /* y addr */
-                            pYUVBuf[1],             /* u addr or uv addr */
-                            pYUVBuf[2],             /* v addr or none */
-                            0);                     /* ion fd */
-                        cscRet = csc_convert(pVideoDec->csc_handle);
-                    }
-#ifdef USE_ANB
-                    if (exynosOutputPort->bIsANBEnabled == OMX_TRUE) {
-                        Exynos_OSAL_UnlockANB(outputUseBuffer->bufferHeader->pBuffer/*dstOutputData->dataBuffer*/);
-                    }
-#endif
+                    ret = Exynos_CSC_OutputData(pOMXComponent, dstOutputData);
                 } else {
-                    cscRet = CSC_ErrorNone;
-                }
-
-                if (cscRet == CSC_ErrorNone) {
                     ret = OMX_TRUE;
+                }
 
+                if (ret == OMX_TRUE) {
                     if ((outputUseBuffer->remainDataLen > 0) ||
                         ((outputUseBuffer->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS) ||
                         (CHECK_PORT_BEING_FLUSHED(exynosOutputPort))) {
@@ -789,7 +800,6 @@ OMX_ERRORTYPE Exynos_OMX_DstOutputBufferProcess(OMX_HANDLETYPE hComponent)
 
             if ((exynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
                 OMX_PTR codecBuffer;
-                DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = (DECODE_CODEC_EXTRA_BUFFERINFO *)pDstOutputData->extInfo;
                 codecBuffer = pDstOutputData->pPrivate;
                 if (codecBuffer != NULL) {
                     Exynos_CodecBufferEnQueue(pExynosComponent, OUTPUT_PORT_INDEX, codecBuffer);
index 6f6188fde35157743ad76e66f4a9d43c4a51e525..664c89967b32cd6d292ba808ab2d6f764e701927 100644 (file)
@@ -66,22 +66,13 @@ typedef struct
     void *pAddrC;
 } CODEC_DEC_ADDR_INFO;
 
-typedef struct _CODEC_DEC_INPUT_BUFFER
+typedef struct _CODEC_DEC_BUFFER
 {
-    void *VirAddr;      // virtual address
-    int   bufferSize;   // input buffer alloc size
-    int   dataSize;     // Data length
-    int   fd;
-} CODEC_DEC_INPUT_BUFFER;
-
-typedef struct _CODEC_DEC_OUTPUT_BUFFER
-{
-    void *VirAddr[MFC_OUTPUT_BUFFER_PLANE];      // virtual address
-    int   bufferSize[MFC_OUTPUT_BUFFER_PLANE];   // input buffer alloc size
-    int   dataSize;       // Data length
-    int   fd[MFC_OUTPUT_BUFFER_PLANE];
-} CODEC_DEC_OUTPUT_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
 {
@@ -96,8 +87,8 @@ typedef struct _EXYNOS_OMX_VIDEODEC_COMPONENT
     OMX_HANDLETYPE hCodecHandle;
     OMX_BOOL bThumbnailMode;
     OMX_BOOL bFirstFrame;
-    CODEC_DEC_INPUT_BUFFER *pMFCDecInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
-    CODEC_DEC_OUTPUT_BUFFER *pMFCDecOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
+    CODEC_DEC_BUFFER *pMFCDecInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
+    CODEC_DEC_BUFFER *pMFCDecOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
 
     /* Buffer Process */
     OMX_BOOL       bExitBufferProcessThread;
index 50221297dd6b2aa23735675a0810f61418ed5ec1..2eef05ee1f25638256d31184eb9dc93ceb8d43a5 100644 (file)
@@ -552,7 +552,7 @@ OMX_ERRORTYPE H264CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U3
 
         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]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+            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]);
         }
@@ -659,9 +659,9 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT
         /* Register input buffer */
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
             ExynosVideoPlane plane;
-            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->VirAddr;
-            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize;
-            plane.fd = 0;
+            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;
@@ -846,51 +846,44 @@ OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
         goto EXIT;
     }
 
-    int YBufferSize = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth, pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight);
-    int CBufferSize = calc_plane(pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth, pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight >> 1);
+    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) {
-        Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s: using copy buf\n", __func__);
+        MEMORY_TYPE memoryType;
+        if (pVideoDec->bDRMPlayerMode == OMX_TRUE)
+            memoryType = SECURE_MEMORY;
+        else
+            memoryType = NORMAL_MEMORY;
+
         /* Register output buffer */
         for (i = 0; i < nOutbufs; i++) {
-            ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-            int plane;
-
-            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER));
-            if (pVideoDec->bDRMPlayerMode == OMX_TRUE) {
-                pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
-                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, SECURE_MEMORY);
-                pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
-                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, SECURE_MEMORY);
-                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
-                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
-            } else {
-                pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
-                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, NORMAL_MEMORY);
-                pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
-                    (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, NORMAL_MEMORY);
-                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
-                pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
-            }
-
-            pVideoDec->pMFCDecOutputBuffer[i]->fd[0] =
-                Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
-                                                   pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
-            pVideoDec->pMFCDecOutputBuffer[i]->fd[1] =
-                Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
-                                                   pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
-
-            if ((pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] == NULL) ||
-                (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] == NULL)) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
+            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++) {
-                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[plane];
-                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[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) {
@@ -898,7 +891,7 @@ OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
                 ret = OMX_ErrorInsufficientResources;
                 goto EXIT;
             }
-            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->VirAddr,
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
                             (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
         }
     } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
@@ -906,39 +899,32 @@ OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
         /*************/
         /*    TBD    */
         /*************/
-//        OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
-//        OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
-//        OMX_U32 stride;
-        for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
-            EXYNOS_OMX_BUFFERHEADERTYPE *buffer = &pExynosOutputPort->extendBufferHeader[i];
-            ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-
-            /* luma */
-            planes[0].addr = buffer->pYUVBuf[0];
-            planes[0].fd = buffer->buf_fd[0];
-            planes[0].allocSize = YBufferSize;
-            /* chroma */
-            planes[1].addr = buffer->pYUVBuf[1];
-            planes[1].fd = buffer->buf_fd[1];
-            planes[1].allocSize = CBufferSize;
-
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,
-                            "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n",
-                            __func__, i, buffer, planes[0].addr, planes[0].fd, planes[1].addr,
-                            planes[1].fd);
-
-//            Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height,
-//                                pExynosOutputPort->portDefinition.format.video.eColorFormat,
-//                                &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf);
-            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;
+#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, planes, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
             }
-            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
-//            Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+        } 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;
@@ -1459,7 +1445,7 @@ OMX_ERRORTYPE Exynos_H264Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
     ExynosVideoDecBufferOps *pOutbufOps = NULL;
 
     CSC_METHOD csc_method = CSC_METHOD_SW;
-    int i = 0;
+    int i, plane;
 
     FunctionIn();
 
@@ -1483,23 +1469,23 @@ OMX_ERRORTYPE Exynos_H264Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
         Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
 
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
-            /*************/
-            /*    TBD    */
-            /*************/
-            /* Use ION Allocator */
-            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER));
-            pVideoDec->pMFCDecInputBuffer[i]->VirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
-            if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr == NULL) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
-            pVideoDec->pMFCDecInputBuffer[i]->fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
-            pVideoDec->pMFCDecInputBuffer[i]->bufferSize = DEFAULT_MFC_INPUT_BUFFER_SIZE;
-            pVideoDec->pMFCDecInputBuffer[i]->dataSize   = 0;
-
+            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]);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+
+            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]);
         }
@@ -1570,7 +1556,7 @@ OMX_ERRORTYPE Exynos_H264Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     ExynosVideoDecBufferOps *pInbufOps  = pH264Dec->hMFCH264Handle.pInbufOps;
     ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps;
 
-    int i = 0;
+    int i, plane;
 
     FunctionIn();
 
@@ -1589,10 +1575,11 @@ OMX_ERRORTYPE Exynos_H264Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
             if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
-                if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
-                if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
+                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;
             }
@@ -1610,8 +1597,10 @@ OMX_ERRORTYPE Exynos_H264Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
             if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
-                if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+                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;
             }
@@ -1733,7 +1722,7 @@ OMX_ERRORTYPE Exynos_H264Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
 
         if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
             int i = 0;
-            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->VirAddr) {
+            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;
@@ -1764,6 +1753,7 @@ OMX_ERRORTYPE Exynos_H264Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
     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,};
@@ -1777,7 +1767,10 @@ OMX_ERRORTYPE Exynos_H264Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
         goto EXIT;
     }
 
-    Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "%s : %d => ADDR: 0x%x", __FUNCTION__, __LINE__, pDstInputData->buffer.multiPlaneBuffer.dataBuffer[0]);
+    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);
 
@@ -1812,6 +1805,7 @@ OMX_ERRORTYPE Exynos_H264Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
     ExynosVideoGeometry *bufferGeometry;
     DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
     OMX_S32 indexTimestamp = 0;
+    int plane;
 
     FunctionIn();
 
@@ -1848,14 +1842,13 @@ OMX_ERRORTYPE Exynos_H264Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
     pH264Dec->hMFCH264Handle.outputIndexTimestamp++;
     pH264Dec->hMFCH264Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
 
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[0] = pVideoBuffer->planes[0].fd;
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[1] = pVideoBuffer->planes[1].fd;
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[2] = pVideoBuffer->planes[2].fd;
-    pDstOutputData->allocSize   = pVideoBuffer->planes[0].allocSize + pVideoBuffer->planes[1].allocSize + pVideoBuffer->planes[2].allocSize;
-    pDstOutputData->dataLen     = pVideoBuffer->planes[0].dataSize + pVideoBuffer->planes[1].dataSize + pVideoBuffer->planes[2].dataSize;
+    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 */
index 44ef8db03ec114670e3c36ba136632c95b887ad5..5aa9175eb8c9bb29df8dd1c0666caaeb0440a53c 100644 (file)
@@ -656,7 +656,7 @@ OMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U
 
         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]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+            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]);
         }
@@ -767,9 +767,9 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA
         /* Register input buffer */
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
             ExynosVideoPlane plane;
-            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->VirAddr;
-            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize;
-            plane.fd = 0;
+            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;
@@ -930,41 +930,38 @@ OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
         goto EXIT;
     }
 
-    int YBufferSize = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth, pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight);
-    int CBufferSize = calc_plane(pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth, pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight >> 1);
+    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++) {
-            ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-            int plane;
-
-            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER));
-            pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
-                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, NORMAL_MEMORY);
-            pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
-                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, NORMAL_MEMORY);
-            pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
-            pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
-
-            pVideoDec->pMFCDecOutputBuffer[i]->fd[0] =
-                Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
-                                                   pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
-            pVideoDec->pMFCDecOutputBuffer[i]->fd[1] =
-                Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
-                                                   pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
-
-            if ((pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] == NULL) ||
-                (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] == NULL)) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
+            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++) {
-                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[plane];
-                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[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) {
@@ -972,7 +969,7 @@ OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
                 ret = OMX_ErrorInsufficientResources;
                 goto EXIT;
             }
-            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->VirAddr,
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
                             (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
         }
     } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
@@ -980,38 +977,30 @@ OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
         /*************/
         /*    TBD    */
         /*************/
-//        OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
-//        OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
-//        OMX_U32 stride;
-        for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
-            EXYNOS_OMX_BUFFERHEADERTYPE *buffer = &pExynosOutputPort->extendBufferHeader[i];
-            ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-
-            /* luma */
-            planes[0].addr = buffer->pYUVBuf[0];
-            planes[0].fd = buffer->buf_fd[0];
-            planes[0].allocSize = YBufferSize;
-            /* chroma */
-            planes[1].addr = buffer->pYUVBuf[1];
-            planes[1].fd = buffer->buf_fd[1];
-            planes[1].allocSize = CBufferSize;
-
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,
-                            "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n",
-                            __func__, i, buffer, planes[0].addr, planes[0].fd, planes[1].addr,
-                            planes[1].fd);
-
-//            Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height,
-//                                pExynosOutputPort->portDefinition.format.video.eColorFormat,
-//                                &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf);
-            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;
+#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, planes, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
             }
-            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
-//            Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+        } else {
+            ret = OMX_ErrorNotImplemented;
+            goto EXIT;
         }
+#else
+        ret = OMX_ErrorNotImplemented;
+        goto EXIT;
+#endif
     }
 
     if (pOutbufOps->Run(hMFCHandle) != VIDEO_ERROR_NONE) {
@@ -1598,7 +1587,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
     ExynosVideoDecBufferOps *pOutbufOps = NULL;
 
     CSC_METHOD csc_method = CSC_METHOD_SW;
-    int i = 0;
+    int i, plane;
 
     FunctionIn();
 
@@ -1622,23 +1611,23 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
         Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
 
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
-            /*************/
-            /*    TBD    */
-            /*************/
-            /* Use ION Allocator */
-            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER));
-            pVideoDec->pMFCDecInputBuffer[i]->VirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
-            if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr == NULL) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
-            pVideoDec->pMFCDecInputBuffer[i]->fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
-            pVideoDec->pMFCDecInputBuffer[i]->bufferSize = DEFAULT_MFC_INPUT_BUFFER_SIZE;
-            pVideoDec->pMFCDecInputBuffer[i]->dataSize   = 0;
-
+            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]);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+
+            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]);
         }
@@ -1702,7 +1691,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     ExynosVideoDecBufferOps *pInbufOps  = pMpeg4Dec->hMFCMpeg4Handle.pInbufOps;
     ExynosVideoDecBufferOps *pOutbufOps = pMpeg4Dec->hMFCMpeg4Handle.pOutbufOps;
 
-    int i = 0;
+    int i, plane;
 
     FunctionIn();
 
@@ -1721,10 +1710,11 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
             if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
-                if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
-                if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
+                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;
             }
@@ -1742,8 +1732,11 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
             if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
-                if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+                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;
             }
@@ -1854,7 +1847,6 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
 
     if (pVideoBuffer == NULL) {
         pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
-        pSrcOutputData->buffer.singlePlaneBuffer.fd = 0;
         pSrcOutputData->allocSize  = 0;
         pSrcOutputData->pPrivate = NULL;
         pSrcOutputData->bufferHeader = NULL;
@@ -1865,7 +1857,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
 
         if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
             int i = 0;
-            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->VirAddr) {
+            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;
@@ -1896,6 +1888,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
     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,};
@@ -1909,6 +1902,10 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
         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);
 
@@ -1943,6 +1940,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
     ExynosVideoGeometry *bufferGeometry;
     DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
     OMX_S32 indexTimestamp = 0;
+    int plane;
 
     FunctionIn();
 
@@ -1979,14 +1977,13 @@ OMX_ERRORTYPE Exynos_Mpeg4Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
     pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp++;
     pMpeg4Dec->hMFCMpeg4Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
 
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[0] = pVideoBuffer->planes[0].fd;
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[1] = pVideoBuffer->planes[1].fd;
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[2] = pVideoBuffer->planes[2].fd;
-    pDstOutputData->allocSize   = pVideoBuffer->planes[0].allocSize + pVideoBuffer->planes[1].allocSize + pVideoBuffer->planes[2].allocSize;
-    pDstOutputData->dataLen     = pVideoBuffer->planes[0].dataSize + pVideoBuffer->planes[1].dataSize + pVideoBuffer->planes[2].dataSize;
+    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 */
index d455f719f789551d1ea41583b3bd6fc3dd05b381..de7232ec0cd8cc8189793a74364711073b3c39ac 100644 (file)
@@ -471,7 +471,7 @@ OMX_ERRORTYPE VP8CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U32
 
         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]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+            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]);
         }
@@ -578,9 +578,9 @@ OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA
         /* Register input buffer */
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
             ExynosVideoPlane plane;
-            plane.addr = pVideoDec->pMFCDecInputBuffer[i]->VirAddr;
-            plane.allocSize = pVideoDec->pMFCDecInputBuffer[i]->bufferSize;
-            plane.fd = 0;
+            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;
@@ -741,41 +741,38 @@ OMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
         goto EXIT;
     }
 
-    int YBufferSize = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight);
-    int CBufferSize = calc_plane(pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth, pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight >> 1);
+    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++) {
-            ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-            int plane;
-
-            pVideoDec->pMFCDecOutputBuffer[i] = (CODEC_DEC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_DEC_OUTPUT_BUFFER));
-            pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] =
-                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, YBufferSize, NORMAL_MEMORY);
-            pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] =
-                (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, CBufferSize, NORMAL_MEMORY);
-            pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[0] = YBufferSize;
-            pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[1] = CBufferSize;
-
-            pVideoDec->pMFCDecOutputBuffer[i]->fd[0] =
-                Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
-                                                   pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
-             pVideoDec->pMFCDecOutputBuffer[i]->fd[1] =
-                Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory,
-                                                   pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
-
-            if ((pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] == NULL) ||
-                (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] == NULL)) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
+            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++) {
-                planes[plane].addr = pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[plane];
-                planes[plane].allocSize = pVideoDec->pMFCDecOutputBuffer[i]->bufferSize[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) {
@@ -783,7 +780,7 @@ OMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
                 ret = OMX_ErrorInsufficientResources;
                 goto EXIT;
             }
-            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->VirAddr,
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pVideoDec->pMFCDecOutputBuffer[i]->pVirAddr,
                             (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
         }
     } else if (pExynosOutputPort->bufferProcessType == BUFFER_SHARE) {
@@ -791,39 +788,32 @@ OMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
         /*************/
         /*    TBD    */
         /*************/
-//        OMX_U32 width = pExynosOutputPort->portDefinition.format.video.nFrameWidth;
-//        OMX_U32 height = pExynosOutputPort->portDefinition.format.video.nFrameHeight;
-//        OMX_U32 stride;
-        for (i = 0; i < pExynosOutputPort->assignedBufferNum; i++) {
-            EXYNOS_OMX_BUFFERHEADERTYPE *buffer = &pExynosOutputPort->extendBufferHeader[i];
-            ExynosVideoPlane planes[MFC_OUTPUT_BUFFER_PLANE];
-
-            /* luma */
-            planes[0].addr = buffer->pYUVBuf[0];
-            planes[0].fd = buffer->buf_fd[0];
-            planes[0].allocSize = YBufferSize;
-            /* chroma */
-            planes[1].addr = buffer->pYUVBuf[1];
-            planes[1].fd = buffer->buf_fd[1];
-            planes[1].allocSize = CBufferSize;
-
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE,
-                            "%s: registering buf %d (hdr=%p) (l_addr=%p l_fd=%d c_addr=%p c_fd=%d)\n",
-                            __func__, i, buffer, planes[0].addr, planes[0].fd, planes[1].addr,
-                            planes[1].fd);
-
-//            Exynos_OSAL_LockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, width, height,
-//                                pExynosOutputPort->portDefinition.format.video.eColorFormat,
-//                                &stride, pExynosOutputPort->extendBufferHeader[i].pYUVBuf);
-            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;
+#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, planes, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
             }
-            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)pExynosOutputPort->extendBufferHeader[i].pYUVBuf, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
-//            Exynos_OSAL_UnlockANB(pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer);
+        } 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;
@@ -1188,7 +1178,7 @@ OMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
     ExynosVideoDecBufferOps *pOutbufOps = NULL;
 
     CSC_METHOD csc_method = CSC_METHOD_SW;
-    int i = 0;
+    int i, plane;
 
     FunctionIn();
 
@@ -1212,23 +1202,23 @@ OMX_ERRORTYPE Exynos_VP8Dec_Init(OMX_COMPONENTTYPE *pOMXComponent)
         Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS);
 
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
-            /*************/
-            /*    TBD    */
-            /*************/
-            /* Use ION Allocator */
-            pVideoDec->pMFCDecInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_DEC_INPUT_BUFFER));
-            pVideoDec->pMFCDecInputBuffer[i]->VirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoDec->hSharedMemory, DEFAULT_MFC_INPUT_BUFFER_SIZE, NORMAL_MEMORY);
-            if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr == NULL) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Fail input buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
-            pVideoDec->pMFCDecInputBuffer[i]->fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
-            pVideoDec->pMFCDecInputBuffer[i]->bufferSize = DEFAULT_MFC_INPUT_BUFFER_SIZE;
-            pVideoDec->pMFCDecInputBuffer[i]->dataSize   = 0;
-
+            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]);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoDec->pMFCDecInputBuffer[%d]->VirAddr: 0x%x", i, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+
+            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]);
         }
@@ -1292,7 +1282,7 @@ OMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     ExynosVideoDecBufferOps *pInbufOps  = pVp8Dec->hMFCVp8Handle.pInbufOps;
     ExynosVideoDecBufferOps *pOutbufOps = pVp8Dec->hMFCVp8Handle.pOutbufOps;
 
-    int i = 0;
+    int i, plane;
 
     FunctionIn();
 
@@ -1311,10 +1301,11 @@ OMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
             if (pVideoDec->pMFCDecOutputBuffer[i] != NULL) {
-                if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0] != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[0]);
-                if (pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1] != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecOutputBuffer[i]->VirAddr[1]);
+                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;
             }
@@ -1332,8 +1323,11 @@ OMX_ERRORTYPE Exynos_VP8Dec_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
             if (pVideoDec->pMFCDecInputBuffer[i] != NULL) {
-                if (pVideoDec->pMFCDecInputBuffer[i]->VirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoDec->hSharedMemory, pVideoDec->pMFCDecInputBuffer[i]->VirAddr);
+                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;
             }
@@ -1444,7 +1438,6 @@ OMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
 
     if (pVideoBuffer == NULL) {
         pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer = NULL;
-        pSrcOutputData->buffer.singlePlaneBuffer.fd = 0;
         pSrcOutputData->allocSize  = 0;
         pSrcOutputData->pPrivate = NULL;
         pSrcOutputData->bufferHeader = NULL;
@@ -1455,7 +1448,7 @@ OMX_ERRORTYPE Exynos_VP8Dec_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
 
         if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
             int i = 0;
-            while (pSrcOutputData->buffer.singlePlaneBuffer.dataBuffer != pVideoDec->pMFCDecInputBuffer[i]->VirAddr) {
+            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;
@@ -1486,6 +1479,7 @@ OMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_D
     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,};
@@ -1499,6 +1493,10 @@ OMX_ERRORTYPE Exynos_VP8Dec_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_D
         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);
 
@@ -1533,6 +1531,7 @@ OMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
     ExynosVideoGeometry *bufferGeometry;
     DECODE_CODEC_EXTRA_BUFFERINFO *pBufferInfo = NULL;
     OMX_S32 indexTimestamp = 0;
+    int plane;
 
     FunctionIn();
 
@@ -1569,14 +1568,13 @@ OMX_ERRORTYPE Exynos_VP8Dec_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
     pVp8Dec->hMFCVp8Handle.outputIndexTimestamp++;
     pVp8Dec->hMFCVp8Handle.outputIndexTimestamp %= MAX_TIMESTAMP;
 
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[0] = pVideoBuffer->planes[0].fd;
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[1] = pVideoBuffer->planes[1].fd;
-    pDstOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
-    pDstOutputData->buffer.multiPlaneBuffer.fd[2] = pVideoBuffer->planes[2].fd;
-    pDstOutputData->allocSize   = pVideoBuffer->planes[0].allocSize + pVideoBuffer->planes[1].allocSize + pVideoBuffer->planes[2].allocSize;
-    pDstOutputData->dataLen     = pVideoBuffer->planes[0].dataSize + pVideoBuffer->planes[1].dataSize + pVideoBuffer->planes[2].dataSize;
+    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 */