[x265] [PATCH] rc: improve loop in clipQscale
Ximing Cheng
chengximing1989 at foxmail.com
Fri Nov 6 09:04:52 CET 2015
# HG changeset patch
# User Ximing Cheng <ximingcheng at tencent.com>
# Date 1446797063 -28800
# Fri Nov 06 16:04:23 2015 +0800
# Node ID f11b17b4656a85a15dc82fd04485fbf920848e4d
# Parent 45ea73c63c12c66e5e5e777e80853c8b3cadf101
rc: improve loop in clipQscale
diff -r 45ea73c63c12 -r f11b17b4656a source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp Fri Nov 06 11:55:27 2015 +0530
+++ b/source/encoder/ratecontrol.cpp Fri Nov 06 16:04:23 2015 +0800
@@ -1756,6 +1756,7 @@
* is in a reasonable state by the end of the lookahead. */
int loopTerminate = 0;
/* Avoid an infinite loop. */
+ double pSliceFactor = m_sliceType == I_SLICE ? m_param->rc.ipFactor : (m_sliceType == B_SLICE ? 1 / m_param->rc.pbFactor : 1);
for (int iterations = 0; iterations < 1000 && loopTerminate != 3; iterations++)
{
double frameQ[3];
@@ -1764,7 +1765,7 @@
double bufferFillCur = m_bufferFill - curBits;
double targetFill;
double totalDuration = m_frameDuration;
- frameQ[P_SLICE] = m_sliceType == I_SLICE ? q * m_param->rc.ipFactor : (m_sliceType == B_SLICE ? q / m_param->rc.pbFactor : q);
+ frameQ[P_SLICE] = q * pSliceFactor;
frameQ[B_SLICE] = frameQ[P_SLICE] * m_param->rc.pbFactor;
frameQ[I_SLICE] = frameQ[P_SLICE] / m_param->rc.ipFactor;
/* Loop over the planned future frames. */
@@ -1798,12 +1799,15 @@
continue;
}
/* Try to get the buffer not more than 80% filled, but don't set an impossible goal. */
- targetFill = x265_clip3(m_bufferSize * (1 - 0.2 * finalDur), m_bufferSize, m_bufferFill - totalDuration * m_vbvMaxRate * 0.5);
- if (m_isCbr && bufferFillCur > targetFill && !m_isSceneTransition)
+ if (m_isCbr && !m_isSceneTransition)
{
- q /= 1.01;
- loopTerminate |= 2;
- continue;
+ targetFill = x265_clip3(m_bufferSize * (1 - 0.2 * finalDur), m_bufferSize, m_bufferFill - totalDuration * m_vbvMaxRate * 0.5);
+ if (bufferFillCur > targetFill)
+ {
+ q /= 1.01;
+ loopTerminate |= 2;
+ continue;
+ }
}
break;
}
@@ -1857,7 +1861,7 @@
if (m_rateFactorMaxIncrement)
{
double qpNoVbv = x265_qScale2qp(q0);
- double qmax = X265_MIN(MAX_MAX_QPSCALE,x265_qp2qScale(qpNoVbv + m_rateFactorMaxIncrement));
+ double qmax = X265_MIN(MAX_MAX_QPSCALE, x265_qp2qScale(qpNoVbv + m_rateFactorMaxIncrement));
return x265_clip3(MIN_QPSCALE, qmax, q);
}
}
More information about the x265-devel
mailing list