shithub: openh264

Download patch

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];