[x265] [PATCH] Re-evaluate vbv lookahead in the encode that uses

bhavna at multicorewareinc.com bhavna at multicorewareinc.com
Thu Aug 31 13:01:03 CEST 2017


# HG changeset patch
# User Bhavna Hariharan <bhavna at multicorewareinc.com>
# Date 1503468675 -19800
#      Wed Aug 23 11:41:15 2017 +0530
# Node ID f5d669bfb2b209f73406cede50878a06eef52fd4
# Parent  fcd9154fa4e28ae9e3c11e16bfae20dbdb89101d
Re-evaluate vbv lookahead in the encode that uses
--analysis-reuse-mode load.

Evaluate inter modes in encode that uses --analysis-reuse-mode load when
intra-in-inter blocks are chosen with --refine-inter 2 in the previous pass.

diff -r fcd9154fa4e2 -r f5d669bfb2b2 source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp	Mon Aug 21 11:50:36 2017 +0530
+++ b/source/encoder/analysis.cpp	Wed Aug 23 11:41:15 2017 +0530
@@ -1150,13 +1150,11 @@
     bool chooseMerge = false;
     bool bCtuInfoCheck = false;
     int sameContentRef = 0;
-    bool checkRefineInter = false;
 
     if (m_evaluateInter)
     {
         if (m_param->interRefine == 2)
         {
-            checkRefineInter = true;
             if (parentCTU.m_predMode[cuGeom.absPartIdx] == MODE_SKIP)
                 skipModes = true;
             if (parentCTU.m_partSize[cuGeom.absPartIdx] == SIZE_2Nx2N)
@@ -1279,7 +1277,7 @@
         md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom, qp);
         checkMerge2Nx2N_rd0_4(md.pred[PRED_SKIP], md.pred[PRED_MERGE], cuGeom);
         if (m_param->rdLevel)
-            skipModes = (m_param->bEnableEarlySkip || checkRefineInter)
+            skipModes = (m_param->bEnableEarlySkip || m_param->interRefine == 2)
                         && md.bestMode && md.bestMode->cu.isSkipped(0); // TODO: sa8d threshold per depth
     }
 
@@ -1539,7 +1537,7 @@
                     }
                 }
             }
-            bool bTryIntra = (m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && cuGeom.log2CUSize != MAX_LOG2_CU_SIZE && !((m_param->bCTUInfo & 4) && bCtuInfoCheck) && !checkRefineInter;
+            bool bTryIntra = (m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && cuGeom.log2CUSize != MAX_LOG2_CU_SIZE && !((m_param->bCTUInfo & 4) && bCtuInfoCheck);
             if (m_param->rdLevel >= 3)
             {
                 /* Calculate RD cost of best inter option */
@@ -1784,13 +1782,11 @@
     bool skipRectAmp = false;
     bool bCtuInfoCheck = false;
     int sameContentRef = 0;
-    bool checkRefineInter = false;
 
     if (m_evaluateInter)
     {
         if (m_param->interRefine == 2)
         {
-            checkRefineInter = true;
             if (parentCTU.m_predMode[cuGeom.absPartIdx] == MODE_SKIP)
                 skipModes = true;
             if (parentCTU.m_partSize[cuGeom.absPartIdx] == SIZE_2Nx2N)
@@ -1919,7 +1915,7 @@
         md.pred[PRED_SKIP].cu.initSubCU(parentCTU, cuGeom, qp);
         md.pred[PRED_MERGE].cu.initSubCU(parentCTU, cuGeom, qp);
         checkMerge2Nx2N_rd5_6(md.pred[PRED_SKIP], md.pred[PRED_MERGE], cuGeom);
-        skipModes = (m_param->bEnableEarlySkip || checkRefineInter) &&
+        skipModes = (m_param->bEnableEarlySkip || m_param->interRefine == 2) &&
                     md.bestMode && !md.bestMode->cu.getQtRootCbf(0);
         refMasks[0] = allSplitRefs;
         md.pred[PRED_2Nx2N].cu.initSubCU(parentCTU, cuGeom, qp);
@@ -2172,7 +2168,7 @@
                 }
             }
 
-            if ((m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && (cuGeom.log2CUSize != MAX_LOG2_CU_SIZE) && !((m_param->bCTUInfo & 4) && bCtuInfoCheck) && !checkRefineInter)
+            if ((m_slice->m_sliceType != B_SLICE || m_param->bIntraInBFrames) && (cuGeom.log2CUSize != MAX_LOG2_CU_SIZE) && !((m_param->bCTUInfo & 4) && bCtuInfoCheck))
             {
                 if (!m_param->limitReferences || splitIntra)
                 {
@@ -2288,7 +2284,7 @@
         md.bestMode = &mode;
         mode.cu.initSubCU(parentCTU, cuGeom, qp);
         PartSize size = (PartSize)parentCTU.m_partSize[cuGeom.absPartIdx];
-        if (parentCTU.isIntra(cuGeom.absPartIdx))
+        if (parentCTU.isIntra(cuGeom.absPartIdx) && m_param->interRefine < 2)
         {
             bool reuseModes = !((m_param->intraRefine == 3) ||
                                 (m_param->intraRefine == 2 && parentCTU.m_lumaIntraDir[cuGeom.absPartIdx] > DC_IDX));
@@ -2299,7 +2295,7 @@
             }
             checkIntra(mode, cuGeom, size);
         }
-        else if (m_param->interRefine < 2)
+        else if (!parentCTU.isIntra(cuGeom.absPartIdx) && m_param->interRefine < 2)
         {
             mode.cu.copyFromPic(parentCTU, cuGeom, m_csp, false);
             uint32_t numPU = parentCTU.getNumPartInter(cuGeom.absPartIdx);
@@ -2367,7 +2363,7 @@
                 checkDQP(mode, cuGeom);
         }
 
-        if (m_param->interRefine < 2 || parentCTU.isIntra(cuGeom.absPartIdx))
+        if (m_param->interRefine < 2)
         {
             if (m_bTryLossless)
                 tryLossless(cuGeom);
@@ -2379,10 +2375,11 @@
                 checkDQPForSplitPred(*md.bestMode, cuGeom);
         }
 
-        if (!parentCTU.isIntra(cuGeom.absPartIdx) && ( m_param->interRefine > 1 || (m_param->interRefine && parentCTU.m_predMode[cuGeom.absPartIdx] == MODE_SKIP  && !mode.cu.isSkipped(0))))
+        if (m_param->interRefine > 1 || (m_param->interRefine && parentCTU.m_predMode[cuGeom.absPartIdx] == MODE_SKIP  && !mode.cu.isSkipped(0)))
         {
             m_evaluateInter = 1;
             m_param->rdLevel > 4 ? compressInterCU_rd5_6(parentCTU, cuGeom, qp) : compressInterCU_rd0_4(parentCTU, cuGeom, qp);
+            m_evaluateInter = 0;
         }
     }
     if (!bDecidedDepth || split)
diff -r fcd9154fa4e2 -r f5d669bfb2b2 source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp	Mon Aug 21 11:50:36 2017 +0530
+++ b/source/encoder/slicetype.cpp	Wed Aug 23 11:41:15 2017 +0530
@@ -1036,6 +1036,18 @@
          (m_param->lookaheadDepth && m_param->rc.vbvBufferSize)))
     {
         slicetypeAnalyse(frames, false);
+        bool bIsVbv = m_param->rc.vbvBufferSize > 0 && m_param->rc.vbvMaxBitrate > 0;
+        if (m_param->analysisReuseMode == X265_ANALYSIS_LOAD && m_param->scaleFactor && bIsVbv)
+        {
+            int numFrames;
+            for (numFrames = 0; numFrames < maxSearch; numFrames++)
+            {
+                Lowres *fenc = frames[numFrames + 1];
+                if (!fenc)
+                    break;
+            }
+            vbvLookahead(frames, numFrames, true);
+        }
     }
 
     int bframes, brefs;
@@ -1219,6 +1231,18 @@
 
         frames[j + 1] = NULL;
         slicetypeAnalyse(frames, true);
+        bool bIsVbv = m_param->rc.vbvBufferSize > 0 && m_param->rc.vbvMaxBitrate > 0;
+        if (m_param->analysisReuseMode == X265_ANALYSIS_LOAD && m_param->scaleFactor && bIsVbv)
+        {
+            int numFrames;
+            for (numFrames = 0; numFrames < maxSearch; numFrames++)
+            {
+                Lowres *fenc = frames[numFrames + 1];
+                if (!fenc)
+                    break;
+            }
+            vbvLookahead(frames, numFrames, true);
+        }
     }
     m_outputLock.release();
 }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265-clone.patch
Type: text/x-patch
Size: 7049 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20170831/4f63a649/attachment.bin>


More information about the x265-devel mailing list