[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