<div dir="ltr">Pushed 2 patches to the master and release_4.1 branches</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 12, 2024 at 3:02 PM Kirithika Kalirathnam <<a href="mailto:kirithika@multicorewareinc.com">kirithika@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"><div>From 3b5391aed1d50348a1c00744221913bddcb3f1fb Mon Sep 17 00:00:00 2001<br>From: Kirithika <<a href="mailto:kirithika@multicorewareinc.com" target="_blank">kirithika@multicorewareinc.com</a>><br>Date: Fri, 8 Nov 2024 09:10:20 +0530<br>Subject: [PATCH] Add CLI support for configuring RC at frame level<br><br>This patch also does cleanup and docs update<br>---<br> doc/reST/cli.rst               |  9 +++-<br> source/CMakeLists.txt          |  2 +-<br> source/common/frame.h          |  4 +-<br> source/common/param.cpp        |  5 ++<br> source/encoder/api.cpp         | 22 +++++++--<br> source/encoder/encoder.cpp     | 84 +++++++++++++++-------------------<br> source/encoder/ratecontrol.cpp | 73 +++++++++++++----------------<br> source/x265.h                  |  5 ++<br> source/x265cli.cpp             |  3 +-<br> source/x265cli.h               |  2 +<br> 10 files changed, 114 insertions(+), 95 deletions(-)<br><br>diff --git a/doc/reST/cli.rst b/doc/reST/cli.rst<br>index 4d4774613..b5a04a136 100755<br>--- a/doc/reST/cli.rst<br>+++ b/doc/reST/cli.rst<br>@@ -2102,7 +2102,14 @@ Quality, rate control and rate distortion options<br>         Used to trigger encoding of selective GOPs; Disabled by default.<br>     <br>     **API ONLY**<br>- <br>+<br>+.. option:: --frame-rc, --no-frame-rc<br>+<br>+    This option allows configuring Rate control parameter of the chosen Rate Control<br>+    mode(CRF or QP or Bitrate) at frame level.<br>+    This option is recommended to be enabled only when planning to invoke the API function<br>+    x265_encoder_reconfig() to configure Rate control parameter value for each frame.<br>+    Default: disabled.<br> <br> Quantization Options<br> ====================<br>diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt<br>index 14f6ccc49..9e5af81e4 100755<br>--- a/source/CMakeLists.txt<br>+++ b/source/CMakeLists.txt<br>@@ -31,7 +31,7 @@ option(NATIVE_BUILD "Target the build CPU" OFF)<br> option(STATIC_LINK_CRT "Statically link C and C++ runtimes 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 214)<br>+set(X265_BUILD 215)<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/frame.h b/source/common/frame.h<br>index 035c0655c..704f19422 100644<br>--- a/source/common/frame.h<br>+++ b/source/common/frame.h<br>@@ -175,10 +175,10 @@ public:<br>     Frame*                 m_nextSubDPB;           // PicList doubly linked list pointers<br>     Frame*                 m_prevSubDPB;<br> <br>-    /*Target bitrate*/<br>+    /*Target bitrate for this picture*/<br>     int64_t                m_targetBitrate;<br>     /* target CRF for this picture.*/<br>-    int                    m_targetCrf;<br>+    double                 m_targetCrf;<br>     /* target QP for this picture.*/<br>     int                    m_targetQp;<br> <br>diff --git a/source/common/param.cpp b/source/common/param.cpp<br>index 85dd5df98..dd8a12ef4 100755<br>--- a/source/common/param.cpp<br>+++ b/source/common/param.cpp<br>@@ -444,6 +444,8 @@ void x265_param_default(x265_param* param)<br> <br>     /* SCC */<br>     param->bEnableSCC = 0;<br>+<br>+    param->bConfigRCFrame = 0;<br> }<br> <br> int x265_param_default_preset(x265_param* param, const char* preset, const char* tune)<br>@@ -1517,6 +1519,7 @@ int x265_param_parse(x265_param* p, const char* name, const char* value)<br>                 p->bEnableWeightedPred = false;<br>         }<br> #endif<br>+        OPT("frame-rc") p->bConfigRCFrame = atobool(value);<br>         else<br>             return X265_PARAM_BAD_NAME;<br>     }<br>@@ -2472,6 +2475,7 @@ char *x265_param2string(x265_param* p, int padx, int pady)<br>     s += snprintf(s, bufSize - (s - buf), "scc=%d", p->bEnableSCC);<br> #endif<br>     BOOL(p->bEnableSBRC, "sbrc");<br>+    BOOL(p->bConfigRCFrame, "frame-rc");<br> #undef BOOL<br>     return buf;<br> }<br>@@ -3020,6 +3024,7 @@ void x265_copy_params(x265_param* dst, x265_param* src)<br>     if (src->aomFilmGrain)<br>         dst->aomFilmGrain = src->aomFilmGrain;<br>     dst->bEnableSBRC = src->bEnableSBRC;<br>+    dst->bConfigRCFrame = src->bConfigRCFrame;<br> }<br> <br> #ifdef SVT_HEVC<br>diff --git a/source/encoder/api.cpp b/source/encoder/api.cpp<br>index 5024314f6..5b6e959c0 100644<br>--- a/source/encoder/api.cpp<br>+++ b/source/encoder/api.cpp<br>@@ -358,7 +358,7 @@ int x265_encoder_reconfig(x265_encoder* enc, x265_param* param_in)<br>         }<br>         if (!isReconfigureRc)<br>             encoder->m_reconfigure = true;<br>-        else if (encoder->m_reconfigureRc)<br>+        else if (encoder->m_reconfigureRc || encoder->m_latestParam->bConfigRCFrame)<br>         {<br>             VPS saveVPS;<br>             memcpy(&saveVPS.ptl, &encoder->m_vps.ptl, sizeof(saveVPS.ptl));<br>@@ -1408,7 +1408,15 @@ FILE* x265_csvlog_open(const x265_param* param)<br> #if ENABLE_LIBVMAF<br>                     fprintf(csvfp, ", VMAF Frame Score");<br> #endif<br>-                    fprintf(csvfp, ", Target bitrate");<br>+                    if (param->bConfigRCFrame)<br>+                    {<br>+                        if (param->rc.rateControlMode == X265_RC_ABR)<br>+                            fprintf(csvfp, ", Target bitrate");<br>+                        else if (param->rc.rateControlMode == X265_RC_CRF)<br>+                            fprintf(csvfp, ", Target CRF");<br>+                        else if (param->rc.rateControlMode == X265_RC_CQP)<br>+                            fprintf(csvfp, ", Target QP");<br>+                    }<br>                 }<br>                 fprintf(csvfp, "\n");<br>             }<br>@@ -1536,7 +1544,15 @@ void x265_csvlog_frame(const x265_param* param, const x265_picture* pic)<br> #if ENABLE_LIBVMAF<br>         fprintf(param->csvfpt, ", %lf", frameStats->vmafFrameScore);<br> #endif<br>-        fprintf(param->csvfpt, ", %I64d", frameStats->currTrBitrate);<br>+        if (param->bConfigRCFrame)<br>+        {<br>+            if(param->rc.rateControlMode == X265_RC_ABR)<br>+                fprintf(param->csvfpt, ", %ld", (long)frameStats->currTrBitrate);<br>+            else if (param->rc.rateControlMode == X265_RC_CRF)<br>+                fprintf(param->csvfpt, ", %f", frameStats->currTrCRF);<br>+            else if (param->rc.rateControlMode == X265_RC_CQP)<br>+                fprintf(param->csvfpt, ", %d", frameStats->currTrQP);<br>+        }<br>     }<br>     fprintf(param->csvfpt, "\n");<br>     fflush(stderr);<br>diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp<br>index 17f14c561..1fbaf3228 100644<br>--- a/source/encoder/encoder.cpp<br>+++ b/source/encoder/encoder.cpp<br>@@ -1522,7 +1522,7 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)<br>                 inputPic[view] = pic_in + view;<br>         }<br> <br>-        x265_param* p = (m_reconfigure || m_reconfigureRc) ? m_latestParam : m_param;<br>+        x265_param* p = (m_reconfigure || m_reconfigureRc || m_param->bConfigRCFrame) ? m_latestParam : m_param;<br>         Frame* inFrame[MAX_LAYERS];<br>         for (int layer = 0; layer < m_param->numLayers; layer++)<br>         {<br>@@ -1664,8 +1664,17 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)<br>             }<br> <br>             inFrame[layer]->m_forceqp = inputPic[0]->forceqp;<br>-            inFrame[layer]->m_param = (m_reconfigure || m_reconfigureRc) ? m_latestParam : m_param;<br>+            inFrame[layer]->m_param = (m_reconfigure || m_reconfigureRc || m_param->bConfigRCFrame) ? m_latestParam : m_param;<br>             inFrame[layer]->m_picStruct = inputPic[0]->picStruct;<br>+<br>+            /*Copy reconfigured RC parameters to frame*/<br>+            if (m_param->rc.rateControlMode == X265_RC_ABR)<br>+                inFrame[layer]->m_targetBitrate = inFrame[layer]->m_param->rc.bitrate;<br>+            else if (m_param->rc.rateControlMode == X265_RC_CRF)<br>+                inFrame[layer]->m_targetCrf = inFrame[layer]->m_param->rc.rfConstant;<br>+            else if (m_param->rc.rateControlMode == X265_RC_CQP)<br>+                inFrame[layer]->m_targetQp = inFrame[layer]->m_param->rc.qp;<br>+<br>             if (m_param->bField && m_param->interlaceMode)<br>                 inFrame[layer]->m_fieldNum = inputPic[0]->fieldNum;<br> <br>@@ -1802,26 +1811,8 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)<br>             }<br>         }<br> <br>-        if (m_reconfigureRc)<br>-        {<br>-            if (m_param->rc.rateControlMode == X265_RC_ABR)<br>-                inFrame[0]->m_targetBitrate = m_latestParam->rc.bitrate;<br>-            else if (m_param->rc.rateControlMode == X265_RC_CRF)<br>-                inFrame[0]->m_targetCrf = (int)m_latestParam->rc.rfConstant;<br>-            else if (m_param->rc.rateControlMode == X265_RC_CQP)<br>-                inFrame[0]->m_targetQp = m_latestParam->rc.qp;<br>+        if (m_reconfigureRc || m_param->bConfigRCFrame)<br>             inFrame[0]->m_reconfigureRc = true;<br>-            m_reconfigureRc = false;<br>-        }<br>-        else<br>-        {<br>-            if (m_param->rc.rateControlMode == X265_RC_ABR)<br>-                inFrame[0]->m_targetBitrate = m_latestParam->rc.bitrate;<br>-            else if (m_param->rc.rateControlMode == X265_RC_CRF)<br>-                inFrame[0]->m_targetCrf = (int)m_latestParam->rc.rfConstant;<br>-            else if (m_param->rc.rateControlMode == X265_RC_CQP)<br>-                inFrame[0]->m_targetQp = m_latestParam->rc.qp;<br>-        }<br> <br>         if (m_param->bEnableTemporalFilter)<br>         {<br>@@ -2005,16 +1996,6 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)<br>                         if (m_param->bUseAnalysisFile)<br>                             x265_free_analysis_data(m_param, &pic_out[sLayer].analysisData);<br>                     }<br>-                    if (sLayer == 0)<br>-                    {<br>-                        if (outFrame->m_targetBitrate && m_param->rc.rateControlMode == X265_RC_ABR)<br>-                            pic_out[sLayer].frameData.currTrBitrate = outFrame->m_targetBitrate;<br>-                        else<br>-                            pic_out[sLayer].frameData.currTrBitrate = 0;<br>-                    }<br>-                    else<br>-                        x265_log(m_param, X265_LOG_WARNING, "Frame wise bitrate reconfigure are not supported for enhancement layers\n");<br>-<br>                 }<br>                 if (m_param->rc.bStatWrite && (m_param->analysisMultiPassRefine || m_param->analysisMultiPassDistortion))<br>                 {<br>@@ -2230,26 +2211,30 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)<br> <br>             if (frameEnc[0]->m_reconfigureRc)<br>             {<br>-                m_rateControl->m_bRcReConfig = true;<br>-                if (m_param->rc.rateControlMode == X265_RC_ABR)<br>+                if (m_reconfigureRc)<br>+                    x265_copy_params(m_param, m_latestParam);<br>+                else if (m_param->bConfigRCFrame)<br>                 {<br>-                    m_param->rc.bitrate = (int)frameEnc[0]->m_targetBitrate;<br>-                    m_rateControl->m_param->rc.bitrate = (int)frameEnc[0]->m_targetBitrate;<br>-                }<br>-                else if (m_param->rc.rateControlMode == X265_RC_CRF)<br>-                {<br>-                    m_param->rc.rfConstant = (double)frameEnc[0]->m_targetCrf;<br>-                    m_rateControl->m_param->rc.rfConstant = frameEnc[0]->m_targetCrf;<br>-                }<br>-                else if (m_param->rc.rateControlMode == X265_RC_CQP)<br>-                {<br>-                    m_param->rc.qp = frameEnc[0]->m_targetQp;<br>-                    m_rateControl->m_param->rc.qp = frameEnc[0]->m_targetQp;<br>+                    m_rateControl->m_bRcReConfig = true;<br>+                    if (m_param->rc.rateControlMode == X265_RC_ABR)<br>+                    {<br>+                        m_param->rc.bitrate = (int)frameEnc[0]->m_targetBitrate;<br>+                        m_rateControl->m_param->rc.bitrate = (int)frameEnc[0]->m_targetBitrate;<br>+                    }<br>+                    else if (m_param->rc.rateControlMode == X265_RC_CRF)<br>+                    {<br>+                        m_param->rc.rfConstant = (double)frameEnc[0]->m_targetCrf;<br>+                        m_rateControl->m_param->rc.rfConstant = frameEnc[0]->m_targetCrf;<br>+                    }<br>+                    else if (m_param->rc.rateControlMode == X265_RC_CQP)<br>+                    {<br>+                        m_param->rc.qp = frameEnc[0]->m_targetQp;<br>+                        m_rateControl->m_param->rc.qp = frameEnc[0]->m_targetQp;<br>+                    }<br>                 }<br>                 m_rateControl->reconfigureRC();<br>                 m_reconfigureRc = false;<br>             }<br>-<br>             if (frameEnc[0]->m_reconfigureRc && !m_reconfigureRc)<br>                 frameEnc[0]->m_reconfigureRc = false;<br>             if (curEncoder->m_reconfigure)<br>@@ -2522,6 +2507,10 @@ int Encoder::reconfigureParam(x265_param* encParam, x265_param* param)<br>         encParam->rc.rfConstant = param->rc.rfConstant;<br>         m_reconfigureRc |= encParam->rc.qp != param->rc.qp;<br>         encParam->rc.qp = param->rc.qp;<br>+<br>+        /*Allow encoder to reconfigure RC for each input frame*/<br>+        if (encParam->bConfigRCFrame)<br>+            m_reconfigureRc = false;<br>     }<br>     else<br>     {<br>@@ -3204,6 +3193,9 @@ void Encoder::finishFrameStats(Frame* curFrame, FrameEncoder *curEncoder, x265_f<br>                     }<br>                 }<br>             }<br>+            frameStats->currTrBitrate = curFrame->m_targetBitrate;<br>+            frameStats->currTrCRF = curFrame->m_targetCrf;<br>+            frameStats->currTrQP = curFrame->m_targetQp;<br>         }<br> <br>         if (m_param->csvLogLevel >= 1)<br>diff --git a/source/encoder/ratecontrol.cpp b/source/encoder/ratecontrol.cpp<br>index 300e27534..d1f335e30 100644<br>--- a/source/encoder/ratecontrol.cpp<br>+++ b/source/encoder/ratecontrol.cpp<br>@@ -1935,11 +1935,13 @@ double RateControl::rateEstimateQscale(Frame* curFrame, RateControlEntry *rce)<br>         if (m_param->rc.rateControlMode == X265_RC_ABR)<br>             m_bitrate = (double)curFrame->m_targetBitrate * 1000;<br>         else if (m_param->rc.rateControlMode == X265_RC_CRF)<br>-            m_param->rc.rfConstant = (double)curFrame->m_targetCrf;<br>-        else if (m_param->rc.rateControlMode == X265_RC_CQP)<br>-            m_param->rc.qp = curFrame->m_targetQp;<br>+        {<br>+            double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0;<br>+            double qComp = (m_param->rc.cuTree && !m_param->rc.hevcAq) ? 0.99 : m_param->rc.qCompress;<br>+            m_rateFactorConstant = pow(m_currentSatd, 1.0 - qComp) /<br>+                x265_qp2qScale(curFrame->m_targetCrf + mbtree_offset);<br>+        }<br>     }<br>-<br>     if ((m_param->bliveVBV2pass && m_param->rc.rateControlMode == X265_RC_ABR) || m_isAbr)<br>     {<br>         int pos = m_sliderPos % s_slidingWindowFrames;<br>@@ -2021,11 +2023,6 @@ double RateControl::rateEstimateQscale(Frame* curFrame, RateControlEntry *rce)<br> <br>         if (m_bRcReConfig && m_param->rc.rateControlMode == X265_RC_CRF)<br>         {<br>-            double rfConstant = m_param->rc.rfConstant;<br>-            double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0;<br>-            double qComp = (m_param->rc.cuTree && !m_param->rc.hevcAq) ? 0.99 : m_param->rc.qCompress;<br>-            m_rateFactorConstant = pow(m_currentSatd, 1.0 - qComp) /<br>-                x265_qp2qScale(rfConstant + mbtree_offset);<br>             double qScale = getQScale(rce, m_rateFactorConstant);<br>             q = x265_qScale2qp(qScale);<br>         }<br>@@ -2277,14 +2274,6 @@ double RateControl::rateEstimateQscale(Frame* curFrame, RateControlEntry *rce)<br>                     m_rateFactorConstant = pow(m_currentSatd, 1.0 - qComp) /<br>                         x265_qp2qScale(rfConstant + mbtree_offset);<br>                 }<br>-                if (m_bRcReConfig)<br>-                {<br>-                    double rfConstant = m_param->rc.rfConstant;<br>-                    double mbtree_offset = m_param->rc.cuTree ? (1.0 - m_param->rc.qCompress) * 13.5 : 0;<br>-                    double qComp = (m_param->rc.cuTree && !m_param->rc.hevcAq) ? 0.99 : m_param->rc.qCompress;<br>-                    m_rateFactorConstant = pow(m_currentSatd, 1.0 - qComp) /<br>-                        x265_qp2qScale(rfConstant + mbtree_offset);<br>-                }<br>                 q = getQScale(rce, m_rateFactorConstant);<br>                 x265_zone* zone = getZone();<br>                 if (zone)<br>@@ -2596,34 +2585,36 @@ double RateControl::tuneQscaleForSBRC(Frame* curFrame, double q)<br> double RateControl::tuneQscaleToUpdatedBitrate(Frame* curFrame, double q)<br> {<br>     int depth = 18;<br>-<br>-    for (int iterations = 0; iterations < 100; iterations++)<br>+    if (m_isVbv && m_currentSatd > 0 && curFrame)<br>     {<br>-        int i;<br>-        double frameBitsTotal = m_fps * predictSize(&m_pred[m_predType], q, (double)m_currentSatd);<br>-        for (i = 0; i < depth; i++)<br>+        for (int iterations = 0; iterations < 100; iterations++)<br>         {<br>-            int type = curFrame->m_lowres.plannedType[i];<br>-            if (type == X265_TYPE_AUTO)<br>+            int i;<br>+            double frameBitsTotal = m_fps * predictSize(&m_pred[m_predType], q, (double)m_currentSatd);<br>+            for (i = 0; i < depth; i++)<br>+            {<br>+                int type = curFrame->m_lowres.plannedType[i];<br>+                if (type == X265_TYPE_AUTO)<br>+                    break;<br>+                int64_t satd = curFrame->m_lowres.plannedSatd[i] >> (X265_DEPTH - 8);<br>+                type = IS_X265_TYPE_I(curFrame->m_lowres.plannedType[i]) ? I_SLICE : IS_X265_TYPE_B(curFrame->m_lowres.plannedType[i]) ? B_SLICE : P_SLICE;<br>+                int predType = getPredictorType(curFrame->m_lowres.plannedType[i], type);<br>+                double curBits = m_fps * predictSize(&m_pred[predType], q, (double)satd);<br>+                frameBitsTotal += curBits;<br>+            }<br>+            frameBitsTotal /= i;<br>+            double allowedSize = (double)(curFrame->m_targetBitrate * 1000);<br>+            if (frameBitsTotal >= 1.1 * allowedSize)<br>+                q = q * 1.1;<br>+            else if (frameBitsTotal >= 1.05 * allowedSize)<br>+                q = q * 1.05;<br>+            else if (frameBitsTotal <= 0.9 * allowedSize)<br>+                q = q / 1.1;<br>+            else if (frameBitsTotal <= 0.95 * allowedSize)<br>+                q = q / 1.05;<br>+            else<br>                 break;<br>-            int64_t satd = curFrame->m_lowres.plannedSatd[i] >> (X265_DEPTH - 8);<br>-            type = IS_X265_TYPE_I(curFrame->m_lowres.plannedType[i]) ? I_SLICE : IS_X265_TYPE_B(curFrame->m_lowres.plannedType[i]) ? B_SLICE : P_SLICE;<br>-            int predType = getPredictorType(curFrame->m_lowres.plannedType[i], type);<br>-            double curBits = m_fps * predictSize(&m_pred[predType], q, (double)satd);<br>-            frameBitsTotal += curBits;<br>         }<br>-        frameBitsTotal /= i;<br>-        double allowedSize = (double)(curFrame->m_targetBitrate * 1000);<br>-        if (frameBitsTotal >= 1.1 * allowedSize)<br>-            q = q * 1.1;<br>-        else if (frameBitsTotal >= 1.05 * allowedSize)<br>-            q = q * 1.05;<br>-        else if (frameBitsTotal <= 0.9 * allowedSize)<br>-            q = q / 1.1;<br>-        else if (frameBitsTotal <= 0.95 * allowedSize)<br>-            q = q / 1.05;<br>-        else<br>-            break;<br>     }<br>     return q;<br> }<br>diff --git a/source/x265.h b/source/x265.h<br>index 31060b1ee..c4fb1a54d 100644<br>--- a/source/x265.h<br>+++ b/source/x265.h<br>@@ -316,6 +316,8 @@ typedef struct x265_frame_stats<br>     double           unclippedBufferFillFinal;<br>     uint8_t          tLayer;<br>     int64_t          currTrBitrate;<br>+    double           currTrCRF;<br>+    int              currTrQP;<br> } x265_frame_stats;<br> <br> typedef struct x265_ctu_info_t<br>@@ -2338,6 +2340,9 @@ typedef struct x265_param<br> <br>     /*Screen Content Coding*/<br>     int     bEnableSCC;<br>+<br>+    /*Frame level RateControl Configuration*/<br>+    int     bConfigRCFrame;<br> } x265_param;<br> <br> /* x265_param_alloc:<br>diff --git a/source/x265cli.cpp b/source/x265cli.cpp<br>index 3993543eb..a7d5f492a 100755<br>--- a/source/x265cli.cpp<br>+++ b/source/x265cli.cpp<br>@@ -434,7 +434,8 @@ namespace X265_NS {<br>         H0("\nSEI Message Options\n");<br>         H0("   --film-grain <filename>       File containing Film Grain Characteristics to be written as a SEI Message\n");<br>         H0("   --aom-film-grain <filename>   File containing Aom Film Grain Characteristics to be written as a SEI Message\n");<br>-<br>+        H0("   --[no-]frame-rc              Enable configuring Rate Control parameters(QP, CRF or Bitrate) at frame level.Default 0\n"<br>+           "                                Enable this option only when planning to invoke the API function x265_encoder_reconfig to configure Rate Control parameters\n");<br> #undef OPT<br> #undef H0<br> #undef H1<br>diff --git a/source/x265cli.h b/source/x265cli.h<br>index aaa385cb4..86fd14caf 100644<br>--- a/source/x265cli.h<br>+++ b/source/x265cli.h<br>@@ -396,6 +396,8 @@ static const struct option long_options[] =<br>     { "scenecut-qp-config", required_argument, NULL, 0 },<br>     { "film-grain", required_argument, NULL, 0 },<br>     { "aom-film-grain", required_argument, NULL, 0 },<br>+    { "frame-rc",no_argument, NULL, 0 },<br>+    { "no-frame-rc",no_argument, NULL, 0 },<br>     { 0, 0, 0, 0 },<br>     { 0, 0, 0, 0 },<br>     { 0, 0, 0, 0 },<br>-- <br>2.28.0.windows.1<br><br></div><div><div dir="ltr" class="gmail_signature"><div dir="ltr"><i>Thanks,</i><div><i>Kirithika</i></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>