[x265] [PATCH] Add vbv-end tolerance check

Aruna Matheswaran aruna at multicorewareinc.com
Mon Jun 11 07:24:01 CEST 2018


On Mon, Jun 11, 2018 at 3:34 AM, Alex Giladi <alex.giladi at gmail.com> wrote:

> Does this "5% tolerance" imply that CPB fullness as defined by vbv-end can
> be exceeded by 5%?
>

yes, the CPB fullness can vary by +/- 5 % from the value defined by
vbv-end.

>
> On Fri, Jun 8, 2018 at 6:39 AM, <aruna at multicorewareinc.com> wrote:
>
>> # HG changeset patch
>> # User Aruna Matheswaran <aruna at multicorewareinc.com>
>> # Date 1523005500 -19800
>> #      Fri Apr 06 14:35:00 2018 +0530
>> # Node ID ed853c4af6710a991d0cdf4bf68e00fe32edaacb
>> # Parent  182914e1d201395d152e310db7f5cf29ab3c787e
>> Add vbv-end tolerance check
>>
>> This will attempt to keep the desired fraction of the target buffer (
>> specified
>> by vbv-end ) empty within a defined error margin of 5%.
>>
>> diff -r 182914e1d201 -r ed853c4af671 source/encoder/ratecontrol.cpp
>> --- a/source/encoder/ratecontrol.cpp    Wed Mar 14 12:30:28 2018 +0530
>> +++ b/source/encoder/ratecontrol.cpp    Fri Apr 06 14:35:00 2018 +0530
>> @@ -1282,6 +1282,12 @@
>>          m_predictedBits = m_totalBits;
>>          updateVbvPlan(enc);
>>          rce->bufferFill = m_bufferFill;
>> +        rce->vbvEndAdj = false;
>> +        if (m_param->vbvBufferEnd && rce->encodeOrder >=
>> m_param->vbvEndFrameAdjust * m_param->totalFrames)
>> +        {
>> +            rce->vbvEndAdj = true;
>> +            rce->targetFill = 0;
>> +        }
>>
>>          int mincr = enc->m_vps.ptl.minCrForLevel;
>>          /* Profiles above Main10 don't require maxAU size check, so just
>> set the maximum to a large value. */
>> @@ -2173,12 +2179,12 @@
>>                      curBits = predictSize(&m_pred[predType],
>> frameQ[type], (double)satd);
>>                      bufferFillCur -= curBits;
>>                  }
>> -                if (m_param->vbvBufferEnd && rce->encodeOrder >=
>> m_param->vbvEndFrameAdjust * m_param->totalFrames)
>> +                if (rce->vbvEndAdj)
>>                  {
>>                      bool loopBreak = false;
>>                      double bufferDiff = m_param->vbvBufferEnd -
>> (m_bufferFill / m_bufferSize);
>> -                    targetFill = m_bufferFill + m_bufferSize *
>> (bufferDiff / (m_param->totalFrames - rce->encodeOrder));
>> -                    if (bufferFillCur < targetFill)
>> +                    rce->targetFill = m_bufferFill + m_bufferSize *
>> (bufferDiff / (m_param->totalFrames - rce->encodeOrder));
>> +                    if (bufferFillCur < rce->targetFill)
>>                      {
>>                          q *= 1.01;
>>                          loopTerminate |= 1;
>> @@ -2421,6 +2427,7 @@
>>          double rcTol = bufferLeftPlanned / m_param->frameNumThreads *
>> m_rateTolerance;
>>          int32_t encodedBitsSoFar = 0;
>>          double accFrameBits = predictRowsSizeSum(curFrame, rce, qpVbv,
>> encodedBitsSoFar);
>> +        double vbvEndBias = 0.95;
>>
>>          /* * Don't increase the row QPs until a sufficent amount of the
>> bits of
>>           * the frame have been processed, in case a flat area at the top
>> of the
>> @@ -2442,7 +2449,8 @@
>>          while (qpVbv < qpMax
>>                 && (((accFrameBits > rce->frameSizePlanned + rcTol) ||
>>                     (rce->bufferFill - accFrameBits < bufferLeftPlanned *
>> 0.5) ||
>> -                   (accFrameBits > rce->frameSizePlanned && qpVbv <
>> rce->qpNoVbv))
>> +                   (accFrameBits > rce->frameSizePlanned && qpVbv <
>> rce->qpNoVbv) ||
>> +                   (rce->vbvEndAdj && ((rce->bufferFill - accFrameBits)
>> < (rce->targetFill * vbvEndBias))))
>>                     && (!m_param->rc.bStrictCbr ? 1 : abrOvershoot >
>> 0.1)))
>>          {
>>              qpVbv += stepSize;
>> @@ -2453,7 +2461,8 @@
>>          while (qpVbv > qpMin
>>                 && (qpVbv > curEncData.m_rowStat[0].rowQp ||
>> m_singleFrameVbv)
>>                 && (((accFrameBits < rce->frameSizePlanned * 0.8f &&
>> qpVbv <= prevRowQp)
>> -                   || accFrameBits < (rce->bufferFill - m_bufferSize +
>> m_bufferRate) * 1.1)
>> +                   || accFrameBits < (rce->bufferFill - m_bufferSize +
>> m_bufferRate) * 1.1
>> +                   || (rce->vbvEndAdj && ((rce->bufferFill -
>> accFrameBits) > (rce->targetFill * vbvEndBias))))
>>                     && (!m_param->rc.bStrictCbr ? 1 : abrOvershoot < 0)))
>>          {
>>              qpVbv -= stepSize;
>> diff -r 182914e1d201 -r ed853c4af671 source/encoder/ratecontrol.h
>> --- a/source/encoder/ratecontrol.h      Wed Mar 14 12:30:28 2018 +0530
>> +++ b/source/encoder/ratecontrol.h      Fri Apr 06 14:35:00 2018 +0530
>> @@ -82,6 +82,8 @@
>>      double  rowCplxrSum;
>>      double  qpNoVbv;
>>      double  bufferFill;
>> +    double  targetFill;
>> +    bool    vbvEndAdj;
>>      double  frameDuration;
>>      double  clippedDuration;
>>      double  frameSizeEstimated; /* hold frameSize, updated from cu level
>> vbv rc */
>>
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>>
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180611/fd537829/attachment-0001.html>


More information about the x265-devel mailing list