<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Sep 1, 2020 at 8:41 PM Aruna Matheswaran <<a href="mailto:aruna@multicorewareinc.com">aruna@multicorewareinc.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">From 672d4b53dd35ea4b847ae3177403f526f74cda4e Mon Sep 17 00:00:00 2001<br>From: Aruna <<a href="mailto:aruna@multicorewareinc.com" target="_blank">aruna@multicorewareinc.com</a>><br>Date: Tue, 1 Sep 2020 19:59:17 +0530<br>Subject: [PATCH] Introduce CLI/param options to control min and max VBV<br> fullness<br><br>---<br> doc/reST/cli.rst               | 18 +++++++++++++++---<br> source/CMakeLists.txt          |  2 +-<br> source/common/param.cpp        | 14 ++++++++++++--<br> source/encoder/ratecontrol.cpp |  4 ++--<br> source/x265.h                  |  8 ++++++++<br> source/x265cli.h               |  2 ++<br> 6 files changed, 40 insertions(+), 8 deletions(-)<br><br>diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst<br>index 02828e390..18ca17d35 100644<br>--- a/doc/reST/cli.rst<br>+++ b/doc/reST/cli.rst<br>@@ -1671,8 +1671,8 @@ Quality, rate control and rate distortion options<br> <br> .. option:: --vbv-end <float><br> <br>-      Final buffer emptiness. The portion of the decode buffer that must be <br>-       available after all the specified frames have been inserted into the <br>+        Final buffer fullness. The portion of the decode buffer that must be <br>+        full after all the specified frames have been inserted into the <br>     decode buffer. Specified as a fractional value between 0 and 1, or in <br>       kbits. Default 0 (disabled)<br>  <br>@@ -1684,8 +1684,20 @@ Quality, rate control and rate distortion options<br> .. option:: --vbv-end-fr-adj <float><br> <br>         Frame from which qp has to be adjusted to achieve final decode buffer<br>-        emptiness. Specified as a fraction of the total frames. Fractions > 0 are <br>+        fullness. Specified as a fraction of the total frames. Fractions > 0 are <br>         supported only when the total number of frames is known. Default 0.<br>+  <br>+.. option:: --min-vbv-fullness <double><br>+<br>+    Minimum VBV fullness percentage to be maintained. Specified as a fractional<br>+    value ranging between 0 and 100. Default 50 i.e, Tries to keep the buffer at least<br>+    50% full at any point in time.<br>+<br>+.. option:: --max-vbv-fullness <double><br>+<br>+    Maximum VBV fullness percentage to be maintained. Specified as a fractional<br>+    value ranging between 0 and 100. Default 80 i.e Tries to keep the buffer at max 80%<br>+    full at any point in time.<br> <br> .. option:: --qp, -q <integer><br> <br>diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt<br>index 1d1f8cacf..d9ed3983e 100644<br>--- a/source/CMakeLists.txt<br>+++ b/source/CMakeLists.txt<br>@@ -29,7 +29,7 @@ option(NATIVE_BUILD "Target the build CPU" OFF)<br> option(STATIC_LINK_CRT "Statically link C runtime for release builds" OFF)<br> mark_as_advanced(FPROFILE_USE FPROFILE_GENERATE NATIVE_BUILD)<br> # X265_BUILD must be incremented each time the public API is changed<br>-set(X265_BUILD 195)<br>+set(X265_BUILD 196)<br> configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265.def.in" target="_blank">x265.def.in</a>"<br>                "${PROJECT_BINARY_DIR}/x265.def")<br> configure_file("${PROJECT_SOURCE_DIR}/<a href="http://x265_config.h.in" target="_blank">x265_config.h.in</a>"<br>diff --git a/source/common/param.cpp b/source/common/param.cpp<br>index 240568445..f356074a4 100644<br>--- a/source/common/param.cpp<br>+++ b/source/common/param.cpp<br>@@ -255,6 +255,8 @@ void x265_param_default(x265_param* param)<br>     param->rc.vbvBufferInit = 0.9;<br>     param->vbvBufferEnd = 0;<br>     param->vbvEndFrameAdjust = 0;<br>+    param->minVbvFullness = 50;<br>+    param->maxVbvFullness = 80;<br>     param->rc.rfConstant = 28;<br>     param->rc.bitrate = 0;<br>     param->rc.qCompress = 0.6;<br>@@ -1375,6 +1377,8 @@ int x265_param_parse(x265_param* p, const char* name, const char* value)<br>             sscanf(value, "%d,%d,%d", &p->hmeRange[0], &p->hmeRange[1], &p->hmeRange[2]);<br>             p->bEnableHME = true;<br>         }<br>+        OPT("min-vbv-fullness") p->minVbvFullness = atof(value);<br>+        OPT("max-vbv-fullness") p->maxVbvFullness = atof(value);<br>         else<br>             return X265_PARAM_BAD_NAME;<br>     }<br>@@ -1714,6 +1718,10 @@ int x265_check_params(x265_param* param)<br>         "Valid vbv-end-fr-adj must be a fraction 0 - 1");<br>     CHECK(!param->totalFrames && param->vbvEndFrameAdjust,<br>         "vbv-end-fr-adj cannot be enabled when total number of frames is unknown");<br>+    CHECK(param->minVbvFullness < 0 && param->minVbvFullness > 100,<br>+        "min-vbv-fullness must be a fraction 0 - 100");<br>+    CHECK(param->maxVbvFullness < 0 && param->maxVbvFullness > 100,<br>+        "max-vbv-fullness must be a fraction 0 - 100");<br>     CHECK(param->rc.bitrate < 0,<br>           "Target bitrate can not be less than zero");<br>     CHECK(param->rc.qCompress < 0.5 || param->rc.qCompress > 1.0,<br>@@ -2127,8 +2135,8 @@ char *x265_param2string(x265_param* p, int padx, int pady)<br>             BOOL(p->rc.bEnableSlowFirstPass, "slow-firstpass");<br>         if (p->rc.vbvBufferSize)<br>         {<br>-            s += sprintf(s, " vbv-maxrate=%d vbv-bufsize=%d vbv-init=%.1f",<br>-                 p->rc.vbvMaxBitrate, p->rc.vbvBufferSize, p->rc.vbvBufferInit);<br>+            s += sprintf(s, " vbv-maxrate=%d vbv-bufsize=%d vbv-init=%.1f min-vbv-fullness=%.1f max-vbv-fullness=%.1f",<br>+                p->rc.vbvMaxBitrate, p->rc.vbvBufferSize, p->rc.vbvBufferInit, p->minVbvFullness, p->maxVbvFullness);<br>             if (p->vbvBufferEnd)<br>                 s += sprintf(s, " vbv-end=%.1f vbv-end-fr-adj=%.1f", p->vbvBufferEnd, p->vbvEndFrameAdjust);<br>             if (p->rc.rateControlMode == X265_RC_CRF)<br>@@ -2436,6 +2444,8 @@ void x265_copy_params(x265_param* dst, x265_param* src)<br>     dst->rc.vbvMaxBitrate = src->rc.vbvMaxBitrate;<br> <br>     dst->rc.vbvBufferInit = src->rc.vbvBufferInit;<br>+    dst->minVbvFullness = src->minVbvFullness;<br>+    dst->maxVbvFullness = src->maxVbvFullness;<br>     dst->rc.cuTree = src->rc.cuTree;<br>     dst->rc.rfConstantMax = src->rc.rfConstantMax;<br>     dst->rc.rfConstantMin = src->rc.rfConstantMin;<br>diff --git a/source/encoder/ratecontrol.cpp b/source/encoder/ratecontrol.cpp<br>index 82d7c4f2a..0e0845a85 100644<br>--- a/source/encoder/ratecontrol.cpp<br>+++ b/source/encoder/ratecontrol.cpp<br>@@ -2370,7 +2370,7 @@ double RateControl::clipQscale(Frame* curFrame, RateControlEntry* rce, double q)<br>                     {<br>                         finalDur = x265_clip3(0.4, 1.0, totalDuration);<br>                     }<br>-                    targetFill = X265_MIN(m_bufferFill + totalDuration * m_vbvMaxRate * 0.5, m_bufferSize * (1 - 0.5 * finalDur));<br>+                    targetFill = X265_MIN(m_bufferFill + totalDuration * m_vbvMaxRate * 0.5, m_bufferSize * ((m_param->minVbvFullness / 100) * finalDur));<br>                     if (bufferFillCur < targetFill)<br>                     {<br>                         q *= 1.01;<br>@@ -2378,7 +2378,7 @@ double RateControl::clipQscale(Frame* curFrame, RateControlEntry* rce, double q)<br>                         continue;<br>                     }<br>                     /* Try to get the buffer not more than 80% filled, but don't set an impossible goal. */<br>-                    targetFill = x265_clip3(m_bufferSize * (1 - 0.2 * finalDur), m_bufferSize, m_bufferFill - totalDuration * m_vbvMaxRate * 0.5);<br>+                    targetFill = x265_clip3(m_bufferSize * ((m_param->maxVbvFullness / 100) * finalDur), m_bufferSize, m_bufferFill - totalDuration * m_vbvMaxRate * 0.5);<br>                     if (m_isCbr && bufferFillCur > targetFill && !m_isSceneTransition)<br>                     {<br>                         q /= 1.01;<br></div></blockquote><div>in the else part below (Fallback to old purely-reactive algorithm: no lookahead),</div><div>Should the m_bufferFill / m_bufferSize < 0.5 be changed to m_bufferFill / m_bufferSize <  m_param->minVbvFullness /100 ??</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">diff --git a/source/x265.h b/source/x265.h<br>index 0ffa600b0..46024db37 100644<br>--- a/source/x265.h<br>+++ b/source/x265.h<br>@@ -1920,6 +1920,14 @@ typedef struct x265_param<br> <br>     /* Maxrate that could be signaled to the decoder. Default 0. API only. */<br>     int      decoderVbvMaxRate;<br>+<br>+    /* Minimum VBV fullness to be maintained. Default 50. Keep the buffer<br>+     * at least 50% full */<br>+    double   minVbvFullness;<br>+<br>+    /* Maximum VBV fullness to be maintained. Default 80. Keep the buffer<br>+    * at max 80% full */<br>+    double   maxVbvFullness;<br> } x265_param;<br> <br> /* x265_param_alloc:<br>diff --git a/source/x265cli.h b/source/x265cli.h<br>index 311f06935..b7bdd0c2d 100644<br>--- a/source/x265cli.h<br>+++ b/source/x265cli.h<br>@@ -374,6 +374,8 @@ static const struct option long_options[] =<br>     { "no-cll", no_argument, NULL, 0 },<br>     { "hme-range", required_argument, NULL, 0 },<br>     { "abr-ladder", required_argument, NULL, 0 },<br>+    { "min-vbv-fullness", required_argument, NULL, 0 },<br>+    { "max-vbv-fullness", required_argument, NULL, 0 },<br>     { 0, 0, 0, 0 },<br>     { 0, 0, 0, 0 },<br>     { 0, 0, 0, 0 },<br></div></blockquote><div>I don't see help options for the new cli's. Can you add them to the patch.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">-- <br><div>-- <br></div><div dir="ltr"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><font face="georgia, serif">Regards,</font><div><b><font face="georgia, serif">Aruna Matheswaran,</font></b></div><div><font face="georgia, serif">Video Codec Engineer,</font></div><div><font face="georgia, serif">Media & AI analytics BU,</font></div><div><span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap"><span style="border:none;display:inline-block;overflow:hidden;width:153px;height:58px"><img src="https://lh5.googleusercontent.com/gjX5cPNIZgwUrhfqkTwQUZWztIKmmo0qs3kbwvkS5H-bDVE2ftte9pMTVnFLSjOcjYWLtfc6_OGpxW4vraLg2r5QAIf1Q3MpldFDgWtzK_gXi8ptw5B3joIbsGL6mxj-JRdjHzT5" width="96" height="36" style="margin-left: 0px; margin-top: 0px;"></span></span></span><font face="georgia, serif"><br></font></div><div><span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap"><span style="border:none;display:inline-block;overflow:hidden;width:153px;height:58px"><img src="https://lh5.googleusercontent.com/gjX5cPNIZgwUrhfqkTwQUZWztIKmmo0qs3kbwvkS5H-bDVE2ftte9pMTVnFLSjOcjYWLtfc6_OGpxW4vraLg2r5QAIf1Q3MpldFDgWtzK_gXi8ptw5B3joIbsGL6mxj-JRdjHzT5" style="margin-left: 0px; margin-top: 0px;"></span></span></span><font face="georgia, serif"><br></font></div><div><font face="georgia, serif"><br></font></div></div></div></div></div></div></div></div></div></div>
_______________________________________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/listinfo/x265-devel</a><br>
</blockquote></div></div></div></div></div></div>