From: SeungBeom Kim <sbcrux.kim@samsung.com> Date: Wed, 4 Jul 2012 00:56:12 +0000 (+0900) Subject: exynos_omx: multi_thread: enhance the exception handling. X-Git-Tag: cm-10.1-M1~304 X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=54cbf397a1e177ea34b304b6951d4f7eb571c259;p=GitHub%2FLineageOS%2Fandroid_hardware_samsung_slsi_exynos5.git exynos_omx: multi_thread: enhance the exception handling. in case of first frame EOS, enhance the exception handling. Change-Id: I72f74d4c5389119a499f74abb68f08bbe9cadd7a Signed-off-by: SeungBeom Kim <sbcrux.kim@samsung.com> --- diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c index 2570d77..75331dd 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_VdecControl.c @@ -889,6 +889,42 @@ EXIT: } +OMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) +{ + OMX_BUFFERHEADERTYPE *retBuffer = NULL; + EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; + EXYNOS_OMX_MESSAGE *message = NULL; + + FunctionIn(); + + if (pExynosComponent->currentState != OMX_StateExecuting) { + retBuffer = NULL; + goto EXIT; + } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) && + (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){ + Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID); + + message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); + if (message == NULL) { + retBuffer = NULL; + goto EXIT; + } + if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) { + Exynos_OSAL_Free(message); + retBuffer = NULL; + goto EXIT; + } + + retBuffer = (OMX_BUFFERHEADERTYPE *)(message->pCmdData); + Exynos_OSAL_Free(message); + } + +EXIT: + FunctionOut(); + + return retBuffer; +} + OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data) { OMX_ERRORTYPE ret = OMX_ErrorNone; diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c index dcc8cc9..b69cd0e 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/h264/Exynos_OMX_H264dec.c @@ -604,17 +604,16 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT FunctionIn(); if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) { - EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData; - - ret = Exynos_OutputBufferGetQueue(pExynosComponent); - if (ret != OMX_ErrorNone) { + OMX_BUFFERHEADERTYPE *OMXBuffer = NULL; + OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent); + if (OMXBuffer == NULL) { ret = OMX_ErrorUndefined; goto EXIT; } - pDstOutputData->timeStamp = pSrcInputData->timeStamp; - pDstOutputData->nFlags = pSrcInputData->nFlags; - Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData); + OMXBuffer->nTimeStamp = pSrcInputData->timeStamp; + OMXBuffer->nFlags = pSrcInputData->nFlags; + Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer); ret = OMX_ErrorNone; goto EXIT; diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c index 648c554..f168aab 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c @@ -708,16 +708,16 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA FunctionIn(); if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) { - EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData; - ret = Exynos_OutputBufferGetQueue(pExynosComponent); - if (ret != OMX_ErrorNone) { + OMX_BUFFERHEADERTYPE *OMXBuffer = NULL; + OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent); + if (OMXBuffer == NULL) { ret = OMX_ErrorUndefined; goto EXIT; } - pDstOutputData->timeStamp = pSrcInputData->timeStamp; - pDstOutputData->nFlags = pSrcInputData->nFlags; - Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData); + OMXBuffer->nTimeStamp = pSrcInputData->timeStamp; + OMXBuffer->nFlags = pSrcInputData->nFlags; + Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer); ret = OMX_ErrorNone; goto EXIT; diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c index 922c26f..7843fa8 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/vp8/Exynos_OMX_Vp8dec.c @@ -523,16 +523,16 @@ OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA FunctionIn(); if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) { - EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData; - ret = Exynos_OutputBufferGetQueue(pExynosComponent); - if (ret != OMX_ErrorNone) { + OMX_BUFFERHEADERTYPE *OMXBuffer = NULL; + OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent); + if (OMXBuffer == NULL) { ret = OMX_ErrorUndefined; goto EXIT; } - pDstOutputData->timeStamp = pSrcInputData->timeStamp; - pDstOutputData->nFlags = pSrcInputData->nFlags; - Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData); + OMXBuffer->nTimeStamp = pSrcInputData->timeStamp; + OMXBuffer->nFlags = pSrcInputData->nFlags; + Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer); ret = OMX_ErrorNone; goto EXIT; 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 33fadb8..e584a0c 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 @@ -891,6 +891,42 @@ EXIT: } +OMX_BUFFERHEADERTYPE *Exynos_OutputBufferGetQueue_Direct(EXYNOS_OMX_BASECOMPONENT *pExynosComponent) +{ + OMX_BUFFERHEADERTYPE *retBuffer = NULL; + EXYNOS_OMX_BASEPORT *pExynosPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; + EXYNOS_OMX_MESSAGE *message = NULL; + + FunctionIn(); + + if (pExynosComponent->currentState != OMX_StateExecuting) { + retBuffer = NULL; + goto EXIT; + } else if ((pExynosComponent->transientState != EXYNOS_OMX_TransStateExecutingToIdle) && + (!CHECK_PORT_BEING_FLUSHED(pExynosPort))){ + Exynos_OSAL_SemaphoreWait(pExynosPort->bufferSemID); + + message = (EXYNOS_OMX_MESSAGE *)Exynos_OSAL_Dequeue(&pExynosPort->bufferQ); + if (message == NULL) { + retBuffer = NULL; + goto EXIT; + } + if (message->messageType == EXYNOS_OMX_CommandFakeBuffer) { + Exynos_OSAL_Free(message); + retBuffer = NULL; + goto EXIT; + } + + retBuffer = (OMX_BUFFERHEADERTYPE *)(message->pCmdData); + Exynos_OSAL_Free(message); + } + +EXIT: + FunctionOut(); + + return retBuffer; +} + OMX_ERRORTYPE Exynos_CodecBufferEnQueue(EXYNOS_OMX_BASECOMPONENT *pExynosComponent, OMX_U32 PortIndex, OMX_PTR data) { OMX_ERRORTYPE ret = OMX_ErrorNone; 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 d07a9ef..2eec7ea 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 @@ -752,17 +752,16 @@ OMX_ERRORTYPE H264CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DAT FunctionIn(); if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) { - EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData; - - ret = Exynos_OutputBufferGetQueue(pExynosComponent); - if (ret != OMX_ErrorNone) { + OMX_BUFFERHEADERTYPE *OMXBuffer = NULL; + OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent); + if (OMXBuffer == NULL) { ret = OMX_ErrorUndefined; goto EXIT; } - pDstOutputData->timeStamp = pSrcInputData->timeStamp; - pDstOutputData->nFlags = pSrcInputData->nFlags; - Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData); + OMXBuffer->nTimeStamp = pSrcInputData->timeStamp; + OMXBuffer->nFlags = pSrcInputData->nFlags; + Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer); ret = OMX_ErrorNone; goto EXIT; 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 1404f27..799febd 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 @@ -869,17 +869,16 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA FunctionIn(); if ((oneFrameSize <= 0) && (pSrcInputData->nFlags & OMX_BUFFERFLAG_EOS)) { - EXYNOS_OMX_DATA *pDstOutputData = &pExynosOutputPort->processData; - - ret = Exynos_OutputBufferGetQueue(pExynosComponent); - if (ret != OMX_ErrorNone) { + OMX_BUFFERHEADERTYPE *OMXBuffer = NULL; + OMXBuffer = Exynos_OutputBufferGetQueue_Direct(pExynosComponent); + if (OMXBuffer == NULL) { ret = OMX_ErrorUndefined; goto EXIT; } - pDstOutputData->timeStamp = pSrcInputData->timeStamp; - pDstOutputData->nFlags = pSrcInputData->nFlags; - Exynos_Postprocess_OutputData(pOMXComponent, pDstOutputData); + OMXBuffer->nTimeStamp = pSrcInputData->timeStamp; + OMXBuffer->nFlags = pSrcInputData->nFlags; + Exynos_OMX_OutputBufferReturn(pOMXComponent, OMXBuffer); ret = OMX_ErrorNone; goto EXIT;