[x265] [PATCH 2 of 6] vbv: enable vbvLookahead for Keyframes; accumulate frame rowSatds from lowres rowSatds

aarthi at multicorewareinc.com aarthi at multicorewareinc.com
Fri Feb 21 07:08:37 CET 2014


# HG changeset patch
# User Aarthi Thirumalai
# Date 1392896018 -19800
#      Thu Feb 20 17:03:38 2014 +0530
# Node ID cbfb5bc44d6b8b74dc299a1c31bcfaa71dde2865
# Parent  d90c9b27f413a4b00079a31ca7b0411a5fb8eb19
vbv: enable vbvLookahead for Keyframes; accumulate frame rowSatds from lowres rowSatds.

diff -r d90c9b27f413 -r cbfb5bc44d6b source/encoder/slicetype.cpp
--- a/source/encoder/slicetype.cpp	Fri Feb 21 10:29:03 2014 +0530
+++ b/source/encoder/slicetype.cpp	Thu Feb 20 17:03:38 2014 +0530
@@ -171,22 +171,48 @@
         cost.estimateFrameCost(frames, p0, p1, b, false);
         cost.flush();
     }
+    if (cfg->param.rc.cuTree)
+    {
+        pic->m_lowres.satdCost = frameCostRecalculate(frames, p0, p1, b);
+        if (b && cfg->param.rc.vbvBufferSize)
+            frameCostRecalculate(frames,b, b, b);
+    }
 
-    if (cfg->param.rc.cuTree)
-        pic->m_lowres.satdCost = frameCostRecalculate(frames, p0, p1, b);
     else if (cfg->param.rc.aqMode)
         pic->m_lowres.satdCost = pic->m_lowres.costEstAq[b - p0][p1 - b];
     else
         pic->m_lowres.satdCost = pic->m_lowres.costEst[b - p0][p1 - b];
+
+    if (cfg->param.rc.vbvBufferSize > 0 && cfg->param.rc.vbvMaxBitrate > 0)
+    {
+        pic->m_lowres.lowresCostForRc = pic->m_lowres.lowresCosts[b - p0][p1 - b];
+        uint32_t lowresRow = 0 , lowresCol = 0, lowresCuIdx = 0, sum = 0;
+        uint32_t scale = cfg->param.maxCUSize / (2 * X265_LOWRES_CU_SIZE);
+        uint32_t widthInLowresCu = (uint32_t)widthInCU, heightInLowresCu = (uint32_t)heightInCU;
+
+        for (uint32_t row = 0; row < pic->getFrameHeightInCU(); row++)
+        {
+            lowresRow = row * scale;
+            for (uint32_t cnt = 0 ; cnt < scale && lowresRow < heightInLowresCu; lowresRow++, cnt++)
+            {
+                sum = 0;
+                lowresCuIdx = lowresRow * widthInLowresCu ;
+                for (lowresCol = 0; lowresCol < widthInLowresCu; lowresCol++, lowresCuIdx++)
+                {
+                    sum +=  pic->m_lowres.lowresCostForRc[lowresCuIdx];
+                }
+                pic->m_rowSatdForVbv[row] += sum;
+            }
+          }
+      }
     return pic->m_lowres.satdCost;
 }
-
 void Lookahead::slicetypeDecide()
 {
     Lowres *frames[X265_LOOKAHEAD_MAX];
     TComPic *list[X265_LOOKAHEAD_MAX];
     TComPic *ipic = inputQueue.first();
-
+    bool isKeyFrameAnalyse = (cfg->param.rc.cuTree || (cfg->param.rc.vbvBufferSize && cfg->param.lookaheadDepth));
     if (!est.rows && ipic)
         est.init(cfg, ipic);
 
@@ -371,8 +397,11 @@
             outputQueue.pushBack(*list[i]);
         }
     }
+    if (isKeyFrameAnalyse && IS_X265_TYPE_I(lastNonB->sliceType))
+    {
+        slicetypeAnalyse(frames,true);
+    }
 }
-
 void Lookahead::vbvLookahead(Lowres **frames, int numFrames, int keyframe)
 {
     int prevNonB = 0, curNonB = 1, idx = 0;


More information about the x265-devel mailing list