<div dir="ltr"><div dir="ltr"><div>From c6a826d9c98a4328a605cba8c216c38754db22dc Mon Sep 17 00:00:00 2001</div><div>From: ashok2022 <<a href="mailto:ashok@multicorewareinc.com">ashok@multicorewareinc.com</a>></div><div>Date: Wed, 21 Sep 2022 17:16:10 +0530</div><div>Subject: [PATCH] Add command line parameter for mcstf feature</div><div><br></div><div>---</div><div> source/common/param.cpp | 14 +++++++++++++-</div><div> source/x265.h           |  4 ++++</div><div> source/x265cli.cpp      |  1 +</div><div> source/x265cli.h        |  2 ++</div><div> 4 files changed, 20 insertions(+), 1 deletion(-)</div><div><br></div><div>diff --git a/source/common/param.cpp b/source/common/param.cpp</div><div>index ed6973d9c..0bc9f7f74 100755</div><div>--- a/source/common/param.cpp</div><div>+++ b/source/common/param.cpp</div><div>@@ -380,6 +380,10 @@ void x265_param_default(x265_param* param)</div><div>     param->bEnableSvtHevc = 0;</div><div>     param->svtHevcParam = NULL;</div><div> </div><div>+    /* MCTF */</div><div>+    param->bEnableGopBasedTemporalFilter = 0;</div><div>+    param->temporalFilterStrength = 0.95;</div><div>+</div><div> #ifdef SVT_HEVC</div><div>     param->svtHevcParam = svtParam;</div><div>     svt_param_default(param);</div><div>@@ -1464,6 +1468,7 @@ int x265_param_parse(x265_param* p, const char* name, const char* value)</div><div>         OPT("eos") p->bEnableEndOfSequence = atobool(value);</div><div>         /* Film grain characterstics model filename */</div><div>         OPT("film-grain") p->filmGrain = (char* )value;</div><div>+        OPT("mctf") p->bEnableGopBasedTemporalFilter = atobool(value);</div><div>         else</div><div>             return X265_PARAM_BAD_NAME;</div><div>     }</div><div>@@ -1916,6 +1921,11 @@ int x265_check_params(x265_param* param)</div><div>         param->bSingleSeiNal = 0;</div><div>         x265_log(param, X265_LOG_WARNING, "None of the SEI messages are enabled. Disabling Single SEI NAL\n");</div><div>     }</div><div>+    if (param->bEnableGopBasedTemporalFilter && (param->frameNumThreads > 1))</div><div>+    {</div><div>+        param->bEnableGopBasedTemporalFilter = 0;</div><div>+        x265_log(param, X265_LOG_WARNING, "MCTF can be enabled with frame thread = 1 only. Disabling MCTF\n");</div><div>+    }</div><div>     CHECK(param->confWinRightOffset < 0, "Conformance Window Right Offset must be 0 or greater");</div><div>     CHECK(param->confWinBottomOffset < 0, "Conformance Window Bottom Offset must be 0 or greater");</div><div>     CHECK(param->decoderVbvMaxRate < 0, "Invalid Decoder Vbv Maxrate. Value can not be less than zero");</div><div>@@ -2359,6 +2369,7 @@ char *x265_param2string(x265_param* p, int padx, int pady)</div><div>     BOOL(p->bliveVBV2pass, "vbv-live-multi-pass");</div><div>     if (p->filmGrain)</div><div>         s += sprintf(s, " film-grain=%s", p->filmGrain); // Film grain characteristics model filename</div><div>+    BOOL(p->bEnableGopBasedTemporalFilter, "mctf");</div><div> #undef BOOL</div><div>     return buf;</div><div> }</div><div>@@ -2722,7 +2733,8 @@ void x265_copy_params(x265_param* dst, x265_param* src)</div><div>     dst->bwdRefQpDelta = src->bwdRefQpDelta;</div><div>     dst->bwdNonRefQpDelta = src->bwdNonRefQpDelta;</div><div>     dst->bField = src->bField;</div><div>-</div><div>+    dst->bEnableGopBasedTemporalFilter = src->bEnableGopBasedTemporalFilter;</div><div>+    dst->temporalFilterStrength = src->temporalFilterStrength;</div><div>     dst->confWinRightOffset = src->confWinRightOffset;</div><div>     dst->confWinBottomOffset = src->confWinBottomOffset;</div><div>     dst->bliveVBV2pass = src->bliveVBV2pass;</div><div>diff --git a/source/x265.h b/source/x265.h</div><div>index 5d242d653..4b3177a94 100644</div><div>--- a/source/x265.h</div><div>+++ b/source/x265.h</div><div>@@ -1992,6 +1992,10 @@ typedef struct x265_param</div><div> </div><div>     /* Film Grain Characteristic file */</div><div>     char* filmGrain;</div><div>+</div><div>+    /*Motion compensated temporal filter*/</div><div>+    int      bEnableGopBasedTemporalFilter;</div><div>+    double   temporalFilterStrength;</div><div> } x265_param;</div><div> </div><div> /* x265_param_alloc:</div><div>diff --git a/source/x265cli.cpp b/source/x265cli.cpp</div><div>index f6ba0ab30..69d77e7bf 100755</div><div>--- a/source/x265cli.cpp</div><div>+++ b/source/x265cli.cpp</div><div>@@ -370,6 +370,7 @@ namespace X265_NS {</div><div>         H0("   --lowpass-dct                 Use low-pass subband dct approximation. Default %s\n", OPT(param->bLowPassDct));</div><div>         H0("   --[no-]frame-dup              Enable Frame duplication. Default %s\n", OPT(param->bEnableFrameDuplication));</div><div>         H0("   --dup-threshold <integer>     PSNR threshold for Frame duplication. Default %d\n", param->dupThreshold);</div><div>+        H0("   --[no-]mctf                   Enable GOP based temporal filter. Default %d\n", param->bEnableGopBasedTemporalFilter);</div><div> #ifdef SVT_HEVC</div><div>         H0("   --[no]svt                     Enable SVT HEVC encoder %s\n", OPT(param->bEnableSvtHevc));</div><div>         H0("   --[no-]svt-hme                Enable Hierarchial motion estimation(HME) in SVT HEVC encoder \n");</div><div>diff --git a/source/x265cli.h b/source/x265cli.h</div><div>index 7072f7616..29d85f96f 100644</div><div>--- a/source/x265cli.h</div><div>+++ b/source/x265cli.h</div><div>@@ -356,6 +356,8 @@ static const struct option long_options[] =</div><div>     { "frame-dup",            no_argument, NULL, 0 },</div><div>     { "no-frame-dup", no_argument, NULL, 0 },</div><div>     { "dup-threshold", required_argument, NULL, 0 },</div><div>+    { "mctf",                 no_argument, NULL, 0 },</div><div>+    { "no-mctf",              no_argument, NULL, 0 },</div><div> #ifdef SVT_HEVC</div><div>     { "svt",     no_argument, NULL, 0 },</div><div>     { "no-svt",  no_argument, NULL, 0 },</div><div>-- </div><div>2.34.1.windows.1</div><div><br></div><div><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><i><font face="georgia, serif">Thanks and Regards,</font></i></div><div><i><font face="georgia, serif"><b>Snehaa.G</b><br>Video Codec Engineer,<br>Media & AI analytics<br><a href="https://multicorewareinc.com/" target="_blank"><img src="https://ci3.googleusercontent.com/mail-sig/AIorK4yEumXeQ2mgcFAR2us9INa7z3rCbl8ordut3fbdeIbuPv0n3EA75Or1rHs0neGaI0WM8mFPz1g"></a><br><span></span><span></span><br></font></i></div></div></div></div></div></div>