From: SeungBeom Kim <sbcrux.kim@samsung.com> Date: Wed, 4 Jul 2012 06:01:54 +0000 (+0900) Subject: exynos_omx: multi_thread: Video encoder supported ION fd. X-Git-Tag: cm-10.1-M1~298 X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=91f44a5dded6f2b54c919f74d18bc43f86175713;p=GitHub%2FLineageOS%2Fandroid_hardware_samsung_slsi_exynos5.git exynos_omx: multi_thread: Video encoder supported ION fd. Video encode component supported ION fd. Change-Id: Ib8dcb66eaf54371f69b5404cfdf3b954368386c0 Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com> --- diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c index 2652811..6d477cd 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.c @@ -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; diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h index 7a387bb..578bacd 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_Venc.h @@ -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; diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c index e584a0c..a5937bd 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/Exynos_OMX_VencControl.c @@ -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; diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c index 812b200..92b0734 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/h264/Exynos_OMX_H264enc.c @@ -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; diff --git a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c index 937e9d5..09dd7b6 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c +++ b/exynos_omx/openmax/exynos_omx/component/video/enc/mpeg4/Exynos_OMX_Mpeg4enc.c @@ -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; }