[x265] [PATCH] vbv: tune vbv predictors for better mapping of predicted bits to encoded bits
aarthi at multicorewareinc.com
aarthi at multicorewareinc.com
Mon Nov 17 04:15:16 CET 2014
# HG changeset patch
# User Aarthi Thirumalai
# Date 1416168026 -19800
# Mon Nov 17 01:30:26 2014 +0530
# Node ID f242fb2114d35441bbfcec4e4b4205567a42ebac
# Parent 98fb658f3229ab10e808204c265a12e18d71638e
vbv: tune vbv predictors for better mapping of predicted bits to encoded bits
diff -r 98fb658f3229 -r f242fb2114d3 source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp Tue Nov 11 19:30:19 2014 +0900
+++ b/source/encoder/ratecontrol.cpp Mon Nov 17 01:30:26 2014 +0530
@@ -404,7 +404,9 @@
m_param->bEmitHRDSEI = 0;
}
- m_isCbr = m_param->rc.rateControlMode == X265_RC_ABR && m_isVbv && !m_2pass && m_param->rc.vbvMaxBitrate <= m_param->rc.bitrate;
+ m_isCbr = m_param->rc.rateControlMode == X265_RC_ABR && m_isVbv && !m_2pass && m_param->rc.vbvMaxBitrate <= m_param->rc.bitrate;
+ if (m_isCbr)
+ m_param->rc.pbFactor = 1.0;
m_leadingBframes = m_param->bframes;
m_bframeBits = 0;
m_leadingNoBSatd = 0;
@@ -494,12 +496,12 @@
/* Frame Predictors and Row predictors used in vbv */
for (int i = 0; i < 5; i++)
{
- m_pred[i].coeff = 2.0;
+ m_pred[i].coeff = 1.5;
m_pred[i].count = 1.0;
m_pred[i].decay = 0.5;
m_pred[i].offset = 0.0;
}
- m_predBfromP = m_pred[0];
+ m_pred[0].coeff = 1.0;
if (!m_statFileOut && (m_param->rc.bStatWrite || m_param->rc.bStatRead))
{
/* If the user hasn't defined the stat filename, use the default value */
@@ -1420,12 +1422,9 @@
if (!m_2pass && m_isVbv)
{
- if (m_leadingBframes > 5)
- {
- qScale = clipQscale(curFrame, rce, qScale);
- m_lastQScaleFor[m_sliceType] = qScale;
- }
- rce->frameSizePlanned = predictSize(&m_predBfromP, qScale, (double)m_leadingNoBSatd);
+ qScale = clipQscale(curFrame, rce, qScale);
+ m_lastQScaleFor[m_sliceType] = qScale;
+ rce->frameSizePlanned = predictSize(&m_pred[m_sliceType], qScale, (double)m_currentSatd);
}
else if (m_2pass && m_isVbv)
{
@@ -1725,10 +1724,7 @@
{
double frameQ[3];
double curBits;
- if (m_sliceType == B_SLICE)
- curBits = predictSize(&m_predBfromP, q, (double)m_currentSatd);
- else
- curBits = predictSize(&m_pred[m_sliceType], q, (double)m_currentSatd);
+ curBits = predictSize(&m_pred[m_sliceType], q, (double)m_currentSatd);
double bufferFillCur = m_bufferFill - curBits;
double targetFill;
double totalDuration = 0;
@@ -1810,25 +1806,6 @@
if (pbits > rce->frameSizeMaximum)
q *= pbits / rce->frameSizeMaximum;
- // Check B-frame complexity, and use up any bits that would
- // overflow before the next P-frame.
- if (m_leadingBframes <= 5 && m_sliceType == P_SLICE && !m_singleFrameVbv)
- {
- int nb = m_leadingBframes;
- double bits = predictSize(&m_pred[m_sliceType], q, (double)m_currentSatd);
- double bbits = predictSize(&m_predBfromP, q * m_param->rc.pbFactor, (double)m_currentSatd);
- double space;
- if (bbits > m_bufferRate)
- nb = 0;
- double pbbits = nb * bbits;
-
- space = m_bufferFill + (1 + nb) * m_bufferRate - m_bufferSize;
- if (pbbits < space)
- q *= X265_MAX(pbbits / space, bits / (0.5 * m_bufferSize));
-
- q = X265_MAX(q0 / 2, q);
- }
-
if (!m_isCbr || (m_isAbr && m_currentSatd >= rce->movingAvgSum && q <= q0 / 2))
q = X265_MAX(q0, q);
@@ -2085,7 +2062,7 @@
{
if (var < 10)
return;
- const double range = 1.5;
+ const double range = 2;
double old_coeff = p->coeff / p->count;
double new_coeff = bits * q / var;
double new_coeff_clipped = Clip3(old_coeff / range, old_coeff * range, new_coeff);
@@ -2257,16 +2234,6 @@
if (m_isVbv)
{
- if (rce->sliceType == B_SLICE)
- {
- m_bframeBits += actualBits;
- if (rce->bLastMiniGopBFrame)
- {
- if (rce->bframes != 0)
- updatePredictor(&m_predBfromP, x265_qp2qScale(rce->qpaRc), (double)rce->leadingNoBSatd, (double)m_bframeBits / rce->bframes);
- m_bframeBits = 0;
- }
- }
updateVbv(actualBits, rce);
if (m_param->bEmitHRDSEI)
More information about the x265-devel
mailing list