diff --git a/codec/encoder/core/inc/wels_preprocess.h b/codec/encoder/core/inc/wels_preprocess.h index 0987420e..66879bae 100644 --- a/codec/encoder/core/inc/wels_preprocess.h +++ b/codec/encoder/core/inc/wels_preprocess.h @@ -121,7 +121,7 @@ class CWelsPreProcess { virtual ~CWelsPreProcess(); public: - int32_t WelsPreprocessReset (sWelsEncCtx* pEncCtx); + int32_t WelsPreprocessReset (sWelsEncCtx* pEncCtx,int32_t iWidth,int32_t iHeight); int32_t AllocSpatialPictures (sWelsEncCtx* pCtx, SWelsSvcCodingParam* pParam); void FreeSpatialPictures (sWelsEncCtx* pCtx); int32_t BuildSpatialPicList (sWelsEncCtx* pEncCtx, const SSourcePicture* kpSrcPic); diff --git a/codec/encoder/core/src/encoder_ext.cpp b/codec/encoder/core/src/encoder_ext.cpp index fcd78d79..e037dfd2 100644 --- a/codec/encoder/core/src/encoder_ext.cpp +++ b/codec/encoder/core/src/encoder_ext.cpp @@ -4627,9 +4627,6 @@ int32_t WelsEncoderParamAdjust (sWelsEncCtx** ppCtx, SWelsSvcCodingParam* pNewPa /* Update new parameters */ if (WelsInitEncoderExt (ppCtx, pNewParam, &sLogCtx, pExistingParasetList)) return 1; - - // reset the scaled spatial picture size - (*ppCtx)->pVpp->WelsPreprocessReset (*ppCtx); //if WelsInitEncoderExt succeed //for LTR (*ppCtx)->uiIdrPicId = uiTmpIdrPicId ;//this is for LTR!; //this is for LTR! diff --git a/codec/encoder/core/src/wels_preprocess.cpp b/codec/encoder/core/src/wels_preprocess.cpp index f7e79bae..b5c76259 100644 --- a/codec/encoder/core/src/wels_preprocess.cpp +++ b/codec/encoder/core/src/wels_preprocess.cpp @@ -109,9 +109,18 @@ int32_t CWelsPreProcess::WelsPreprocessDestroy() { return 0; } -int32_t CWelsPreProcess::WelsPreprocessReset (sWelsEncCtx* pCtx) { +int32_t CWelsPreProcess::WelsPreprocessReset (sWelsEncCtx* pCtx,int32_t iWidth,int32_t iHeight) { int32_t iRet = -1; - + SWelsSvcCodingParam* pSvcParam = pCtx->pSvcParam; + //init source width and height + pSvcParam->SUsedPicRect.iLeft = 0; + pSvcParam->SUsedPicRect.iTop = 0; + pSvcParam->SUsedPicRect.iWidth = iWidth; + pSvcParam->SUsedPicRect.iHeight = iHeight; + if ((iWidth < 16) || ((iHeight < 16))) { + WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "Don't support width(%d) or height(%d) which is less than 16 ",iWidth, iHeight); + return iRet; + } if (pCtx) { FreeScaledPic (&m_sScaledPicture, pCtx->pMemAlign); iRet = InitLastSpatialPictures (pCtx); @@ -175,27 +184,24 @@ void CWelsPreProcess::FreeSpatialPictures (sWelsEncCtx* pCtx) { int32_t CWelsPreProcess::BuildSpatialPicList (sWelsEncCtx* pCtx, const SSourcePicture* kpSrcPic) { SWelsSvcCodingParam* pSvcParam = pCtx->pSvcParam; int32_t iSpatialNum = 0; + int32_t iWidth = ((kpSrcPic->iPicWidth >> 1) << 1); + int32_t iHeight = ((kpSrcPic->iPicHeight >> 1) << 1); if (!m_bInitDone) { if (WelsPreprocessCreate() != 0) return -1; - //init source width and height - pSvcParam->SUsedPicRect.iLeft = 0; - pSvcParam->SUsedPicRect.iTop = 0; - pSvcParam->SUsedPicRect.iWidth = ((kpSrcPic->iPicWidth >> 1) << 1); - pSvcParam->SUsedPicRect.iHeight = ((kpSrcPic->iPicHeight >> 1) << 1); - if ((pSvcParam->SUsedPicRect.iWidth < 16) || ((pSvcParam->SUsedPicRect.iHeight < 16))) { - WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "Don't support width(%d) or height(%d) which is less than 16 ", - pSvcParam->SUsedPicRect.iWidth, pSvcParam->SUsedPicRect.iHeight); - return -1; - } - if (WelsPreprocessReset (pCtx) != 0) + if (WelsPreprocessReset (pCtx,iWidth,iHeight) != 0) return -1; m_iAvaliableRefInSpatialPicList = pSvcParam->iNumRefFrame; m_bInitDone = true; + } else { + if ((iWidth != pSvcParam->SUsedPicRect.iWidth) || (iHeight != pSvcParam->SUsedPicRect.iHeight)) { + if (WelsPreprocessReset (pCtx,iWidth,iHeight) != 0) + return -1; + } } if (m_pInterfaceVp == NULL) @@ -322,7 +328,7 @@ int32_t CWelsPreProcess::SingleLayerPreprocess (sWelsEncCtx* pCtx, const SSource iSrcHeight = pSvcParam->SUsedPicRect.iHeight; if (pSvcParam->uiIntraPeriod) pCtx->pVaa->bIdrPeriodFlag = (1 + pDlayerParamInternal->iFrameIndex >= (int32_t)pSvcParam->uiIntraPeriod) ? true : - false; + false; pSrcPic = pScaledPicture->pScaledInputPicture ? pScaledPicture->pScaledInputPicture : m_pSpatialPic[iDependencyId][iPicturePos];