[x265] [PATCH] vbv: tune vbv predictors for better mapping of predicted bits to encoded bits
Steve Borho
steve at borho.org
Mon Nov 17 21:36:25 CET 2014
On 11/17, aarthi at multicorewareinc.com wrote:
> # 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;
this doesn't really belong here in the rate control code; it over-rides
user configuration of this parameter with no opportunity for them to
prevent it. Perhaps this needs to be part of a '--tune cbr'
> 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)
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
--
Steve Borho
More information about the x265-devel
mailing list