From bd09b8148180c902648b5ac57d024f457f852efa Mon Sep 17 00:00:00 2001 From: SeungBeom Kim Date: Tue, 17 Sep 2013 10:03:40 +0900 Subject: [PATCH] exynos_omx: multi_thread: Fix for dynamic resolution change timing issue. Change-Id: I302de465745513a29dcacb33fe623c3cad7f6b1d Signed-off-by: SeungBeom Kim Bug: 10192533 --- .../component/common/Exynos_OMX_Baseport.h | 3 + .../component/video/dec/Exynos_OMX_Vdec.c | 1 - .../component/video/dec/Exynos_OMX_Vdec.h | 2 - .../video/dec/Exynos_OMX_VdecControl.c | 31 +++++++- .../video/dec/h264/Exynos_OMX_H264dec.c | 76 ++++++++++++------- .../video/dec/mpeg4/Exynos_OMX_Mpeg4dec.c | 16 ++-- .../video/dec/vp8/Exynos_OMX_Vp8dec.c | 15 ++-- 7 files changed, 94 insertions(+), 50 deletions(-) diff --git a/exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Baseport.h b/exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Baseport.h index 1cc43a8..598b7ab 100644 --- a/exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Baseport.h +++ b/exynos_omx/openmax/exynos_omx/component/common/Exynos_OMX_Baseport.h @@ -191,6 +191,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/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.c b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.c index eed7bf1..3f072c5 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.c +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.c @@ -1232,7 +1232,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; pExynosComponent->hComponentHandle = (OMX_HANDLETYPE)pVideoDec; pExynosComponent->bSaveFlagEOS = OMX_FALSE; diff --git a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h index 468bbd2..ac78794 100644 --- a/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h +++ b/exynos_omx/openmax/exynos_omx/component/video/dec/Exynos_OMX_Vdec.h @@ -61,7 +61,6 @@ #define MFC_OUTPUT_BUFFER_PLANE 2 #define MAX_OUTPUTBUFFER_NUM_DYNAMIC 0 /* Dynamic number of metadata buffer */ -#define PLATFORM_DISPLAY_BUFFER 1 typedef struct { @@ -109,7 +108,6 @@ typedef struct _EXYNOS_OMX_VIDEODEC_COMPONENT /* For Reconfiguration DPB */ OMX_BOOL bReconfigDPB; - OMX_U32 nSavedDPBCnt; /* CSC handle */ OMX_PTR csc_handle; 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 cc512de..cd97b44 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 @@ -470,10 +470,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) { @@ -609,6 +606,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 *dataBuffer) { 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 ec3eef2..10d0a1d 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 @@ -634,6 +634,8 @@ OMX_ERRORTYPE H264CodecReconfigAllBuffers( pBufferOps->Clear_RegisteredBuffer(hMFCHandle); pBufferOps->Cleanup_Buffer(hMFCHandle); } + + Exynos_ResolutionUpdate(pOMXComponent); } else { ret = OMX_ErrorBadParameter; goto EXIT; @@ -715,6 +717,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)); @@ -732,24 +738,33 @@ OMX_ERRORTYPE H264CodecCheckResolutionChange(OMX_COMPONENTTYPE *pOMXComponent) 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) || (pInputPort->portDefinition.format.video.nFrameWidth != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameWidth) || (pInputPort->portDefinition.format.video.nFrameHeight != pH264Dec->hMFCH264Handle.codecOutbufConf.nFrameHeight)) { - 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); pOutputPort->exceptionFlag = NEED_PORT_DISABLE; /** Send Port Settings changed call back **/ @@ -766,15 +781,14 @@ 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)) { - 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 - 2; - pOutputPort->portDefinition.nBufferCountMin = pH264Dec->hMFCH264Handle.maxDPBNum - 2; - - 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 = 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 **/ @@ -791,11 +805,12 @@ 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)) @@ -967,15 +982,18 @@ OMX_ERRORTYPE H264CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent) FunctionIn(); - /* get dpb count */ - nOutbufs = pH264Dec->hMFCH264Handle.maxDPBNum; - if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { + /* BUFFER_COPY, get dpb count */ + nOutbufs = pH264Dec->hMFCH264Handle.maxDPBNum; + /* should be done before prepare output buffer */ if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { ret = OMX_ErrorInsufficientResources; goto EXIT; } + } else { + /*BUFFER_SHERE case, get dpb count */ + nOutbufs = pExynosOutputPort->portDefinition.nBufferCountActual; } if (pOutbufOps->Enable_DynamicDPB(hMFCHandle) != VIDEO_ERROR_NONE) { ret = OMX_ErrorUndefined; 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 d72a7d2..bae0f2f 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 @@ -885,8 +885,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); pMpeg4Dec->hMFCMpeg4Handle.bConfiguredMFCSrc = OMX_TRUE; @@ -920,8 +918,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 - PLATFORM_DISPLAY_BUFFER; - pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum - PLATFORM_DISPLAY_BUFFER; + pExynosOutputPort->portDefinition.nBufferCountActual = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum; + pExynosOutputPort->portDefinition.nBufferCountMin = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum; Exynos_UpdateFrameSize(pOMXComponent); pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; @@ -964,16 +962,20 @@ OMX_ERRORTYPE Mpeg4CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent) FunctionIn(); - /* get dpb count */ - nOutbufs = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum; - if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { + /* BUFFER_COPY case, get dpb count */ + nOutbufs = pMpeg4Dec->hMFCMpeg4Handle.maxDPBNum; + /* should be done before prepare output buffer */ if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { ret = OMX_ErrorInsufficientResources; goto EXIT; } + } else { + /*BUFFER_SHERE case, get dpb count */ + nOutbufs = pExynosOutputPort->portDefinition.nBufferCountActual; } + if (pOutbufOps->Enable_DynamicDPB(hMFCHandle) != VIDEO_ERROR_NONE) { ret = OMX_ErrorUndefined; 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 746799c..e2980bb 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 @@ -696,8 +696,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); pVp8Dec->hMFCVp8Handle.bConfiguredMFCSrc = OMX_TRUE; @@ -731,8 +729,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); pExynosOutputPort->exceptionFlag = NEED_PORT_DISABLE; @@ -775,15 +773,18 @@ OMX_ERRORTYPE VP8CodecDstSetup(OMX_COMPONENTTYPE *pOMXComponent) FunctionIn(); - /* get dpb count */ - nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum; - if ((pExynosOutputPort->bufferProcessType & BUFFER_COPY) == BUFFER_COPY) { + /* BUFFER_COPY case, get dpb count */ + nOutbufs = pVp8Dec->hMFCVp8Handle.maxDPBNum; + /* should be done before prepare output buffer */ if (pOutbufOps->Enable_Cacheable(hMFCHandle) != VIDEO_ERROR_NONE) { ret = OMX_ErrorInsufficientResources; goto EXIT; } + } else { + /*BUFFER_SHERE case, get dpb count */ + nOutbufs = pExynosOutputPort->portDefinition.nBufferCountActual; } if (pOutbufOps->Enable_DynamicDPB(hMFCHandle) != VIDEO_ERROR_NONE) { ret = OMX_ErrorUndefined; -- 2.20.1