exynos_omx: multi_thread: Video encoder supported ION fd.
authorSeungBeom Kim <sbcrux.kim@samsung.com>
Wed, 4 Jul 2012 06:01:54 +0000 (15:01 +0900)
committerDima Zavin <dima@android.com>
Tue, 24 Jul 2012 22:12:42 +0000 (15:12 -0700)
Video encode component supported ION fd.

Change-Id: Ib8dcb66eaf54371f69b5404cfdf3b954368386c0
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c
exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h
exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c
exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c
exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c

index 265281158aeffb4f2e1cf5e66d98a1e91c5ef7e6..6d477cd716564417395eb5fa8a7ebd3540e94bb4 100644 (file)
@@ -98,14 +98,14 @@ OMX_ERRORTYPE Exynos_Input_CodecBufferToData(EXYNOS_OMX_BASECOMPONENT *pExynosCo
 {
     OMX_ERRORTYPE                  ret = OMX_ErrorNone;
     EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;
-    CODEC_ENC_INPUT_BUFFER *pInputCodecBuffer = (CODEC_ENC_INPUT_BUFFER*)codecBuffer;
+    CODEC_ENC_BUFFER *pInputCodecBuffer = (CODEC_ENC_BUFFER*)codecBuffer;
 
-    pData->buffer.multiPlaneBuffer.dataBuffer[0] = pInputCodecBuffer->YVirAddr;
-    pData->buffer.multiPlaneBuffer.dataBuffer[1] = pInputCodecBuffer->CVirAddr;
-    pData->allocSize     = pInputCodecBuffer->YBufferSize + pInputCodecBuffer->CBufferSize;
-    pData->dataLen       = pInputCodecBuffer->YDataSize + pInputCodecBuffer->CDataSize;
+    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->YDataSize + pInputCodecBuffer->CDataSize;
+    pData->remainDataLen = pInputCodecBuffer->dataSize;
 
     pData->nFlags        = 0;
     pData->timeStamp     = 0;
@@ -162,6 +162,155 @@ void Exynos_Wait_ProcessPause(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U3
     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_LockANB((OMX_U32)ppBuf[0], nFrameWidth, nFrameHeight, OMX_COLOR_FormatAndroidOpaque, &stride, 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[0],             /* y addr */
+        pSrcBuf[1],             /* u addr or uv addr */
+        pSrcBuf[2],             /* v addr or none */
+        0);                     /* ion fd */
+    csc_set_dst_buffer(
+        pVideoEnc->csc_handle,  /* handle */
+        pDstBuf[0],             /* y addr */
+        pDstBuf[1],             /* u addr or uv addr */
+        pDstBuf[2],             /* v addr or none */
+        0);                     /* ion 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;
@@ -192,12 +341,28 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
             Exynos_Shared_BufferToData(inputUseBuffer, srcInputData, ONE_PLANE);
 #ifdef USE_METADATABUFFERTYPE
             if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
-                OMX_PTR ppBuf[3];
+                OMX_PTR ppBuf[MAX_BUFFER_PLANE];
+                OMX_PTR allocSize[MAX_BUFFER_PLANE];
+                int plane = 0;
 
+                /* kMetadataBufferTypeCameraSource */
                 Exynos_OSAL_GetInfoFromMetaData((OMX_BYTE)inputUseBuffer->bufferHeader->pBuffer, ppBuf);
-                srcInputData->buffer.multiPlaneBuffer.dataBuffer[0] = ppBuf[0];
-                srcInputData->buffer.multiPlaneBuffer.dataBuffer[1] = ppBuf[1];
+                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
@@ -218,102 +383,8 @@ OMX_BOOL Exynos_Preprocessor_InputData(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_
             Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "exynos_checkInputFrame : OMX_TRUE");
 
             if (((srcInputData->allocSize) - (srcInputData->dataLen)) >= copySize) {
-                CODEC_ENC_INPUT_BUFFER *codecInputBuffer = (CODEC_ENC_INPUT_BUFFER *)srcInputData->pPrivate;
-                codecInputBuffer->YDataSize = nFrameWidth * nFrameHeight;
-                codecInputBuffer->CDataSize = nFrameWidth * nFrameHeight / 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);
-                unsigned int cacheable = 1;
-
-                unsigned char *pSrcBuf[3] = {NULL, };
-                unsigned char *pDstBuf[3] = {NULL, };
-
-                pDstBuf[0] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[0];
-                pDstBuf[1] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[1];
-                pDstBuf[2] = srcInputData->buffer.multiPlaneBuffer.dataBuffer[2];
+                Exynos_CSC_InputData(pOMXComponent, srcInputData);
 
-#ifdef USE_METADATABUFFERTYPE
-                OMX_PTR ppBuf[3];
-
-                if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
-                    OMX_PTR pRGBRealDataBuffer;
-
-                    /* 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) {
-                        Exynos_OSAL_LockANBHandle((OMX_U32)ppBuf[0], nFrameWidth, nFrameHeight, OMX_COLOR_FormatAndroidOpaque, &pRGBRealDataBuffer);
-                        pSrcBuf[0]  = (unsigned char *)pRGBRealDataBuffer;
-                        pSrcBuf[1]  = NULL;
-                        pSrcBuf[2]  = NULL;
-                    }
-                } else
-#endif
-                {
-                    pSrcBuf[0]  = checkInputStream;
-                    pSrcBuf[1]  = checkInputStream + (nFrameWidth * nFrameHeight);
-                    pSrcBuf[2]  = checkInputStream + (((nFrameWidth * nFrameHeight) * 5) / 4);
-
-                    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[0],             /* y addr */
-                    pSrcBuf[1],             /* u addr or uv addr */
-                    pSrcBuf[2],             /* v addr or none */
-                    0);                     /* ion fd */
-                csc_set_dst_buffer(
-                    pVideoEnc->csc_handle,  /* handle */
-                    pDstBuf[0],             /* y addr */
-                    pDstBuf[1],             /* u addr or uv addr */
-                    pDstBuf[2],             /* v addr or none */
-                    0);                     /* ion fd */
-                csc_convert(pVideoEnc->csc_handle);
-
-#ifdef USE_METADATABUFFERTYPE
-                if (exynosInputPort->bStoreMetaData == OMX_TRUE) {
-                    Exynos_OSAL_UnlockANBHandle((OMX_U32)ppBuf[0]);
-                }
-#endif
                 inputUseBuffer->dataLen -= copySize;
                 inputUseBuffer->remainDataLen -= copySize;
                 inputUseBuffer->usedDataLen += copySize;
index 7a387bb2271bd32b60dac4ea32f936e75c885c7f..578bacdf2c190dedfcdd2a017a63d875d23c4fb6 100644 (file)
@@ -68,29 +68,20 @@ typedef struct
     void *pAddrC;
 } CODEC_ENC_ADDR_INFO;
 
-typedef struct _CODEC_ENC_INPUT_BUFFER
+typedef struct _CODEC_ENC_BUFFER
 {
-    void *YVirAddr; // virtual address of Y
-    void *CVirAddr; // virtual address of CbCr
-    int YBufferSize; // input buffer alloc size of Y
-    int CBufferSize; // input buffer alloc size of CbCr
-    int YDataSize;  // input size of Y data
-    int CDataSize;  // input size of CbCr data
-} CODEC_ENC_INPUT_BUFFER;
-
-typedef struct _CODEC_ENC_OUTPUT_BUFFER
-{
-    void *VirAddr;      // virtual address
-    int   bufferSize;   // input buffer alloc size
-    int   dataSize;     // Data length
-} CODEC_ENC_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_ENC_BUFFER;
 
 typedef struct _EXYNOS_OMX_VIDEOENC_COMPONENT
 {
     OMX_HANDLETYPE hCodecHandle;
     OMX_BOOL bFirstFrame;
-    CODEC_ENC_INPUT_BUFFER *pMFCEncInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
-    CODEC_ENC_OUTPUT_BUFFER *pMFCEncOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
+    CODEC_ENC_BUFFER *pMFCEncInputBuffer[MFC_INPUT_BUFFER_NUM_MAX];
+    CODEC_ENC_BUFFER *pMFCEncOutputBuffer[MFC_OUTPUT_BUFFER_NUM_MAX];
 
     /* Buffer Process */
     OMX_BOOL       bExitBufferProcessThread;
index e584a0c10608c74f27196deed99395fc1d569f49..a5937bdb8d3887539c73af604ab030eade1d12b2 100644 (file)
@@ -153,6 +153,7 @@ OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
     EXYNOS_OMX_BASEPORT      *pExynosPort = NULL;
     OMX_BUFFERHEADERTYPE  *temp_bufferHeader = NULL;
     OMX_U8                *temp_buffer = NULL;
+    int                    temp_buffer_fd = -1;
     OMX_U32                i = 0;
 
     FunctionIn();
@@ -196,6 +197,7 @@ OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
             ret = OMX_ErrorInsufficientResources;
             goto EXIT;
         }
+        temp_buffer_fd = Exynos_OSAL_SharedMemory_VirtToION(pVideoDec->hSharedMemory, temp_buffer);
     } else {
         temp_buffer = Exynos_OSAL_Malloc(sizeof(OMX_U8) * nSizeBytes);
         if (temp_buffer == NULL) {
@@ -221,6 +223,7 @@ OMX_ERRORTYPE Exynos_OMX_AllocateBuffer(
     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;
index 812b2003b978329eb46ec61b4cc07565233a095b..92b07342f60cbe84e4203f666c22986d0414db23 100644 (file)
@@ -701,8 +701,8 @@ OMX_ERRORTYPE H264CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U3
 
         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]->YVirAddr: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->CVirAddr: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr);
+            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]);
         }
@@ -719,7 +719,8 @@ OMX_ERRORTYPE H264CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U3
             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->pMFCEncOutputBuffer[%d]->YVirAddr: 0x%x", i, pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr);
+            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 {
@@ -816,17 +817,18 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT
         goto EXIT;
     }
 
-    OMX_PTR pTempAddress[MFC_INPUT_BUFFER_PLANE] = {NULL, NULL};
-    OMX_U32 TempAllocSize[MFC_INPUT_BUFFER_PLANE] = {0, 0};
+    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++) {
-            pTempAddress[0] = pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr;
-            pTempAddress[1] = pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr;
-            TempAllocSize[0] = pVideoEnc->pMFCEncInputBuffer[i]->YBufferSize;
-            TempAllocSize[1] = pVideoEnc->pMFCEncInputBuffer[i]->CBufferSize;
-            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s:%d", __FUNCTION__, __LINE__);
-            if (pInbufOps->Register(hMFCHandle, pTempAddress, TempAllocSize) != VIDEO_ERROR_NONE) {
+            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;
@@ -834,20 +836,13 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT
         }
     } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
         if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
-            TempAllocSize[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
-                                ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
-            TempAllocSize[1] = ALIGN(TempAllocSize[0]/2,256);
-        }
-        /* Register input buffer */
-        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
-            if (pInbufOps->Register(pH264Enc->hMFCH264Handle.hMFCHandle,
-                        (unsigned char **)&pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer,
-                        (pExynosInputPort->bStoreMetaData ? (unsigned int *)TempAllocSize :
-                        (unsigned int *)&pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen)) != VIDEO_ERROR_NONE) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
+            /*************/
+            /*    TBD    */
+            /*************/
+            /* Does not require any actions. */
+        } else {
+            ret = OMX_ErrorNotImplemented;
+            goto EXIT;
         }
     }
 
@@ -918,37 +913,48 @@ OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         /* Register input buffer */
         for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
-            pVideoEnc->pMFCEncOutputBuffer[i] = (CODEC_ENC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_OUTPUT_BUFFER));
-            pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr =
+            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);
-            pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize = OutBufferSize;
-
-            if (pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr == NULL) {
+            if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] == NULL) {
                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
                 ret = OMX_ErrorInsufficientResources;
                 goto EXIT;
             }
-            if (pOutbufOps->Register(hMFCHandle,
-                                     &pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr,
-                                     &pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize) != VIDEO_ERROR_NONE) {
+            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]->VirAddr, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+            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++) {
-            if (pOutbufOps->Register(hMFCHandle, &pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, &pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen) != VIDEO_ERROR_NONE) {
+            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, &pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer,
+                                   (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
         }
     }
 
@@ -979,9 +985,7 @@ OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
                             OMXBuffer->pBuffer,
                             pVideoBuffer->planes[0].addr,
                             pVideoBuffer->planes[0].dataSize);
-        Exynos_OSAL_Memcpy(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;
@@ -1552,27 +1556,34 @@ OMX_ERRORTYPE Exynos_H264Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
         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_INPUT_BUFFER));
+            pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
             /* Use ION Allocator */
             /*Alloc Y-Buffer */
-            pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
-            pVideoEnc->pMFCEncInputBuffer[i]->YBufferSize = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
-            pVideoEnc->pMFCEncInputBuffer[i]->YDataSize = 0;
+            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]->CVirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
-            pVideoEnc->pMFCEncInputBuffer[i]->CBufferSize = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
-            pVideoEnc->pMFCEncInputBuffer[i]->CDataSize = 0;
+            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]->YVirAddr == NULL) ||
-                (pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr == NULL)) {
+            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]->YVirAddr: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr);
-            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->CVirAddr: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr);
+            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]);
         }
@@ -1636,7 +1647,7 @@ OMX_ERRORTYPE Exynos_H264Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     ExynosVideoEncBufferOps *pInbufOps  = pH264Enc->hMFCH264Handle.pInbufOps;
     ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
 
-    int i = 0;
+    int i = 0, plane = 0;
 
     FunctionIn();
 
@@ -1655,8 +1666,8 @@ OMX_ERRORTYPE Exynos_H264Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     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]->VirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr);
+                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;
             }
@@ -1674,10 +1685,10 @@ OMX_ERRORTYPE Exynos_H264Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
             if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) {
-                if (pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr);
-                if (pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr);
+                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;
             }
@@ -1728,8 +1739,9 @@ OMX_ERRORTYPE Exynos_H264Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
 
     if ((pSrcInputData->dataLen >= 0) ||
         ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
-        OMX_PTR pMFCYUVVirBuffer[MFC_INPUT_BUFFER_PLANE] = {NULL, NULL};
         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;
@@ -1740,22 +1752,39 @@ OMX_ERRORTYPE Exynos_H264Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
 
         /* queue work for input buffer */
         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Exynos_H264Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize, pSrcInputData->bufferHeader);
-        CODEC_ENC_INPUT_BUFFER *codecInputBuffer = (CODEC_ENC_INPUT_BUFFER *)pSrcInputData->pPrivate;
+        pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
+        pMFCYUVDataSize[1] = pMFCYUVDataSize[0] / 2;
 
-        pMFCYUVVirBuffer[0] = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[0];
-        pMFCYUVVirBuffer[1] = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[1];
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                    (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+#ifdef USE_METADATABUFFERTYPE
+        if ((codecReturn == VIDEO_ERROR_NOBUFFERS) &&
+            (pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+            (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+            OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
+            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);
+            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                planes[plane].addr = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[plane];
+                planes[plane].allocSize = nAllocLen[plane];
+                planes[plane].fd = pSrcInputData->buffer.multiPlaneBuffer.fd[plane];
+            }
 
-        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
-            CODEC_ENC_INPUT_BUFFER *codecInputBuffer = (CODEC_ENC_INPUT_BUFFER *)pSrcInputData->pPrivate;
-            pMFCYUVDataSize[0] = codecInputBuffer->YDataSize;
-            pMFCYUVDataSize[1] = codecInputBuffer->CDataSize;
-        } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
-            pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
-            pMFCYUVDataSize[1] = pMFCYUVDataSize[0]/2;
-        }
+            /* Register input buffer */
+            for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
+                if (pInbufOps->Register(pH264Enc->hMFCH264Handle.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;
+                }
+            }
+            codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                        (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
 
-        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pMFCYUVVirBuffer,
-                              (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;
@@ -1810,16 +1839,18 @@ OMX_ERRORTYPE Exynos_H264Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
         pSrcOutputData->pPrivate = NULL;
         pSrcOutputData->bufferHeader = NULL;
     } else {
-        pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
-        pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
-        pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
+        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]->YVirAddr) {
+            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;
@@ -1827,8 +1858,7 @@ OMX_ERRORTYPE Exynos_H264Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
                 }
                 i++;
             }
-            pVideoEnc->pMFCEncInputBuffer[i]->YDataSize = 0;
-            pVideoEnc->pMFCEncInputBuffer[i]->CDataSize = 0;
+            pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
             pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i];
         }
 
@@ -1864,8 +1894,7 @@ OMX_ERRORTYPE Exynos_H264Enc_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_
         goto EXIT;
     }
 
-    codecReturn = pOutbufOps->Enqueue(hMFCHandle,
-                     (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer,
+    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer,
                      (unsigned int *)&dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
 
     if (codecReturn != VIDEO_ERROR_NONE) {
@@ -1913,6 +1942,7 @@ OMX_ERRORTYPE Exynos_H264Enc_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
     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;
index 937e9d5817c38a42e4a311409ee7ceced2ddaff3..09dd7b696c3043a7b40291cbb72d96fb033f6299 100644 (file)
@@ -818,8 +818,8 @@ OMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U
 
         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]->YVirAddr: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr);
-            Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "pVideoEnc->pMFCEncInputBuffer[%d]->CVirAddr: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr);
+            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]);
         }
@@ -836,7 +836,8 @@ OMX_ERRORTYPE Mpeg4CodecEnQueueAllBuffer(OMX_COMPONENTTYPE *pOMXComponent, OMX_U
             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->pMFCEncOutputBuffer[%d]->YVirAddr: 0x%x", i, pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr);
+            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 {
@@ -937,17 +938,18 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA
         goto EXIT;
     }
 
-    OMX_PTR pTempAddress[MFC_INPUT_BUFFER_PLANE] = {NULL, NULL};
-    OMX_U32 TempAllocSize[MFC_INPUT_BUFFER_PLANE] = {0, 0};
+    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++) {
-            pTempAddress[0] = pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr;
-            pTempAddress[1] = pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr;
-            TempAllocSize[0] = pVideoEnc->pMFCEncInputBuffer[i]->YBufferSize;
-            TempAllocSize[1] = pVideoEnc->pMFCEncInputBuffer[i]->CBufferSize;
-            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "%s:%d", __FUNCTION__, __LINE__);
-            if (pInbufOps->Register(hMFCHandle, pTempAddress, TempAllocSize) != VIDEO_ERROR_NONE) {
+            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;
@@ -955,20 +957,13 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA
         }
     } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
         if (pExynosInputPort->bStoreMetaData == OMX_TRUE) {
-            TempAllocSize[0] = ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameWidth) *
-                                ALIGN_TO_16B(pExynosInputPort->portDefinition.format.video.nFrameHeight);
-            TempAllocSize[1] = ALIGN(TempAllocSize[0]/2,256);
-        }
-        /* Register input buffer */
-        for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
-            if (pInbufOps->Register(pMpeg4Enc->hMFCMpeg4Handle.hMFCHandle,
-                        (unsigned char **)&pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer,
-                        (pExynosInputPort->bStoreMetaData ? (unsigned int *)TempAllocSize :
-                        (unsigned int *)&pExynosInputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen)) != VIDEO_ERROR_NONE) {
-                Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Register input buffer");
-                ret = OMX_ErrorInsufficientResources;
-                goto EXIT;
-            }
+            /*************/
+            /*    TBD    */
+            /*************/
+            /* Does not require any actions. */
+        } else {
+            ret = OMX_ErrorNotImplemented;
+            goto EXIT;
         }
     }
 
@@ -1043,42 +1038,51 @@ OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent)
     }
 
     OMX_U32 dataLen[MFC_OUTPUT_BUFFER_PLANE] = {0};
-Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "nFrameWidth:%d, nFrameHeight:%d, OutBufferSize:%d",
-    pExynosOutputPort->portDefinition.format.video.nFrameWidth, pExynosOutputPort->portDefinition.format.video.nFrameHeight, OutBufferSize);
     if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         /* Register input buffer */
         for (i = 0; i < MFC_OUTPUT_BUFFER_NUM_MAX; i++) {
-            pVideoEnc->pMFCEncOutputBuffer[i] = (CODEC_ENC_OUTPUT_BUFFER *)Exynos_OSAL_Malloc(sizeof(CODEC_ENC_OUTPUT_BUFFER));
-            pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr =
+            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);
-            pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize = OutBufferSize;
-
-            if (pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr == NULL) {
+            if (pVideoEnc->pMFCEncOutputBuffer[i]->pVirAddr[0] == NULL) {
                 Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Failed to Alloc output buffer");
                 ret = OMX_ErrorInsufficientResources;
                 goto EXIT;
             }
-            if (pOutbufOps->Register(hMFCHandle,
-                                     &pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr,
-                                     &pVideoEnc->pMFCEncOutputBuffer[i]->bufferSize) != VIDEO_ERROR_NONE) {
+            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]->VirAddr, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+            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++) {
-            if (pOutbufOps->Register(hMFCHandle, &pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, &pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->nAllocLen) != VIDEO_ERROR_NONE) {
+            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, &pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer, (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
+            pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pExynosOutputPort->extendBufferHeader[i].OMXBufferHeader->pBuffer,
+                                   (unsigned int *)dataLen, MFC_OUTPUT_BUFFER_PLANE, NULL);
         }
     }
 
@@ -1111,9 +1115,7 @@ Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "nFrameWidth:%d, nFrameHeight:%d, OutBufferSiz
                             OMXBuffer->pBuffer,
                             pVideoBuffer->planes[0].addr,
                             pVideoBuffer->planes[0].dataSize);
-        Exynos_OSAL_Memcpy(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;
@@ -1759,27 +1761,34 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent)
         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_INPUT_BUFFER));
+            pVideoEnc->pMFCEncInputBuffer[i] = Exynos_OSAL_Malloc(sizeof(CODEC_ENC_BUFFER));
             /* Use ION Allocator */
             /*Alloc Y-Buffer */
-            pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_YBUFFER_SIZE, NORMAL_MEMORY);
-            pVideoEnc->pMFCEncInputBuffer[i]->YBufferSize = DEFAULT_MFC_INPUT_YBUFFER_SIZE;
-            pVideoEnc->pMFCEncInputBuffer[i]->YDataSize = 0;
+            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]->CVirAddr = (void *)Exynos_OSAL_SharedMemory_Alloc(pVideoEnc->hSharedMemory, DEFAULT_MFC_INPUT_CBUFFER_SIZE, NORMAL_MEMORY);
-            pVideoEnc->pMFCEncInputBuffer[i]->CBufferSize = DEFAULT_MFC_INPUT_CBUFFER_SIZE;
-            pVideoEnc->pMFCEncInputBuffer[i]->CDataSize = 0;
+            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]->YVirAddr == NULL) ||
-                (pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr == NULL)) {
+            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]->YVirAddr: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr);
-            Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "pVideoEnc->pMFCEncInputBuffer[%d]->CVirAddr: 0x%x", i, pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr);
+            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]);
         }
@@ -1843,7 +1852,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     ExynosVideoEncBufferOps *pInbufOps  = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
     ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
 
-    int i = 0;
+    int i = 0, plane = 0;
 
     FunctionIn();
 
@@ -1862,8 +1871,8 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     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]->VirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncOutputBuffer[i]->VirAddr);
+                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;
             }
@@ -1881,10 +1890,10 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent)
     if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
         for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) {
             if (pVideoEnc->pMFCEncInputBuffer[i] != NULL) {
-                if (pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->YVirAddr);
-                if (pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr != NULL)
-                    Exynos_OSAL_SharedMemory_Free(pVideoEnc->hSharedMemory, pVideoEnc->pMFCEncInputBuffer[i]->CVirAddr);
+                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;
             }
@@ -1935,8 +1944,9 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
 
     if ((pSrcInputData->dataLen >= 0) ||
         ((pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS) == OMX_BUFFERFLAG_EOS)) {
-        OMX_PTR pMFCYUVVirBuffer[MFC_INPUT_BUFFER_PLANE] = {NULL, NULL};
         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;
@@ -1947,22 +1957,39 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
 
         /* queue work for input buffer */
         Exynos_OSAL_Log(EXYNOS_LOG_ERROR, "Exynos_Mpeg4Enc_SrcIn(): oneFrameSize: %d, bufferHeader: 0x%x", oneFrameSize, pSrcInputData->bufferHeader);
-        CODEC_ENC_INPUT_BUFFER *codecInputBuffer = (CODEC_ENC_INPUT_BUFFER *)pSrcInputData->pPrivate;
+        pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
+        pMFCYUVDataSize[1] = pMFCYUVDataSize[0] / 2;
 
-        pMFCYUVVirBuffer[0] = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[0];
-        pMFCYUVVirBuffer[1] = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[1];
+        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                    (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
+#ifdef USE_METADATABUFFERTYPE
+        if ((codecReturn == VIDEO_ERROR_NOBUFFERS) &&
+            (pExynosInputPort->bStoreMetaData == OMX_TRUE) &&
+            (pExynosInputPort->bufferProcessType == BUFFER_SHARE)) {
+            OMX_U32 nAllocLen[MFC_INPUT_BUFFER_PLANE] = {0, 0};
+            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);
+            for (plane = 0; plane < MFC_INPUT_BUFFER_PLANE; plane++) {
+                planes[plane].addr = pSrcInputData->buffer.multiPlaneBuffer.dataBuffer[plane];
+                planes[plane].allocSize = nAllocLen[plane];
+                planes[plane].fd = pSrcInputData->buffer.multiPlaneBuffer.fd[plane];
+            }
 
-        if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) {
-            CODEC_ENC_INPUT_BUFFER *codecInputBuffer = (CODEC_ENC_INPUT_BUFFER *)pSrcInputData->pPrivate;
-            pMFCYUVDataSize[0] = codecInputBuffer->YDataSize;
-            pMFCYUVDataSize[1] = codecInputBuffer->CDataSize;
-        } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) {
-            pMFCYUVDataSize[0] = pExynosInputPort->portDefinition.format.video.nFrameWidth * pExynosInputPort->portDefinition.format.video.nFrameHeight;
-            pMFCYUVDataSize[1] = pMFCYUVDataSize[0]/2;
-        }
+            /* Register input buffer */
+            for (i = 0; i < pExynosInputPort->portDefinition.nBufferCountActual; i++) {
+                if (pInbufOps->Register(pMpeg4Enc->hMFCMpeg4Handle.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;
+                }
+            }
+            codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pSrcInputData->buffer.multiPlaneBuffer.dataBuffer,
+                                        (unsigned int *)pMFCYUVDataSize, MFC_INPUT_BUFFER_PLANE, pSrcInputData->bufferHeader);
 
-        codecReturn = pInbufOps->Enqueue(hMFCHandle, (unsigned char **)pMFCYUVVirBuffer,
-                              (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;
@@ -2017,16 +2044,18 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
         pSrcOutputData->pPrivate = NULL;
         pSrcOutputData->bufferHeader = NULL;
     } else {
-        pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[0] = pVideoBuffer->planes[0].addr;
-        pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[1] = pVideoBuffer->planes[1].addr;
-        pSrcOutputData->buffer.multiPlaneBuffer.dataBuffer[2] = pVideoBuffer->planes[2].addr;
+        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]->YVirAddr) {
+            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;
@@ -2034,8 +2063,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_SrcOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
                 }
                 i++;
             }
-            pVideoEnc->pMFCEncInputBuffer[i]->YDataSize = 0;
-            pVideoEnc->pMFCEncInputBuffer[i]->CDataSize = 0;
+            pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
             pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i];
         }
 
@@ -2071,8 +2099,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_DstIn(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX
         goto EXIT;
     }
 
-    codecReturn = pOutbufOps->Enqueue(hMFCHandle,
-                     (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer,
+    codecReturn = pOutbufOps->Enqueue(hMFCHandle, (unsigned char **)&pDstInputData->buffer.singlePlaneBuffer.dataBuffer,
                      (unsigned int *)&dataLen, MFC_OUTPUT_BUFFER_PLANE, pDstInputData->bufferHeader);
 
     if (codecReturn != VIDEO_ERROR_NONE) {
@@ -2120,6 +2147,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
     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;
@@ -2152,6 +2180,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_DstOut(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OM
 
     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;
     }