Video encode component supported ION fd.
Change-Id: Ib8dcb66eaf54371f69b5404cfdf3b954368386c0
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
{
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;
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;
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
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;
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;
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();
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) {
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;
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]);
}
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 {
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;
}
} 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;
}
}
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);
}
}
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;
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]);
}
ExynosVideoEncBufferOps *pInbufOps = pH264Enc->hMFCH264Handle.pInbufOps;
ExynosVideoEncBufferOps *pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps;
- int i = 0;
+ int i = 0, plane = 0;
FunctionIn();
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;
}
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;
}
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;
/* 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;
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;
}
i++;
}
- pVideoEnc->pMFCEncInputBuffer[i]->YDataSize = 0;
- pVideoEnc->pMFCEncInputBuffer[i]->CDataSize = 0;
+ pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i];
}
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) {
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;
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]);
}
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 {
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;
}
} 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;
}
}
}
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);
}
}
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;
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]);
}
ExynosVideoEncBufferOps *pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps;
ExynosVideoEncBufferOps *pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps;
- int i = 0;
+ int i = 0, plane = 0;
FunctionIn();
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;
}
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;
}
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;
/* 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;
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;
}
i++;
}
- pVideoEnc->pMFCEncInputBuffer[i]->YDataSize = 0;
- pVideoEnc->pMFCEncInputBuffer[i]->CDataSize = 0;
+ pVideoEnc->pMFCEncInputBuffer[i]->dataSize = 0;
pSrcOutputData->pPrivate = pVideoEnc->pMFCEncInputBuffer[i];
}
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) {
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;
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;
}