ref: 3eda5a899e6cae2aee70a456b64237a72aee6db5
parent: 5d616714c4cdd30287e2c6a8aa485c2fc6c68b84
author: Martin Storsjö <martin@martin.st>
date: Wed Dec 18 08:37:45 EST 2013
Don't check for scene changes on forced IDR frames For the first encoded frame, is bEncCurFrmAsIdrFlag true while bIdrPeriodFlag is false. Previously, the scene detection code unnecessarily checked for a scene change in the first encoded frame (where the reference frame was an uninitialized frame), triggering valgrind warnings about using uninitialized memory.
--- a/codec/encoder/core/src/wels_preprocess.cpp
+++ b/codec/encoder/core/src/wels_preprocess.cpp
@@ -410,6 +410,7 @@
DownsamplePadding (pSrcPic, pDstPic, iSrcWidth, iSrcHeight, iShrinkWidth, iShrinkHeight, iTargetWidth, iTargetHeight);
if (pSvcParam->bEnableSceneChangeDetect && !pEncCtx->pVaa->bIdrPeriodFlag
+ && !pEncCtx->bEncCurFrmAsIdrFlag
&& ! (pEncCtx->iCodingIndex & (pSvcParam->uiGopSize - 1))) {
SPicture* pRefPic = pEncCtx->pLtr[iDependencyId].bReceivedT0LostFlag ?
pEncCtx->pSpatialPic[iDependencyId][pEncCtx->uiSpatialLayersInTemporal[iDependencyId] +
@@ -510,7 +511,7 @@
} while (i < kiSpatialNum);
if (pSvcParam->bEnableSceneChangeDetect && (kiSpatialNum == pSvcParam->iNumDependencyLayer)
- && !pEncCtx->pVaa->bIdrPeriodFlag) {
+ && !pEncCtx->pVaa->bIdrPeriodFlag && !pEncCtx->bEncCurFrmAsIdrFlag) {
SPicture* pRef = pEncCtx->pLtr[0].bReceivedT0LostFlag ?
pEncCtx->pSpatialPic[0][pEncCtx->uiSpatialLayersInTemporal[0] + pEncCtx->pVaa->uiValidLongTermPicIdx] :
m_pLastSpatialPicture[0][0];