[x265] [PATCH] Add vbv-end to denote VBV emptiness after inserting all the frames into it

Pradeep Ramachandran pradeep at multicorewareinc.com
Tue Nov 7 06:16:18 CET 2017


On Mon, Nov 6, 2017 at 11:42 AM, <aruna at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Aruna Matheswaran <aruna at multicorewareinc.com>
> # Date 1509948124 -19800
> #      Mon Nov 06 11:32:04 2017 +0530
> # Node ID 8a121d8cc134cc348466e5d63a6a02d1531d8055
> # Parent  aa9649a2aa8c30bcb84ee8287839fa877978d4a7
> Add vbv-end to denote VBV emptiness after inserting all the frames into it.
>

Pushed to default branch. Thanks.


>
> diff -r aa9649a2aa8c -r 8a121d8cc134 doc/reST/cli.rst
> --- a/doc/reST/cli.rst  Mon Nov 06 09:43:36 2017 +0530
> +++ b/doc/reST/cli.rst  Mon Nov 06 11:32:04 2017 +0530
> @@ -1496,6 +1496,24 @@
>         Default 0.9
>
>         **Range of values:** fractional: 0 - 1.0, or kbits: 2 .. bufsize
> +
> +.. option:: --vbv-end <float>
> +
> +    Final buffer emptiness. The portion of the decode buffer that must be
> +       available after all the specified frames have been inserted into
> the
> +       decode buffer. Specified as a fractional value between 0 and 1, or
> in
> +       kbits. Default 0 (disabled)
> +
> +       This enables basic support for chunk-parallel encoding where each
> segment
> +       can specify the starting and ending state of the VBV buffer so
> that VBV
> +       compliance can be maintained when chunks are independently encoded
> and
> +       stitched together.
> +
> +.. option:: --vbv-end-fr-adj <float>
> +
> +    Frame from which qp has to be adjusted to achieve final decode buffer
> +       emptiness. Specified as a fraction of the total frames. Fractions
> > 0 are
> +       supported only when the total number of frames is known. Default 0.
>
>  .. option:: --qp, -q <integer>
>
> diff -r aa9649a2aa8c -r 8a121d8cc134 source/CMakeLists.txt
> --- a/source/CMakeLists.txt     Mon Nov 06 09:43:36 2017 +0530
> +++ b/source/CMakeLists.txt     Mon Nov 06 11:32:04 2017 +0530
> @@ -29,7 +29,7 @@
>  option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)
>  mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)
>  # X265_BUILD must be incremented each time the public API is changed
> -set(X265_BUILD 139)
> +set(X265_BUILD 140)
>  configure_file("${PROJECT_SOURCE_DIR}/x265.def.in"
>                 "${PROJECT_BINARY_DIR}/x265.def")
>  configure_file("${PROJECT_SOURCE_DIR}/x265_config.h.in"
> diff -r aa9649a2aa8c -r 8a121d8cc134 source/common/param.cpp
> --- a/source/common/param.cpp   Mon Nov 06 09:43:36 2017 +0530
> +++ b/source/common/param.cpp   Mon Nov 06 11:32:04 2017 +0530
> @@ -212,6 +212,8 @@
>      param->rc.vbvMaxBitrate = 0;
>      param->rc.vbvBufferSize = 0;
>      param->rc.vbvBufferInit = 0.9;
> +    param->vbvBufferEnd = 0;
> +    param->vbvEndFrameAdjust = 0;
>      param->rc.rfConstant = 28;
>      param->rc.bitrate = 0;
>      param->rc.qCompress = 0.6;
> @@ -982,6 +984,8 @@
>          OPT("force-flush")p->forceFlush = atoi(value);
>          OPT("splitrd-skip") p->bEnableSplitRdSkip = atobool(value);
>                 OPT("lowpass-dct") p->bLowPassDct = atobool(value);
> +        OPT("vbv-end") p->vbvBufferEnd = atof(value);
> +        OPT("vbv-end-fr-adj") p->vbvEndFrameAdjust = atof(value);
>          else
>              return X265_PARAM_BAD_NAME;
>      }
> @@ -1300,6 +1304,12 @@
>            "Maximum local bit rate can not be less than zero");
>      CHECK(param->rc.vbvBufferInit < 0,
>            "Valid initial VBV buffer occupancy must be a fraction 0 - 1,
> or size in kbits");
> +    CHECK(param->vbvBufferEnd < 0,
> +        "Valid final VBV buffer emptiness must be a fraction 0 - 1, or
> size in kbits");
> +    CHECK(param->vbvEndFrameAdjust < 0,
> +        "Valid vbv-end-fr-adj must be a fraction 0 - 1");
> +    CHECK(!param->totalFrames && param->vbvEndFrameAdjust,
> +        "vbv-end-fr-adj cannot be enabled when total number of frames is
> unknown");
>      CHECK(param->rc.bitrate < 0,
>            "Target bitrate can not be less than zero");
>      CHECK(param->rc.qCompress < 0.5 || param->rc.qCompress > 1.0,
> @@ -1423,9 +1433,15 @@
>      }
>
>      if (param->rc.vbvBufferSize)
> -        x265_log(param, X265_LOG_INFO, "VBV/HRD buffer / max-rate / init
>   : %d / %d / %.3f\n",
> -                 param->rc.vbvBufferSize, param->rc.vbvMaxBitrate,
> param->rc.vbvBufferInit);
> -
> +    {
> +        if (param->vbvBufferEnd)
> +            x265_log(param, X265_LOG_INFO, "VBV/HRD buffer / max-rate /
> init / end / fr-adj: %d / %d / %.3f / %.3f / %.3f\n",
> +            param->rc.vbvBufferSize, param->rc.vbvMaxBitrate,
> param->rc.vbvBufferInit, param->vbvBufferEnd, param->vbvEndFrameAdjust);
> +        else
> +            x265_log(param, X265_LOG_INFO, "VBV/HRD buffer / max-rate /
> init    : %d / %d / %.3f\n",
> +            param->rc.vbvBufferSize, param->rc.vbvMaxBitrate,
> param->rc.vbvBufferInit);
> +    }
> +
>      char buf[80] = { 0 };
>      char tmp[40];
>  #define TOOLOPT(FLAG, STR) if (FLAG) appendtool(param, buf, sizeof(buf),
> STR);
> @@ -1602,8 +1618,10 @@
>          {
>              s += sprintf(s, " vbv-maxrate=%d vbv-bufsize=%d
> vbv-init=%.1f",
>                   p->rc.vbvMaxBitrate, p->rc.vbvBufferSize,
> p->rc.vbvBufferInit);
> +            if (p->vbvBufferEnd)
> +                s += sprintf(s, " vbv-end=%.1f vbv-end-fr-adj=%.1f",
> p->vbvBufferEnd, p->vbvEndFrameAdjust);
>              if (p->rc.rateControlMode == X265_RC_CRF)
> -                s += sprintf(s, " crf-max=%.1f crf-min=%.1f",
> p->rc.rfConstantMax, p->rc.rfConstantMin);
> +                s += sprintf(s, " crf-max=%.1f crf-min=%.1f",
> p->rc.rfConstantMax, p->rc.rfConstantMin);
>          }
>      }
>      else if (p->rc.rateControlMode == X265_RC_CQP)
> diff -r aa9649a2aa8c -r 8a121d8cc134 source/encoder/ratecontrol.cpp
> --- a/source/encoder/ratecontrol.cpp    Mon Nov 06 09:43:36 2017 +0530
> +++ b/source/encoder/ratecontrol.cpp    Mon Nov 06 11:32:04 2017 +0530
> @@ -218,6 +218,7 @@
>      m_param->rc.vbvBufferSize = x265_clip3(0, 2000000,
> m_param->rc.vbvBufferSize);
>      m_param->rc.vbvMaxBitrate = x265_clip3(0, 2000000,
> m_param->rc.vbvMaxBitrate);
>      m_param->rc.vbvBufferInit = x265_clip3(0.0, 2000000.0,
> m_param->rc.vbvBufferInit);
> +    m_param->vbvBufferEnd = x265_clip3(0.0, 2000000.0,
> m_param->vbvBufferEnd);
>      m_singleFrameVbv = 0;
>      m_rateTolerance = 1.0;
>
> @@ -255,6 +256,11 @@
>          m_param->rc.vbvMaxBitrate = 0;
>      }
>      m_isVbv = m_param->rc.vbvMaxBitrate > 0 && m_param->rc.vbvBufferSize
> > 0;
> +    if (m_param->vbvBufferEnd && !m_isVbv)
> +    {
> +        x265_log(m_param, X265_LOG_WARNING, "vbv-end requires VBV
> parameters, ignored\n");
> +        m_param->vbvBufferEnd = 0;
> +    }
>      if (m_param->bEmitHRDSEI && !m_isVbv)
>      {
>          x265_log(m_param, X265_LOG_WARNING, "NAL HRD parameters require
> VBV parameters, ignored\n");
> @@ -339,6 +345,10 @@
>
>          if (m_param->rc.vbvBufferInit > 1.)
>              m_param->rc.vbvBufferInit = x265_clip3(0.0, 1.0,
> m_param->rc.vbvBufferInit / m_param->rc.vbvBufferSize);
> +        if (m_param->vbvBufferEnd > 1.)
> +            m_param->vbvBufferEnd = x265_clip3(0.0, 1.0,
> m_param->vbvBufferEnd / m_param->rc.vbvBufferSize);
> +        if (m_param->vbvEndFrameAdjust > 1.)
> +            m_param->vbvEndFrameAdjust = x265_clip3(0.0, 1.0,
> m_param->vbvEndFrameAdjust);
>          m_param->rc.vbvBufferInit = x265_clip3(0.0, 1.0,
> X265_MAX(m_param->rc.vbvBufferInit, m_bufferRate / m_bufferSize));
>          m_bufferFillFinal = m_bufferSize * m_param->rc.vbvBufferInit;
>          m_bufferFillActual = m_bufferFillFinal;
> @@ -2160,29 +2170,51 @@
>                      curBits = predictSize(&m_pred[predType],
> frameQ[type], (double)satd);
>                      bufferFillCur -= curBits;
>                  }
> -
> -                /* Try to get the buffer at least 50% filled, but don't
> set an impossible goal. */
> -                double finalDur = 1;
> -                if (m_param->rc.bStrictCbr)
> +                if (m_param->vbvBufferEnd && rce->encodeOrder >=
> m_param->vbvEndFrameAdjust * m_param->totalFrames)
>                  {
> -                    finalDur = x265_clip3(0.4, 1.0, totalDuration);
> +                    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)
> +                    {
> +                        q *= 1.01;
> +                        loopTerminate |= 1;
> +                        loopBreak = true;
> +                    }
> +                    if (bufferFillCur > m_param->vbvBufferEnd *
> m_bufferSize)
> +                    {
> +                        q /= 1.01;
> +                        loopTerminate |= 2;
> +                        loopBreak = true;
> +                    }
> +                    if (!loopBreak)
> +                        break;
>                  }
> -                targetFill = X265_MIN(m_bufferFill + totalDuration *
> m_vbvMaxRate * 0.5 , m_bufferSize * (1 - 0.5 * finalDur));
> -                if (bufferFillCur < targetFill)
> +                else
>                  {
> -                    q *= 1.01;
> -                    loopTerminate |= 1;
> -                    continue;
> +                    /* Try to get the buffer at least 50% filled, but
> don't set an impossible goal. */
> +                    double finalDur = 1;
> +                    if (m_param->rc.bStrictCbr)
> +                    {
> +                        finalDur = x265_clip3(0.4, 1.0, totalDuration);
> +                    }
> +                    targetFill = X265_MIN(m_bufferFill + totalDuration *
> m_vbvMaxRate * 0.5, m_bufferSize * (1 - 0.5 * finalDur));
> +                    if (bufferFillCur < targetFill)
> +                    {
> +                        q *= 1.01;
> +                        loopTerminate |= 1;
> +                        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)
> +                    {
> +                        q /= 1.01;
> +                        loopTerminate |= 2;
> +                        continue;
> +                    }
> +                    break;
>                  }
> -                /* 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)
> -                {
> -                    q /= 1.01;
> -                    loopTerminate |= 2;
> -                    continue;
> -                }
> -                break;
>              }
>              q = X265_MAX(q0 / 2, q);
>          }
> diff -r aa9649a2aa8c -r 8a121d8cc134 source/test/rate-control-tests.txt
> --- a/source/test/rate-control-tests.txt        Mon Nov 06 09:43:36 2017
> +0530
> +++ b/source/test/rate-control-tests.txt        Mon Nov 06 11:32:04 2017
> +0530
> @@ -25,7 +25,7 @@
>  big_buck_bunny_360p24.y4m,--preset medium --bitrate 400 --vbv-bufsize
> 600 --vbv-maxrate 600 --no-wpp --aud --hrd --tune fast-decode
>  sita_1920x1080_30.yuv,--preset superfast --bitrate 3000 --vbv-bufsize
> 3000 --vbv-maxrate 3000 --aud --strict-cbr --no-wpp
>  sintel_trailer_2k_480p24.y4m, --preset slow --crf 24 --vbv-bufsize 150
> --vbv-maxrate 150 --dynamic-rd 1.53
> -
> +BasketballDrive_1920x1080_50.y4m,--preset medium --bitrate 10000
> --vbv-bufsize 15000 --vbv-maxrate 11500 --vbv-end 0.9 --vbv-end-fr-adj 0.7
>
>
>  # multi-pass rate control tests
> diff -r aa9649a2aa8c -r 8a121d8cc134 source/x265.h
> --- a/source/x265.h     Mon Nov 06 09:43:36 2017 +0530
> +++ b/source/x265.h     Mon Nov 06 11:32:04 2017 +0530
> @@ -1514,6 +1514,16 @@
>      *  This DCT approximation is less computational intensive and gives
> results close to
>      *  standard DCT for QP >= 23 */
>      int       bLowPassDct;
> +
> +    /* Sets the portion of the decode buffer that must be available after
> all the
> +    * specified frames have been inserted into the decode buffer. If it
> is less
> +    * than 1, then the final buffer available is vbv-end *
> vbvBufferSize.  Otherwise,
> +    * it is interpreted as the final buffer available in kbits. Default 0
> (disabled) */
> +    double    vbvBufferEnd;
> +
> +    /* Frame from which qp has to be adjusted to hit final decode buffer
> emptiness.
> +    * Specified as a fraction of the total frames. Default 0 */
> +    double    vbvEndFrameAdjust;
>  } x265_param;
>
>  /* x265_param_alloc:
> diff -r aa9649a2aa8c -r 8a121d8cc134 source/x265cli.h
> --- a/source/x265cli.h  Mon Nov 06 09:43:36 2017 +0530
> +++ b/source/x265cli.h  Mon Nov 06 11:32:04 2017 +0530
> @@ -147,6 +147,8 @@
>      { "vbv-maxrate",    required_argument, NULL, 0 },
>      { "vbv-bufsize",    required_argument, NULL, 0 },
>      { "vbv-init",       required_argument, NULL, 0 },
> +    { "vbv-end",        required_argument, NULL, 0 },
> +    { "vbv-end-fr-adj", required_argument, NULL, 0 },
>      { "bitrate",        required_argument, NULL, 0 },
>      { "qp",             required_argument, NULL, 'q' },
>      { "aq-mode",        required_argument, NULL, 0 },
> @@ -443,6 +445,8 @@
>      H0("   --vbv-maxrate <integer>       Max local bitrate (kbit/s).
> Default %d\n", param->rc.vbvMaxBitrate);
>      H0("   --vbv-bufsize <integer>       Set size of the VBV buffer
> (kbit). Default %d\n", param->rc.vbvBufferSize);
>      H0("   --vbv-init <float>            Initial VBV buffer occupancy
> (fraction of bufsize or in kbits). Default %.2f\n",
> param->rc.vbvBufferInit);
> +    H0("   --vbv-end <float>             Final VBV buffer emptiness
> (fraction of bufsize or in kbits). Default 0 (disabled)");
> +    H0("   --vbv-end-fr-adj <float>      Frame from which qp has to be
> adjusted to achieve final decode buffer emptiness. Default 0");
>      H0("   --pass                        Multi pass rate control.\n"
>         "                                   - 1 : First pass, creates
> stats file\n"
>         "                                   - 2 : Last pass, does not
> overwrite stats file\n"
>
> _______________________________________________
> 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/20171107/57b10e7a/attachment-0001.html>


More information about the x265-devel mailing list