shithub: openh264

Download patch

ref: c96c8b05a8c2b85dedb015f2ca62f7745711f7dd
parent: 685b6144a5874619ff3659cc196d35525e84f4bc
parent: 27e803f6f47ba05a9ce873e282e0b2fffe4bba05
author: ruil2 <ruil2@cisco.com>
date: Mon May 23 09:21:40 EDT 2016

Merge pull request #2468 from sijchen/refactor_pre

[Encoder] Refactor: create diff func for diff case to make logic clean

--- a/codec/encoder/core/inc/wels_preprocess.h
+++ b/codec/encoder/core/inc/wels_preprocess.h
@@ -191,6 +191,10 @@
   */
   void WelsExchangeSpatialPictures (SPicture** ppPic1, SPicture** ppPic2);
 
+  SPicture* GetBestRefPic (EUsageType iUsageType, bool bSceneLtr, EWelsSliceType eSliceType, int32_t kiDidx,
+                           int32_t iRefTemporalIdx);
+  SPicture* GetBestRefPic (const int32_t kiDidx, const int32_t iRefTemporalIdx);
+
  private:
   Scaled_Picture   m_sScaledPicture;
   SPicture*        m_pLastSpatialPicture[MAX_DEPENDENCY_LAYER][2];
--- a/codec/encoder/core/src/wels_preprocess.cpp
+++ b/codec/encoder/core/src/wels_preprocess.cpp
@@ -214,6 +214,20 @@
   return iSpatialNum;
 }
 
+SPicture* CWelsPreProcess::GetBestRefPic (EUsageType iUsageType, bool bSceneLtr, EWelsSliceType eSliceType,
+    int32_t kiDidx, int32_t iRefTemporalIdx) {
+  assert (iUsageType == SCREEN_CONTENT_REAL_TIME);
+  SVAAFrameInfoExt* pVaaExt = static_cast<SVAAFrameInfoExt*> (m_pEncCtx->pVaa);
+  SRefInfoParam* BestRefCandidateParam = (bSceneLtr) ? (& (pVaaExt->sVaaLtrBestRefCandidate[0])) :
+                                         (& (pVaaExt->sVaaStrBestRefCandidate[0]));
+  return m_pSpatialPic[0][BestRefCandidateParam->iSrcListIdx];
+
+}
+SPicture* CWelsPreProcess::GetBestRefPic (const int32_t kiDidx, const int32_t iRefTemporalIdx) {
+
+  return m_pSpatialPic[kiDidx][iRefTemporalIdx];
+}
+
 int32_t CWelsPreProcess::AnalyzeSpatialPic (sWelsEncCtx* pCtx, const int32_t kiDidx) {
   SWelsSvcCodingParam* pSvcParam = pCtx->pSvcParam;
   bool bNeededMbAq = (pSvcParam->bEnableAdaptiveQuant && (pCtx->eSliceType == P_SLICE));
@@ -230,10 +244,8 @@
   bool bCalculateVar = (pSvcParam->iRCMode >= RC_BITRATE_MODE && pCtx->eSliceType == I_SLICE);
 
   if (pSvcParam->iUsageType == SCREEN_CONTENT_REAL_TIME) {
-    SVAAFrameInfoExt* pVaaExt = static_cast<SVAAFrameInfoExt*> (m_pEncCtx->pVaa);
-    SRefInfoParam* BestRefCandidateParam = (pCtx->bCurFrameMarkedAsSceneLtr) ? (& (pVaaExt->sVaaLtrBestRefCandidate[0])) :
-                                           (& (pVaaExt->sVaaStrBestRefCandidate[0]));
-    SPicture* pRefPic = m_pSpatialPic[0][BestRefCandidateParam->iSrcListIdx];
+    SPicture* pRefPic = GetBestRefPic (pSvcParam->iUsageType, pCtx->bCurFrameMarkedAsSceneLtr, pCtx->eSliceType, kiDidx,
+                                       iRefTemporalIdx);
 
     VaaCalculation (pCtx->pVaa, pCurPic, pRefPic, false, bCalculateVar, bCalculateBGD);
 
@@ -244,10 +256,9 @@
       AdaptiveQuantCalculation (pCtx->pVaa, pCurPic, pRefPic);
     }
   } else {
-    SPicture* pRefPic = m_pSpatialPic[kiDidx][iRefTemporalIdx];
+    SPicture* pRefPic = GetBestRefPic (kiDidx, iRefTemporalIdx);
     SPicture* pLastPic = m_pLastSpatialPicture[kiDidx][0];
     bool bCalculateSQDiff = ((pLastPic->pData[0] == pRefPic->pData[0]) && bNeededMbAq);
-    bool bCalculateVar = (pSvcParam->iRCMode >= RC_BITRATE_MODE && pCtx->eSliceType == I_SLICE);
 
     VaaCalculation (pCtx->pVaa, pCurPic, pRefPic, bCalculateSQDiff, bCalculateVar, bCalculateBGD);
 
@@ -256,9 +267,7 @@
     }
 
     if (bNeededMbAq) {
-      SPicture* pCurPic = m_pLastSpatialPicture[kiDidx][1];
-      SPicture* pRefPic = m_pLastSpatialPicture[kiDidx][0];
-      AdaptiveQuantCalculation (pCtx->pVaa, pCurPic, pRefPic);
+      AdaptiveQuantCalculation (pCtx->pVaa, m_pLastSpatialPicture[kiDidx][1], m_pLastSpatialPicture[kiDidx][0]);
     }
   }
   return 0;