shithub: openh264

Download patch

ref: 8103988cde08ab26b74985862f419d79d96ae317
parent: 38313b913d62e7f71967f51462dc0dc37f858a41
parent: 228cdeba1b7e9363e979410cb092bbe62339e0ee
author: sijchen <sijchen@cisco.com>
date: Mon Mar 21 07:32:24 EDT 2016

Merge pull request #2418 from ruil2/refine_init

fix preprocessing initialization logic

--- a/codec/encoder/core/inc/wels_preprocess.h
+++ b/codec/encoder/core/inc/wels_preprocess.h
@@ -121,7 +121,7 @@
   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);
--- a/codec/encoder/core/src/encoder_ext.cpp
+++ b/codec/encoder/core/src/encoder_ext.cpp
@@ -4627,9 +4627,6 @@
     /* 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!
--- a/codec/encoder/core/src/wels_preprocess.cpp
+++ b/codec/encoder/core/src/wels_preprocess.cpp
@@ -109,9 +109,18 @@
   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 @@
 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);
+    if (WelsPreprocessReset (pCtx,iWidth,iHeight) != 0)
       return -1;
-    }
-    if (WelsPreprocessReset (pCtx) != 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 @@
   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];