[x265] [PATCH 2 of 2] tuned up ABR logic to better adapt for frame parallelism

aarthi at multicorewareinc.com aarthi at multicorewareinc.com
Thu Sep 19 20:43:33 CEST 2013


# HG changeset patch
# User Aarthi Thirumalai
# Date 1379615875 -19800
#      Fri Sep 20 00:07:55 2013 +0530
# Node ID 6832513a6e480a7b167e15f51215ea86af87c5d4
# Parent  e26b439a4031dd93f8aab60f0bdddc7f4a38ae2a
tuned up ABR logic to better adapt for frame parallelism

 Rate control needs to be more aggressive based on actual ecoded bits cost rather than estimated costs from
 concurrent threads .Tuned up some parameters to effect this idea.

diff -r e26b439a4031 -r 6832513a6e48 source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp	Thu Sep 19 23:45:42 2013 +0530
+++ b/source/encoder/ratecontrol.cpp	Fri Sep 20 00:07:55 2013 +0530
@@ -222,7 +222,7 @@
             double iFrameDone = framesDone - frameThreads + 1;
             double timeDone = iFrameDone / framerate;
             wantedBits = timeDone * bitrate;
-            if (wantedBits > 0)
+            if (wantedBits > 0 && totalBits > 0)
             {
                 abrBuffer *= X265_MAX(1, sqrt(timeDone));
                 overflow = Clip3(.5, 2.0, 1.0 + (totalBits - wantedBits) / abrBuffer);
@@ -240,24 +240,31 @@
         {
             double lqmin = 0, lqmax = 0;
 
-            /* Clip the qp of 1st frame to ensure it doesnt detoriate the quality */
-            if (curFrame->getPOC() == 0)
+            /* Clip the qp of 1st 'N' frames running parallely to ensure it doesnt detoriate the quality  */
+            if (totalBits ==0)
             {
                 lqmin = qp2qScale(ABR_INIT_QP_MIN) / lstep;
                 lqmax = qp2qScale(ABR_INIT_QP_MAX) * lstep;
             }
+
             /* Asymmetric clipping, because symmetric would prevent
              * overflow control in areas of rapidly oscillating complexity */
-            else if (curFrame->getPOC() > 0)
+            else
             {
                 lqmin = lastQScaleFor[pictType] / lstep;
                 lqmax = lastQScaleFor[pictType] * lstep;
             }
-            if (overflow > 1.1 && curFrame->getPOC() > 3)
-                lqmax *= lstep;
+            /* Rate control needs to be more aggressive based on actual costs obtained for  previous encoded frame */
+            if (overflow > 1.1 && framesDone > 3)
+            {
+                lqmax *=  lstep ;
+                lqmin*= pow(lstep,1/frameThreads);
+            }
             else if (overflow < 0.9)
-                lqmin /= lstep;
-
+            {
+                lqmin /= lstep ;
+                lqmax /= pow(lstep,1/frameThreads);
+            }
             q = Clip3(lqmin, lqmax, q);
         }
 


More information about the x265-devel mailing list