From 18daf30629b8b2500c8c88c0e20e27e898420525 Mon Sep 17 00:00:00 2001 From: SeungBeom Kim Date: Sun, 29 Mar 2015 15:22:44 +0200 Subject: [PATCH] video_dec: Fix for dynamic resolution change timing issue. Backported-from: hardware/samsung_slsi/exynos5 Change-Id: I8bba464d9a7eaa43511d0324badba711ea1cc931 Signed-off-by: Andreas Schneider --- component/common/Exynos_OMX_Baseport.c | 1 + component/common/Exynos_OMX_Baseport.h | 3 + component/video/dec/Exynos_OMX_Vdec.c | 1 - component/video/dec/Exynos_OMX_Vdec.h | 3 - component/video/dec/Exynos_OMX_VdecControl.c | 31 +++++++- component/video/dec/h264/Exynos_OMX_H264dec.c | 73 ++++++++++++------- .../video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c | 6 +- component/video/dec/vp8/Exynos_OMX_Vp8dec.c | 6 +- 8 files changed, 80 insertions(+), 44 deletions(-) diff --git a/component/common/Exynos_OMX_Baseport.c b/component/common/Exynos_OMX_Baseport.c index 073e288..19d9cf5 100644 --- a/component/common/Exynos_OMX_Baseport.c +++ b/component/common/Exynos_OMX_Baseport.c @@ -888,6 +888,7 @@ OMX_ERRORTYPE Exynos_ResetCodecData(EXYNOS_OMX_DATA *pData) pData->timeStamp = 0; pData->pPrivate = NULL; pData->bufferHeader = NULL; + pData->allocSize = 0; EXIT: return ret; diff --git a/component/common/Exynos_OMX_Baseport.h b/component/common/Exynos_OMX_Baseport.h index a032f62..9117cf9 100644 --- a/component/common/Exynos_OMX_Baseport.h +++ b/component/common/Exynos_OMX_Baseport.h @@ -193,6 +193,9 @@ typedef struct _EXYNOS_OMX_BASEPORT OMX_HANDLETYPE hAllCodecBufferReturnEvent; OMX_HANDLETYPE hPortMutex; EXYNOS_OMX_EXCEPTION_STATE exceptionFlag; + + OMX_PARAM_PORTDEFINITIONTYPE newPortDefinition; + OMX_CONFIG_RECTTYPE newCropRectangle; } EXYNOS_OMX_BASEPORT; diff --git a/component/video/dec/Exynos_OMX_Vdec.c b/component/video/dec/Exynos_OMX_Vdec.c index d3442fa..69d300f 100644 --- a/component/video/dec/Exynos_OMX_Vdec.c +++ b/component/video/dec/Exynos_OMX_Vdec.c @@ -1263,7 +1263,6 @@ OMX_ERRORTYPE Exynos_OMX_VideoDecodeComponentInit(OMX_IN OMX_HANDLETYPE hCompone Exynos_OSAL_Memset(pVideoDec, 0, sizeof(EXYNOS_OMX_VIDEODEC_COMPONENT)); pVideoDec->bReconfigDPB = OMX_FALSE; - pVideoDec->nSavedDPBCnt = 0; pVideoDec->bDTSMode = OMX_FALSE; pVideoDec->bQosChanged = OMX_FALSE; pVideoDec->nQosRatio = 0; diff --git a/component/video/dec/Exynos_OMX_Vdec.h b/component/video/dec/Exynos_OMX_Vdec.h index 7e05fbf..70866e9 100644 --- a/component/video/dec/Exynos_OMX_Vdec.h +++ b/component/video/dec/Exynos_OMX_Vdec.h @@ -65,8 +65,6 @@ #define MAX_INPUTBUFFER_NUM_DYNAMIC 0 /* Dynamic number of metadata buffer */ -#define PLATFORM_DISPLAY_BUFFER 2 - typedef struct { void *pAddrY; @@ -121,7 +119,6 @@ typedef struct _EXYNOS_OMX_VIDEODEC_COMPONENT /* For Reconfiguration DPB */ OMX_BOOL bReconfigDPB; - OMX_U32 nSavedDPBCnt; /* For Dual DPB */ OMX_BOOL bDualDPBMode; diff --git a/component/video/dec/Exynos_OMX_VdecControl.c b/component/video/dec/Exynos_OMX_VdecControl.c index 90e3214..5c0fe42 100644 --- a/component/video/dec/Exynos_OMX_VdecControl.c +++ b/component/video/dec/Exynos_OMX_VdecControl.c @@ -481,10 +481,7 @@ OMX_ERRORTYPE Exynos_OMX_FlushPort(OMX_COMPONENTTYPE *pOMXComponent, OMX_S32 por } Exynos_ResetCodecData(&pExynosPort->processData); - if (pVideoDec->bReconfigDPB == OMX_TRUE) - maxBufferNum = pVideoDec->nSavedDPBCnt; - else - maxBufferNum = pExynosPort->portDefinition.nBufferCountActual; + maxBufferNum = pExynosPort->portDefinition.nBufferCountActual; for (i = 0; i < maxBufferNum; i++) { if (pExynosPort->extendBufferHeader[i].bBufferInOMX == OMX_TRUE) { if (portIndex == OUTPUT_PORT_INDEX) { @@ -627,6 +624,32 @@ EXIT: return ret; } +OMX_ERRORTYPE Exynos_ResolutionUpdate(OMX_COMPONENTTYPE *pOMXComponent) +{ + OMX_ERRORTYPE ret = OMX_ErrorNone; + EXYNOS_OMX_BASECOMPONENT *pExynosComponent = (EXYNOS_OMX_BASECOMPONENT *)pOMXComponent->pComponentPrivate; + EXYNOS_OMX_VIDEODEC_COMPONENT *pVideoDec = (EXYNOS_OMX_VIDEODEC_COMPONENT *)pExynosComponent->hComponentHandle; + EXYNOS_OMX_BASEPORT *pInputPort = &pExynosComponent->pExynosPort[INPUT_PORT_INDEX]; + EXYNOS_OMX_BASEPORT *pOutputPort = &pExynosComponent->pExynosPort[OUTPUT_PORT_INDEX]; + + pOutputPort->cropRectangle.nTop = pOutputPort->newCropRectangle.nTop; + pOutputPort->cropRectangle.nLeft = pOutputPort->newCropRectangle.nLeft; + pOutputPort->cropRectangle.nWidth = pOutputPort->newCropRectangle.nWidth; + pOutputPort->cropRectangle.nHeight = pOutputPort->newCropRectangle.nHeight; + + pInputPort->portDefinition.format.video.nFrameWidth = pInputPort->newPortDefinition.format.video.nFrameWidth; + pInputPort->portDefinition.format.video.nFrameHeight = pInputPort->newPortDefinition.format.video.nFrameHeight; + pInputPort->portDefinition.format.video.nStride = pInputPort->newPortDefinition.format.video.nStride; + pInputPort->portDefinition.format.video.nSliceHeight = pInputPort->newPortDefinition.format.video.nSliceHeight; + + pOutputPort->portDefinition.nBufferCountActual = pOutputPort->newPortDefinition.nBufferCountActual; + pOutputPort->portDefinition.nBufferCountMin = pOutputPort->newPortDefinition.nBufferCountMin; + + Exynos_UpdateFrameSize(pOMXComponent); + + return ret; +} + OMX_ERRORTYPE Exynos_InputBufferReturn( OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATABUFFER *pDataBuffer) diff --git a/component/video/dec/h264/Exynos_OMX_H264dec.c b/component/video/dec/h264/Exynos_OMX_H264dec.c index 1b42a88..5cdff3e 100644 --- a/component/video/dec/h264/Exynos_OMX_H264dec.c +++ b/component/video/dec/h264/Exynos_OMX_H264dec.c @@ -652,6 +652,8 @@ OMX_ERRORTYPE H264CodecReconfigAllBuffers( pBufferOps->Clear_RegisteredBuffer(hMFCHandle); pBufferOps->Cleanup_Buffer(hMFCHandle); } + + Exynos_ResolutionUpdate(pOMXComponent); } else { ret = OMX_ErrorBadParameter; goto EXIT; @@ -776,6 +778,10 @@ OMX_ERRORTYPE H264CodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent) ExynosVideoDecOps *pDecOps = pH264Dec->hMFCH264Handle.pDecOps; ExynosVideoDecBufferOps *pOutbufOps = pH264Dec->hMFCH264Handle.pOutbufOps; + OMX_CONFIG_RECTTYPE *pCropRectangle = NULL; + OMX_PARAM_PORTDEFINITIONTYPE *pInputPortDefinition = NULL; + OMX_PARAM_PORTDEFINITIONTYPE *pOutputPortDefinition = NULL; + FunctionIn(); /* get geometry for output */ Exynos_OSAL_Memset(&pH264Dec->hMFCH264Handle.codecOutbufConf, 0, sizeof(ExynosVideoGeometry)); @@ -789,20 +795,25 @@ OMX_ERRORTYPE H264CodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent) pH264Dec->hMFCH264Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); if (pVideoDec->bThumbnailMode == OMX_FALSE) { pH264Dec->hMFCH264Handle.maxDPBNum += EXTRA_DPB_NUM; - } else { - pH264Dec->hMFCH264Handle.maxDPBNum += PLATFORM_DISPLAY_BUFFER; } Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "H264CodecSetup nOutbufs: %d", pH264Dec->hMFCH264Handle.maxDPBNum); pH264Dec->hMFCH264Handle.bConfiguredMFCSrc = OMX_TRUE; - pOutputPort->cropRectangle.nTop = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nTop; - pOutputPort->cropRectangle.nLeft = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nLeft; - pOutputPort->cropRectangle.nWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nWidth; - pOutputPort->cropRectangle.nHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nHeight; + if (pVideoDec->bReconfigDPB != OMX_TRUE) { + pCropRectangle = &(pOutputPort->cropRectangle); + pInputPortDefinition = &(pInputPort->portDefinition); + pOutputPortDefinition = &(pOutputPort->portDefinition); + } else { + pCropRectangle = &(pOutputPort->newCropRectangle); + pInputPortDefinition = &(pInputPort->newPortDefinition); + pOutputPortDefinition = &(pOutputPort->newPortDefinition); + } - if (pVideoDec->bReconfigDPB == OMX_TRUE) - pVideoDec->nSavedDPBCnt = pOutputPort->portDefinition.nBufferCountActual; + pCropRectangle->nTop = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nTop; + pCropRectangle->nLeft = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nLeft; + pCropRectangle->nWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nWidth; + pCropRectangle->nHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nHeight; if (pOutputPort->bufferProcessType & BUFFER_COPY) { if ((pVideoDec->bReconfigDPB) || @@ -810,12 +821,15 @@ OMX_ERRORTYPE H264CodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent) (pInputPort->portDefinition.format.video.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight)) { pOutputPort->exceptionFlag = NEED_PORT_DISABLE; - pInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth; - pInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight; - pInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); - pInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - - Exynos_UpdateFrameSize(pOMXComponent); + pInputPortDefinition->format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth; + pInputPortDefinition->format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight; + pInputPortDefinition->format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); + pInputPortDefinition->format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); + pOutputPortDefinition->nBufferCountActual = pOutputPort->portDefinition.nBufferCountActual; + pOutputPortDefinition->nBufferCountMin = pOutputPort->portDefinition.nBufferCountMin; + if (pVideoDec->bReconfigDPB != OMX_TRUE) { + Exynos_UpdateFrameSize(pOMXComponent); + } /** Send Port Settings changed call back **/ (*(pExynosComponent->pCallbacks->EventHandler)) @@ -831,17 +845,18 @@ OMX_ERRORTYPE H264CodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent) (pInputPort->portDefinition.format.video.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth) || (pInputPort->portDefinition.format.video.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight) || (pOutputPort->portDefinition.nBufferCountActual != pH264Dec->hMFCH264Handle.maxDPBNum)) { - pOutputPort->exceptionFlag = NEED_PORT_DISABLE; - - pInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth; - pInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight; - pInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); - pInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - pOutputPort->portDefinition.nBufferCountActual = pH264Dec->hMFCH264Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; - pOutputPort->portDefinition.nBufferCountMin = pH264Dec->hMFCH264Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; + pInputPortDefinition->format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth; + pInputPortDefinition->format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight; + pInputPortDefinition->format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); + pInputPortDefinition->format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - Exynos_UpdateFrameSize(pOMXComponent); + pOutputPortDefinition->nBufferCountActual = pH264Dec->hMFCH264Handle.maxDPBNum; + pOutputPortDefinition->nBufferCountMin = pH264Dec->hMFCH264Handle.maxDPBNum; + if (pVideoDec->bReconfigDPB != OMX_TRUE) { + Exynos_UpdateFrameSize(pOMXComponent); + } + pOutputPort->exceptionFlag = NEED_PORT_DISABLE; /** Send Port Settings changed call back **/ (*(pExynosComponent->pCallbacks->EventHandler)) @@ -857,11 +872,13 @@ OMX_ERRORTYPE H264CodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent) (pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nWidth) || (pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.cropRect.nHeight)) { /* Check Crop */ - pInputPort->portDefinition.format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth; - pInputPort->portDefinition.format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight; - pInputPort->portDefinition.format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); - pInputPort->portDefinition.format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - Exynos_UpdateFrameSize(pOMXComponent); + pInputPortDefinition->format.video.nFrameWidth = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth; + pInputPortDefinition->format.video.nFrameHeight = pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight; + pInputPortDefinition->format.video.nStride = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); + pInputPortDefinition->format.video.nSliceHeight = ((pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); + if (pVideoDec->bReconfigDPB != OMX_TRUE) { + Exynos_UpdateFrameSize(pOMXComponent); + } /** Send crop info call back **/ (*(pExynosComponent->pCallbacks->EventHandler)) diff --git a/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c b/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c index 342f01f..627c17c 100644 --- a/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c +++ b/component/video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c @@ -913,8 +913,6 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); if (pVideoDec->bThumbnailMode == OMX_FALSE) { pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum += EXTRA_DPB_NUM; - } else { - pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum += PLATFORM_DISPLAY_BUFFER; } Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Mpeg4CodecSetup nOutbufs: %d", pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum); @@ -952,8 +950,8 @@ OMX_ERRORTYPE Mpeg4CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DA pExynosInputPort->portDefinition.format.video.nStride = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pMpeg4Dec->hMFCMpeg4Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - 2; - pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - 2; + pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum; + pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum; Exynos_UpdateFrameSize(pOMXComponent); diff --git a/component/video/dec/vp8/Exynos_OMX_Vp8dec.c b/component/video/dec/vp8/Exynos_OMX_Vp8dec.c index 7f65981..25b6da8 100644 --- a/component/video/dec/vp8/Exynos_OMX_Vp8dec.c +++ b/component/video/dec/vp8/Exynos_OMX_Vp8dec.c @@ -724,8 +724,6 @@ OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA pVp8Dec->hMFCVp8Handle.maxDPBNum = pDecOps->Get_ActualBufferCount(hMFCHandle); if (pVideoDec->bThumbnailMode == OMX_FALSE) { pVp8Dec->hMFCVp8Handle.maxDPBNum += EXTRA_DPB_NUM; - } else { - pVp8Dec->hMFCVp8Handle.maxDPBNum += PLATFORM_DISPLAY_BUFFER; } Exynos_OSAL_Log(EXYNOS_LOG_TRACE, "Vp8CodecSetup nOutbufs: %d", pVp8Dec->hMFCVp8Handle.maxDPBNum); @@ -763,8 +761,8 @@ OMX_ERRORTYPE VP8CodecSrcSetup(OMX_COMPONENTTYPE *pOMXComponent, EXYNOS_OMX_DATA pExynosInputPort->portDefinition.format.video.nStride = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameWidth + 15) & (~15)); pExynosInputPort->portDefinition.format.video.nSliceHeight = ((pVp8Dec->hMFCVp8Handle.codecOutbufConf.nFrameHeight + 15) & (~15)); - pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; - pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; + pExynosOutputPort->portDefinition.nBufferCountActual = pVp8Dec->hMFCVp8Handle.maxDPBNum; + pExynosOutputPort->portDefinition.nBufferCountMin = pVp8Dec->hMFCVp8Handle.maxDPBNum; Exynos_UpdateFrameSize(pOMXComponent); -- 2.20.1