diff options
author | SeungBeom Kim <sbcrux.kim@samsung.com> | 2013-11-08 12:33:36 +0900 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2014-06-03 18:05:29 -0700 |
commit | c2eff709449b17a1bab5fc8c32f3f1408592c0b2 (patch) | |
tree | 59af770e8dc812a6429e4036cf19701bda6e75e1 /exynos_omx | |
parent | ae68c595f44b030329f6842f6c426716168dca09 (diff) | |
download | exynos5-c2eff709449b17a1bab5fc8c32f3f1408592c0b2.tar.gz |
exynos_omx: multi_thread: Change scheme of codec buffer alloc in video encode.
The case of input port copy mode in video encode, Need codec buffer.
This patch supports dynamic calculation of the buffer size of the codec.
Bug: 10838086
Change-Id: I7b7ad97a57455a861ad8e93964891565d95a3899
Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com>
Diffstat (limited to 'exynos_omx')
4 files changed, 25 insertions, 71 deletions
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 092265d..5c0b583 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 @@ -682,30 +682,31 @@ OMX_ERRORTYPE Exynos_OMX_ExtensionSetup(OMX_HANDLETYPE hComponent) } else { exynosInputPort->bufferProcessType = BUFFER_COPY; } - - if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { - OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {0, }; - nPlaneSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE; - nPlaneSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE; - - Exynos_OSAL_SemaphoreCreate(&exynosInputPort->codecSemID); - Exynos_OSAL_QueueCreate(&exynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); - - ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize); - if (ret != OMX_ErrorNone) - goto EXIT; - - for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) - Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]); - } else if (exynosInputPort->bufferProcessType == BUFFER_SHARE) { - /*************/ - /* TBD */ - /*************/ - /* Does not require any actions. */ - } } } + if ((exynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { + OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {0, }; + nPlaneSize[0] = ALIGN_TO_16B(exynosInputPort->portDefinition.format.video.nFrameWidth) + * ALIGN_TO_16B(exynosInputPort->portDefinition.format.video.nFrameHeight); + nPlaneSize[1] = ALIGN((nPlaneSize[0] / 2), 256); + + Exynos_OSAL_SemaphoreCreate(&exynosInputPort->codecSemID); + Exynos_OSAL_QueueCreate(&exynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); + + ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize); + if (ret != OMX_ErrorNone) + goto EXIT; + + for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) + Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]); + } else if (exynosInputPort->bufferProcessType == BUFFER_SHARE) { + /*************/ + /* TBD */ + /*************/ + /* Does not require any actions. */ + } + EXIT: return ret; @@ -1237,7 +1238,7 @@ OMX_ERRORTYPE Exynos_OMX_VideoEncodeComponentInit(OMX_IN OMX_HANDLETYPE hCompone pExynosComponent->bSaveFlagEOS = OMX_FALSE; pExynosComponent->bBehaviorEOS = OMX_FALSE; - pVideoEnc->bFirstInput = OMX_FALSE; + pVideoEnc->bFirstInput = OMX_TRUE; pVideoEnc->bFirstOutput = OMX_FALSE; pVideoEnc->configChange = OMX_FALSE; pVideoEnc->quantization.nQpI = 4; // I frame quantization parameter 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 12f8178..ee60500 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 @@ -1626,30 +1626,6 @@ OMX_ERRORTYPE Exynos_H264Enc_Init(OMX_COMPONENTTYPE *pOMXComponent) pInbufOps = pH264Enc->hMFCH264Handle.pInbufOps; pOutbufOps = pH264Enc->hMFCH264Handle.pOutbufOps; - if ((pExynosInputPort->bStoreMetaData != OMX_TRUE) && - (eColorFormat != OMX_COLOR_FormatAndroidOpaque)) { - if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { - OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {0, }; - nPlaneSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE; - nPlaneSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE; - - Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID); - Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); - - ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize); - if (ret != OMX_ErrorNone) - goto EXIT; - - for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) - Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]); - } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { - /*************/ - /* TBD */ - /*************/ - /* Does not require any actions. */ - } - } - if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID); Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); @@ -1719,6 +1695,7 @@ OMX_ERRORTYPE Exynos_H264Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent) Exynos_Free_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX); Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ); Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID); + pVideoEnc->bFirstInput = OMX_TRUE; } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { /*************/ /* TBD */ 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 883f12b..e915304 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 @@ -1824,30 +1824,6 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Init(OMX_COMPONENTTYPE *pOMXComponent) pInbufOps = pMpeg4Enc->hMFCMpeg4Handle.pInbufOps; pOutbufOps = pMpeg4Enc->hMFCMpeg4Handle.pOutbufOps; - if ((pExynosInputPort->bStoreMetaData != OMX_TRUE) && - (eColorFormat != OMX_COLOR_FormatAndroidOpaque)) { - if ((pExynosInputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { - OMX_U32 nPlaneSize[MFC_INPUT_BUFFER_PLANE] = {0, }; - nPlaneSize[0] = DEFAULT_MFC_INPUT_YBUFFER_SIZE; - nPlaneSize[1] = DEFAULT_MFC_INPUT_CBUFFER_SIZE; - - Exynos_OSAL_SemaphoreCreate(&pExynosInputPort->codecSemID); - Exynos_OSAL_QueueCreate(&pExynosInputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); - - ret = Exynos_Allocate_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX, MFC_INPUT_BUFFER_NUM_MAX, nPlaneSize); - if (ret != OMX_ErrorNone) - goto EXIT; - - for (i = 0; i < MFC_INPUT_BUFFER_NUM_MAX; i++) - Exynos_CodecBufferEnQueue(pExynosComponent, INPUT_PORT_INDEX, pVideoEnc->pMFCEncInputBuffer[i]); - } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { - /*************/ - /* TBD */ - /*************/ - /* Does not require any actions. */ - } - } - if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { Exynos_OSAL_SemaphoreCreate(&pExynosOutputPort->codecSemID); Exynos_OSAL_QueueCreate(&pExynosOutputPort->codecBufferQ, MAX_QUEUE_ELEMENTS); @@ -1917,6 +1893,7 @@ OMX_ERRORTYPE Exynos_Mpeg4Enc_Terminate(OMX_COMPONENTTYPE *pOMXComponent) Exynos_Free_CodecBuffers(pOMXComponent, INPUT_PORT_INDEX); Exynos_OSAL_QueueTerminate(&pExynosInputPort->codecBufferQ); Exynos_OSAL_SemaphoreTerminate(pExynosInputPort->codecSemID); + pVideoEnc->bFirstInput = OMX_TRUE; } else if (pExynosInputPort->bufferProcessType == BUFFER_SHARE) { /*************/ /* TBD */ diff --git a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp index da348f3..5c99e9c 100644 --- a/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp +++ b/exynos_omx/openmax/exynos_omx/osal/Exynos_OSAL_Android.cpp @@ -803,7 +803,6 @@ OMX_ERRORTYPE Exynos_OSAL_SetANBParameter( pExynosPort->bStoreMetaData = pANBParams->bStoreMetaData; if (pExynosComponent->codecType == HW_VIDEO_ENC_CODEC) { EXYNOS_OMX_VIDEOENC_COMPONENT *pVideoEnc = (EXYNOS_OMX_VIDEOENC_COMPONENT *)pExynosComponent->hComponentHandle;; - pVideoEnc->bFirstInput = OMX_TRUE; } else if (pExynosComponent->codecType == HW_VIDEO_DEC_CODEC) { EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle;; if ((portIndex == OUTPUT_PORT_INDEX) && |