<div dir="ltr"><div dir="ltr"><div>From b896548fe4b38f2f32596d423b13362c6d31f79f Mon Sep 17 00:00:00 2001</div><div>From: ashok2022 <<a href="mailto:ashok@multicorewareinc.com">ashok@multicorewareinc.com</a>></div><div>Date: Thu, 13 Oct 2022 23:31:15 +0530</div><div>Subject: [PATCH] Cleanup</div><div><br></div><div>---</div><div> source/common/common.h           |  2 +-</div><div> source/common/frame.cpp          |  4 +-</div><div> source/common/param.cpp          | 16 +++---</div><div> source/common/slice.h            |  2 +-</div><div> source/common/temporalfilter.cpp | 92 +++++++++++++++-----------------</div><div> source/common/temporalfilter.h   | 38 +++++--------</div><div> source/encoder/dpb.cpp           |  4 +-</div><div> source/encoder/encoder.cpp       | 84 ++++++++++++++---------------</div><div> source/encoder/encoder.h         |  2 +-</div><div> source/encoder/frameencoder.cpp  | 19 ++++---</div><div> source/encoder/frameencoder.h    |  2 +-</div><div> source/x265.h                    |  2 +-</div><div> source/x265cli.cpp               |  2 +-</div><div> source/x265cli.h                 |  4 +-</div><div> 14 files changed, 129 insertions(+), 144 deletions(-)</div><div><br></div><div>diff --git a/source/common/common.h b/source/common/common.h</div><div>index 982b03d89..f115d6a24 100644</div><div>--- a/source/common/common.h</div><div>+++ b/source/common/common.h</div><div>@@ -342,7 +342,7 @@ typedef int16_t  coeff_t;      // transform coefficient</div><div> #define MAX_NUM_DYN_REFINE          (NUM_CU_DEPTH * X265_REFINE_INTER_LEVELS)</div><div> #define X265_BYTE 8</div><div> </div><div>-#define MAX_MCTF_TEMPORAL_WINDOW_LENGTH 8</div><div>+#define MAX_MCSTF_TEMPORAL_WINDOW_LENGTH 8</div><div> </div><div> namespace X265_NS {</div><div> </div><div>diff --git a/source/common/frame.cpp b/source/common/frame.cpp</div><div>index 0ce301bfa..9de3495cb 100644</div><div>--- a/source/common/frame.cpp</div><div>+++ b/source/common/frame.cpp</div><div>@@ -80,7 +80,7 @@ bool Frame::create(x265_param *param, float* quantOffsets)</div><div>     m_fencPic = new PicYuv;</div><div>     m_param = param;</div><div> </div><div>-    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+    if (m_param->bEnableTemporalFilter)</div><div>     {</div><div>         m_mcstf = new TemporalFilter;</div><div>         m_mcstf->init(param);</div><div>@@ -251,7 +251,7 @@ void Frame::destroy()</div><div>         m_fencPic = NULL;</div><div>     }</div><div> </div><div>-    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+    if (m_param->bEnableTemporalFilter)</div><div>     {</div><div> </div><div>         if (m_fencPicSubsampled2)</div><div>diff --git a/source/common/param.cpp b/source/common/param.cpp</div><div>index 0bc9f7f74..262f401fa 100755</div><div>--- a/source/common/param.cpp</div><div>+++ b/source/common/param.cpp</div><div>@@ -380,8 +380,8 @@ 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>+    /* MCSTF */</div><div>+    param->bEnableTemporalFilter = 0;</div><div>     param->temporalFilterStrength = 0.95;</div><div> </div><div> #ifdef SVT_HEVC</div><div>@@ -1468,7 +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>+        OPT("mcstf") p->bEnableTemporalFilter = atobool(value);</div><div>         else</div><div>             return X265_PARAM_BAD_NAME;</div><div>     }</div><div>@@ -1921,10 +1921,10 @@ 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>+    if (param->bEnableTemporalFilter && (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>+        param->bEnableTemporalFilter = 0;</div><div>+        x265_log(param, X265_LOG_WARNING, "MCSTF can be enabled with frame thread = 1 only. Disabling MCSTF\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>@@ -2369,7 +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>+    BOOL(p->bEnableTemporalFilter, "mcstf");</div><div> #undef BOOL</div><div>     return buf;</div><div> }</div><div>@@ -2733,7 +2733,7 @@ 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>-    dst->bEnableGopBasedTemporalFilter = src->bEnableGopBasedTemporalFilter;</div><div>+    dst->bEnableTemporalFilter = src->bEnableTemporalFilter;</div><div>     dst->temporalFilterStrength = src->temporalFilterStrength;</div><div>     dst->confWinRightOffset = src->confWinRightOffset;</div><div>     dst->confWinBottomOffset = src->confWinBottomOffset;</div><div>diff --git a/source/common/slice.h b/source/common/slice.h</div><div>index c5327c198..9b7cb0bed 100644</div><div>--- a/source/common/slice.h</div><div>+++ b/source/common/slice.h</div><div>@@ -363,7 +363,7 @@ public:</div><div>     int         m_iNumRPSInSPS;</div><div>     const x265_param *m_param;</div><div>     int         m_fieldNum;</div><div>-    Frame*      m_mcstfRefFrameList[2][MAX_MCTF_TEMPORAL_WINDOW_LENGTH];</div><div>+    Frame*      m_mcstfRefFrameList[2][MAX_MCSTF_TEMPORAL_WINDOW_LENGTH];</div><div> </div><div>     Slice()</div><div>     {</div><div>diff --git a/source/common/temporalfilter.cpp b/source/common/temporalfilter.cpp</div><div>index a937e2a67..f3e2dc73c 100644</div><div>--- a/source/common/temporalfilter.cpp</div><div>+++ b/source/common/temporalfilter.cpp</div><div>@@ -67,8 +67,8 @@ void OrigPicBuffer::setOrigPicList(Frame* inFrame, int frameCnt)</div><div> {</div><div>     Slice* slice = inFrame->m_encData->m_slice;</div><div>     uint8_t j = 0;</div><div>-    for (int iterPOC = (inFrame->m_poc - inFrame->m_mcstf->s_range);</div><div>-        iterPOC <= (inFrame->m_poc + inFrame->m_mcstf->s_range); iterPOC++)</div><div>+    for (int iterPOC = (inFrame->m_poc - inFrame->m_mcstf->m_range);</div><div>+        iterPOC <= (inFrame->m_poc + inFrame->m_mcstf->m_range); iterPOC++)</div><div>     {</div><div>         if (iterPOC != inFrame->m_poc)</div><div>         {</div><div>@@ -137,22 +137,19 @@ void OrigPicBuffer::addPictureToFreelist(Frame* inFrame)</div><div>     m_mcstfOrigPicFreeList.pushBack(*inFrame);</div><div> }</div><div> </div><div>-TemporalFilter::TemporalFilter() {</div><div>-    m_FrameSkip = 0;</div><div>+TemporalFilter::TemporalFilter()</div><div>+{</div><div>     m_sourceWidth = 0;</div><div>     m_sourceHeight = 0,</div><div>     m_QP = 0;</div><div>-    m_GOPSize = 0;</div><div>-    m_framesToBeEncoded = 0;</div><div>     m_sliceTypeConfig = 3;</div><div>     m_numRef = 0;</div><div> </div><div>-    s_range = 2;</div><div>-    s_chromaFactor = 0.55;</div><div>-    s_sigmaMultiplier = 9.0;</div><div>-    s_sigmaZeroPoint = 10.0;</div><div>-    s_motionVectorFactor = 16;</div><div>-    s_padding = 128;</div><div>+    m_range = 2;</div><div>+    m_chromaFactor = 0.55;</div><div>+    m_sigmaMultiplier = 9.0;</div><div>+    m_sigmaZeroPoint = 10.0;</div><div>+    m_motionVectorFactor = 16;</div><div> }</div><div> </div><div> void TemporalFilter::init(const x265_param* param)</div><div>@@ -169,7 +166,7 @@ void TemporalFilter::init(const x265_param* param)</div><div>     predPUYuv.create(FENC_STRIDE, X265_CSP_I400);</div><div> }</div><div> </div><div>-int TemporalFilter::createRefPicInfo(MCTFReferencePicInfo* refFrame, x265_param* param)</div><div>+int TemporalFilter::createRefPicInfo(TemporalFilterRefPicInfo* refFrame, x265_param* param)</div><div> {</div><div>     CHECKED_MALLOC_ZERO(refFrame->mvs, MV, sizeof(MV)* ((m_sourceWidth ) / 4) * ((m_sourceHeight ) / 4));</div><div>     refFrame->mvsStride = m_sourceWidth / 4;</div><div>@@ -211,8 +208,8 @@ int TemporalFilter::motionErrorLuma(</div><div>     int error = 0;// dx * 10 + dy * 10;</div><div>     if (((dx | dy) & 0xF) == 0)</div><div>     {</div><div>-        dx /= s_motionVectorFactor;</div><div>-        dy /= s_motionVectorFactor;</div><div>+        dx /= m_motionVectorFactor;</div><div>+        dy /= m_motionVectorFactor;</div><div> </div><div>         const pixel* bufferRowStart = buffOrigin + (y + dy) * buffStride + (x + dx);</div><div> #if 0</div><div>@@ -311,7 +308,7 @@ void TemporalFilter::applyMotion(MV *mvs, uint32_t mvsStride, PicYuv *input, Pic</div><div>         const pixel *pSrcImage = input->m_picOrg[c];</div><div>         pixel *pDstImage = output->m_picOrg[c];</div><div> </div><div>-        if (c == 0)</div><div>+        if (!c)</div><div>         {</div><div>             srcStride = (int)input->m_stride;</div><div>             dstStride = (int)output->m_stride;</div><div>@@ -397,7 +394,7 @@ void TemporalFilter::applyMotion(MV *mvs, uint32_t mvsStride, PicYuv *input, Pic</div><div> * Old Version: bilateralFilter</div><div> */</div><div> void TemporalFilter::bilateralFilter(Frame* frame,</div><div>-    MCTFReferencePicInfo* m_mctfRefList,</div><div>+    TemporalFilterRefPicInfo* m_mcstfRefList,</div><div>     double overallStrength)</div><div> {</div><div> </div><div>@@ -405,21 +402,21 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div> </div><div>     for (int i = 0; i < numRefs; i++)</div><div>     {</div><div>-        MCTFReferencePicInfo *ref = &m_mctfRefList[i];</div><div>-        applyMotion(m_mctfRefList[i].mvs, m_mctfRefList[i].mvsStride, m_mctfRefList[i].picBuffer, ref->compensatedPic);</div><div>+        TemporalFilterRefPicInfo *ref = &m_mcstfRefList[i];</div><div>+        applyMotion(m_mcstfRefList[i].mvs, m_mcstfRefList[i].mvsStride, m_mcstfRefList[i].picBuffer, ref->compensatedPic);</div><div>     }</div><div> </div><div>     int refStrengthRow = 2;</div><div>-    if (numRefs == s_range * 2)</div><div>+    if (numRefs == m_range * 2)</div><div>     {</div><div>         refStrengthRow = 0;</div><div>     }</div><div>-    else if (numRefs == s_range)</div><div>+    else if (numRefs == m_range)</div><div>     {</div><div>         refStrengthRow = 1;</div><div>     }</div><div> </div><div>-    const double lumaSigmaSq = (m_QP - s_sigmaZeroPoint) * (m_QP - s_sigmaZeroPoint) * s_sigmaMultiplier;</div><div>+    const double lumaSigmaSq = (m_QP - m_sigmaZeroPoint) * (m_QP - m_sigmaZeroPoint) * m_sigmaMultiplier;</div><div>     const double chromaSigmaSq = 30 * 30;</div><div> </div><div>     PicYuv* orgPic = frame->m_fencPic;</div><div>@@ -430,7 +427,7 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div>         pixel *srcPelRow = NULL;</div><div>         intptr_t srcStride, correctedPicsStride = 0;</div><div> </div><div>-        if (c == 0)</div><div>+        if (!c)</div><div>         {</div><div>             height = orgPic->m_picHeight;</div><div>             width = orgPic->m_picWidth;</div><div>@@ -449,12 +446,12 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div>         }</div><div> </div><div>         const double sigmaSq = (!c) ? lumaSigmaSq : chromaSigmaSq;</div><div>-        const double weightScaling = overallStrength * ((!c) ? 0.4 : s_chromaFactor);</div><div>+        const double weightScaling = overallStrength * ((!c) ? 0.4 : m_chromaFactor);</div><div> </div><div>         const pixel maxSampleValue = (1 << m_bitDepth) - 1;</div><div>         const double bitDepthDiffWeighting = 1024.0 / (maxSampleValue + 1);</div><div> </div><div>-        for (int y = 0; y < height; y++, srcPelRow += srcStride/*, dstPelRow += dstStride*/)</div><div>+        for (int y = 0; y < height; y++, srcPelRow += srcStride)</div><div>         {</div><div>             pixel *srcPel = srcPelRow;</div><div> </div><div>@@ -466,9 +463,9 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div> </div><div>                 for (int i = 0; i < numRefs; i++)</div><div>                 {</div><div>-                    MCTFReferencePicInfo *refPicInfo = &m_mctfRefList[i];</div><div>+                    TemporalFilterRefPicInfo *refPicInfo = &m_mcstfRefList[i];</div><div> </div><div>-                    if (c == 0)</div><div>+                    if (!c)</div><div>                         correctedPicsStride = refPicInfo->compensatedPic->m_stride;</div><div>                     else</div><div>                         correctedPicsStride = refPicInfo->compensatedPic->m_strideC;</div><div>@@ -488,7 +485,6 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div>                 newVal /= temporalWeightSum;</div><div>                 pixel sampleVal = (pixel)round(newVal);</div><div>                 sampleVal = (sampleVal < 0 ? 0 : (sampleVal > maxSampleValue ? maxSampleValue : sampleVal));</div><div>-                //*dstPel = sampleVal;</div><div>                 *srcPel = sampleVal;</div><div>             }</div><div>         }</div><div>@@ -501,7 +497,7 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div> * New Version: bilateralFilter</div><div> */</div><div> void TemporalFilter::bilateralFilter(Frame* frame,</div><div>-    MCTFReferencePicInfo* m_mctfRefList,</div><div>+    TemporalFilterRefPicInfo* m_mcstfRefList,</div><div>     double overallStrength)</div><div> {</div><div> </div><div>@@ -509,21 +505,21 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div> </div><div>     for (int i = 0; i < numRefs; i++)</div><div>     {</div><div>-        MCTFReferencePicInfo *ref = &m_mctfRefList[i];</div><div>-        applyMotion(m_mctfRefList[i].mvs, m_mctfRefList[i].mvsStride, m_mctfRefList[i].picBuffer, ref->compensatedPic);</div><div>+        TemporalFilterRefPicInfo *ref = &m_mcstfRefList[i];</div><div>+        applyMotion(m_mcstfRefList[i].mvs, m_mcstfRefList[i].mvsStride, m_mcstfRefList[i].picBuffer, ref->compensatedPic);</div><div>     }</div><div> </div><div>     int refStrengthRow = 2;</div><div>-    if (numRefs == s_range * 2)</div><div>+    if (numRefs == m_range * 2)</div><div>     {</div><div>         refStrengthRow = 0;</div><div>     }</div><div>-    else if (numRefs == s_range)</div><div>+    else if (numRefs == m_range)</div><div>     {</div><div>         refStrengthRow = 1;</div><div>     }</div><div> </div><div>-    const double lumaSigmaSq = (m_QP - s_sigmaZeroPoint) * (m_QP - s_sigmaZeroPoint) * s_sigmaMultiplier;</div><div>+    const double lumaSigmaSq = (m_QP - m_sigmaZeroPoint) * (m_QP - m_sigmaZeroPoint) * m_sigmaMultiplier;</div><div>     const double chromaSigmaSq = 30 * 30;</div><div> </div><div>     PicYuv* orgPic = frame->m_fencPic;</div><div>@@ -534,7 +530,7 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div>         pixel *srcPelRow = NULL;</div><div>         intptr_t srcStride, correctedPicsStride = 0;</div><div> </div><div>-        if (c == 0)</div><div>+        if (!c)</div><div>         {</div><div>             height = orgPic->m_picHeight;</div><div>             width = orgPic->m_picWidth;</div><div>@@ -553,7 +549,7 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div>         }</div><div> </div><div>         const double sigmaSq = (!c)  ? lumaSigmaSq : chromaSigmaSq;</div><div>-        const double weightScaling = overallStrength * ( (!c) ? 0.4 : s_chromaFactor);</div><div>+        const double weightScaling = overallStrength * ( (!c) ? 0.4 : m_chromaFactor);</div><div> </div><div>         const pixel maxSampleValue = (1 << m_bitDepth) - 1;</div><div>         const double bitDepthDiffWeighting = 1024.0 / (maxSampleValue + 1);</div><div>@@ -574,7 +570,7 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div>                 {</div><div>                     for (int i = 0; i < numRefs; i++)</div><div>                     {</div><div>-                        MCTFReferencePicInfo *refPicInfo = &m_mctfRefList[i];</div><div>+                        TemporalFilterRefPicInfo *refPicInfo = &m_mcstfRefList[i];</div><div> </div><div>                         if (!c)</div><div>                             correctedPicsStride = refPicInfo->compensatedPic->m_stride;</div><div>@@ -611,13 +607,13 @@ void TemporalFilter::bilateralFilter(Frame* frame,</div><div>                 double minError = 9999999;</div><div>                 for (int i = 0; i < numRefs; i++)</div><div>                 {</div><div>-                    MCTFReferencePicInfo *refPicInfo = &m_mctfRefList[i];</div><div>+                    TemporalFilterRefPicInfo *refPicInfo = &m_mcstfRefList[i];</div><div>                     minError = X265_MIN(minError, (double)refPicInfo->error[(y / blkSize) * refPicInfo->mvsStride + (x / blkSize)]);</div><div>                 }</div><div> </div><div>                 for (int i = 0; i < numRefs; i++)</div><div>                 {</div><div>-                    MCTFReferencePicInfo *refPicInfo = &m_mctfRefList[i];</div><div>+                    TemporalFilterRefPicInfo *refPicInfo = &m_mcstfRefList[i];</div><div> </div><div>                     const int error = refPicInfo->error[(y / blkSize) * refPicInfo->mvsStride + (x / blkSize)];</div><div>                     const int noise = refPicInfo->noise[(y / blkSize) * refPicInfo->mvsStride + (x / blkSize)];</div><div>@@ -826,14 +822,14 @@ void TemporalFilter::motionEstimationLuma(MV *mvs, uint32_t mvStride, PicYuv *or</div><div>             }</div><div> </div><div>             MV prevBest = best;</div><div>-            for (int y2 = prevBest.y / s_motionVectorFactor - range; y2 <= prevBest.y / s_motionVectorFactor + range; y2++)</div><div>+            for (int y2 = prevBest.y / m_motionVectorFactor - range; y2 <= prevBest.y / m_motionVectorFactor + range; y2++)</div><div>             {</div><div>-                for (int x2 = prevBest.x / s_motionVectorFactor - range; x2 <= prevBest.x / s_motionVectorFactor + range; x2++)</div><div>+                for (int x2 = prevBest.x / m_motionVectorFactor - range; x2 <= prevBest.x / m_motionVectorFactor + range; x2++)</div><div>                 {</div><div>-                    int error = motionErrorLuma(orig, buffer, blockX, blockY, x2 * s_motionVectorFactor, y2 * s_motionVectorFactor, blockSize, leastError);</div><div>+                    int error = motionErrorLuma(orig, buffer, blockX, blockY, x2 * m_motionVectorFactor, y2 * m_motionVectorFactor, blockSize, leastError);</div><div>                     if (error < leastError)</div><div>                     {</div><div>-                        best.set(x2 * s_motionVectorFactor, y2 * s_motionVectorFactor);</div><div>+                        best.set(x2 * m_motionVectorFactor, y2 * m_motionVectorFactor);</div><div>                         leastError = error;</div><div>                     }</div><div>                 }</div><div>@@ -958,14 +954,14 @@ void TemporalFilter::motionEstimationLumaDoubleRes(MV *mvs, uint32_t mvStride, P</div><div>             }</div><div> </div><div>             MV prevBest = best;</div><div>-            for (int y2 = prevBest.y / s_motionVectorFactor - range; y2 <= prevBest.y / s_motionVectorFactor + range; y2++)</div><div>+            for (int y2 = prevBest.y / m_motionVectorFactor - range; y2 <= prevBest.y / m_motionVectorFactor + range; y2++)</div><div>             {</div><div>-                for (int x2 = prevBest.x / s_motionVectorFactor - range; x2 <= prevBest.x / s_motionVectorFactor + range; x2++)</div><div>+                for (int x2 = prevBest.x / m_motionVectorFactor - range; x2 <= prevBest.x / m_motionVectorFactor + range; x2++)</div><div>                 {</div><div>-                    int error = motionErrorLuma(orig, buffer, blockX, blockY, x2 * s_motionVectorFactor, y2 * s_motionVectorFactor, blockSize, leastError);</div><div>+                    int error = motionErrorLuma(orig, buffer, blockX, blockY, x2 * m_motionVectorFactor, y2 * m_motionVectorFactor, blockSize, leastError);</div><div>                     if (error < leastError)</div><div>                     {</div><div>-                        best.set(x2 * s_motionVectorFactor, y2 * s_motionVectorFactor);</div><div>+                        best.set(x2 * m_motionVectorFactor, y2 * m_motionVectorFactor);</div><div>                         leastError = error;</div><div>                     }</div><div>                 }</div><div>@@ -1087,7 +1083,7 @@ void TemporalFilter::subsampleLuma(PicYuv *input, PicYuv *output, int factor)</div><div>     extendPicBorder(output->m_picOrg[0], output->m_stride, output->m_picWidth, output->m_picHeight, output->m_lumaMarginX, output->m_lumaMarginY);</div><div> }</div><div> </div><div>-void TemporalFilter::destroyRefPicInfo(MCTFReferencePicInfo* curFrame)</div><div>+void TemporalFilter::destroyRefPicInfo(TemporalFilterRefPicInfo* curFrame)</div><div> {</div><div>     if (curFrame)</div><div>     {</div><div>diff --git a/source/common/temporalfilter.h b/source/common/temporalfilter.h</div><div>index 801359914..bdefa2824 100644</div><div>--- a/source/common/temporalfilter.h</div><div>+++ b/source/common/temporalfilter.h</div><div>@@ -1,6 +1,8 @@</div><div> /*****************************************************************************</div><div> * Copyright (C) 2013-2021 MulticoreWare, Inc</div><div> *</div><div>+ * Authors: Ashok Kumar Mishra <<a href="mailto:ashok@multicorewareinc.com">ashok@multicorewareinc.com</a>></div><div>+ *</div><div> * This program is free software; you can redistribute it and/or modify</div><div> * it under the terms of the GNU General Public License as published by</div><div> * the Free Software Foundation; either version 2 of the License, or</div><div>@@ -88,13 +90,6 @@ public:</div><div>     void addEncPictureToPicList(Frame*);</div><div> };</div><div> </div><div>-struct TemporalFilterRefPicInfo</div><div>-{</div><div>-    PicYuv*    picBuffer;</div><div>-    MV*        mvs;</div><div>-    int        origOffset;</div><div>-};</div><div>-</div><div> struct MotionEstimatorTLD</div><div> {</div><div>     MotionEstimate  me;</div><div>@@ -108,7 +103,7 @@ struct MotionEstimatorTLD</div><div>     ~MotionEstimatorTLD() {}</div><div> };</div><div> </div><div>-struct MCTFReferencePicInfo</div><div>+struct TemporalFilterRefPicInfo</div><div> {</div><div>     PicYuv*    picBuffer;</div><div>     PicYuv*    picBufferSubSampled2;</div><div>@@ -145,25 +140,20 @@ public:</div><div>     // Private static member variables</div><div>     const x265_param *m_param;</div><div>     int32_t  m_bitDepth;</div><div>-    int s_range;</div><div>+    int m_range;</div><div>     uint8_t m_numRef;</div><div>-    double s_chromaFactor;</div><div>-    double s_sigmaMultiplier;</div><div>-    double s_sigmaZeroPoint;</div><div>-    int s_motionVectorFactor;</div><div>-    int s_padding;</div><div>+    double m_chromaFactor;</div><div>+    double m_sigmaMultiplier;</div><div>+    double m_sigmaZeroPoint;</div><div>+    int m_motionVectorFactor;</div><div>+    int m_padding;</div><div> </div><div>     // Private member variables</div><div>-    int m_FrameSkip;</div><div>+</div><div>     int m_sourceWidth;</div><div>     int m_sourceHeight;</div><div>     int m_QP;</div><div>-    int m_GOPSize;</div><div> </div><div>-    int m_aiPad[2];</div><div>-    int m_framesToBeEncoded;</div><div>-    bool m_bClipInputVideoToRec709Range;</div><div>-    bool m_gopBasedTemporalFilterFutureReference;</div><div>     int m_internalCsp;</div><div>     int m_numComponents;</div><div>     uint8_t m_sliceTypeConfig;</div><div>@@ -173,14 +163,14 @@ public:</div><div> </div><div>     void subsampleLuma(PicYuv *input, PicYuv *output, int factor = 2);</div><div> </div><div>-    int createRefPicInfo(MCTFReferencePicInfo* refFrame, x265_param* param);</div><div>+    int createRefPicInfo(TemporalFilterRefPicInfo* refFrame, x265_param* param);</div><div> </div><div>-    void bilateralFilter(Frame* frame, MCTFReferencePicInfo* mctfRefList, double overallStrength);</div><div>+    void bilateralFilter(Frame* frame, TemporalFilterRefPicInfo* mctfRefList, double overallStrength);</div><div> </div><div>     void motionEstimationLuma(MV *mvs, uint32_t mvStride, PicYuv *orig, PicYuv *buffer, int bs,</div><div>         MV *previous = 0, uint32_t prevmvStride = 0, int factor = 1);</div><div> </div><div>-    void TemporalFilter::motionEstimationLumaDoubleRes(MV *mvs, uint32_t mvStride, PicYuv *orig, PicYuv *buffer, int blockSize,</div><div>+    void motionEstimationLumaDoubleRes(MV *mvs, uint32_t mvStride, PicYuv *orig, PicYuv *buffer, int blockSize,</div><div>         MV *previous, uint32_t prevMvStride, int factor, int* minError);</div><div> </div><div>     int motionErrorLuma(PicYuv *orig,</div><div>@@ -192,7 +182,7 @@ public:</div><div>         int bs,</div><div>         int besterror = 8 * 8 * 1024 * 1024);</div><div> </div><div>-    void destroyRefPicInfo(MCTFReferencePicInfo* curFrame);</div><div>+    void destroyRefPicInfo(TemporalFilterRefPicInfo* curFrame);</div><div> </div><div>     void applyMotion(MV *mvs, uint32_t mvsStride, PicYuv *input, PicYuv *output);</div><div> </div><div>diff --git a/source/encoder/dpb.cpp b/source/encoder/dpb.cpp</div><div>index 2fdcd6a92..9292b6c75 100644</div><div>--- a/source/encoder/dpb.cpp</div><div>+++ b/source/encoder/dpb.cpp</div><div>@@ -72,14 +72,14 @@ void DPB::recycleUnreferenced()</div><div>         iterFrame = iterFrame->m_next;</div><div>         bool isMCSTFReferenced = false;</div><div> </div><div>-        if (curFrame->m_param->bEnableGopBasedTemporalFilter)</div><div>+        if (curFrame->m_param->bEnableTemporalFilter)</div><div>             isMCSTFReferenced = curFrame->m_refPicCnt[1];</div><div> </div><div>         if (!curFrame->m_encData->m_bHasReferences && !curFrame->m_countRefEncoders && !isMCSTFReferenced)</div><div>         {</div><div>             curFrame->m_bChromaExtended = false;</div><div> </div><div>-            if (curFrame->m_param->bEnableGopBasedTemporalFilter)</div><div>+            if (curFrame->m_param->bEnableTemporalFilter)</div><div>                 *curFrame->m_isSubSampled = false;</div><div> </div><div>             // Reset column counter</div><div>diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp</div><div>index 53094cdf1..47a9913bc 100644</div><div>--- a/source/encoder/encoder.cpp</div><div>+++ b/source/encoder/encoder.cpp</div><div>@@ -393,7 +393,7 @@ void Encoder::create()</div><div>     m_lookahead->m_numPools = pools;</div><div>     m_dpb = new DPB(m_param);</div><div> </div><div>-    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+    if (m_param->bEnableTemporalFilter)</div><div>         m_origPicBuffer = new OrigPicBuffer();</div><div> </div><div>     m_rateControl = new RateControl(*m_param, this);</div><div>@@ -973,7 +973,7 @@ void Encoder::destroy()</div><div>         delete[] zoneWriteCount;</div><div>     }</div><div> </div><div>-    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+    if (m_param->bEnableTemporalFilter)</div><div>         delete m_origPicBuffer;</div><div> </div><div>     if (m_rateControl)</div><div>@@ -1647,7 +1647,7 @@ bool Encoder::isFilterThisframe(uint8_t sliceTypeConfig, int curSliceType)</div><div> </div><div> inline int enqueueRefFrame(FrameEncoder* curframeEncoder, Frame* iterFrame, Frame* curFrame, bool isPreFiltered, int16_t i)</div><div> {</div><div>-    MCTFReferencePicInfo* dest = &curframeEncoder->m_mcstfRefList[curFrame->m_mcstf->m_numRef];</div><div>+    TemporalFilterRefPicInfo* dest = &curframeEncoder->m_mcstfRefList[curFrame->m_mcstf->m_numRef];</div><div>     dest->picBuffer = iterFrame->m_fencPic;</div><div>     dest->picBufferSubSampled2 = iterFrame->m_fencPicSubsampled2;</div><div>     dest->picBufferSubSampled4 = iterFrame->m_fencPicSubsampled4;</div><div>@@ -1659,12 +1659,12 @@ inline int enqueueRefFrame(FrameEncoder* curframeEncoder, Frame* iterFrame, Fram</div><div>     return 1;</div><div> }</div><div> </div><div>-bool Encoder::generateMctfRef(Frame* frameEnc, FrameEncoder* currEncoder)</div><div>+bool Encoder::generateMcstfRef(Frame* frameEnc, FrameEncoder* currEncoder)</div><div> {</div><div>     frameEnc->m_mcstf->m_numRef = 0;</div><div> </div><div>-    for (int iterPOC = (frameEnc->m_poc - frameEnc->m_mcstf->s_range);</div><div>-        iterPOC <= (frameEnc->m_poc + frameEnc->m_mcstf->s_range); iterPOC++)</div><div>+    for (int iterPOC = (frameEnc->m_poc - frameEnc->m_mcstf->m_range);</div><div>+        iterPOC <= (frameEnc->m_poc + frameEnc->m_mcstf->m_range); iterPOC++)</div><div>     {</div><div>         bool isFound = false;</div><div>         if (iterPOC != frameEnc->m_poc)</div><div>@@ -1672,24 +1672,24 @@ bool Encoder::generateMctfRef(Frame* frameEnc, FrameEncoder* currEncoder)</div><div>             //search for the reference frame in the Original Picture Buffer</div><div>             if (!isFound)</div><div>             {</div><div>-                for (int j = 0; j < (2 * frameEnc->m_mcstf->s_range); j++)</div><div>+                for (int j = 0; j < (2 * frameEnc->m_mcstf->m_range); j++)</div><div>                 {</div><div>                     if (iterPOC < 0)</div><div>                         continue;</div><div>                     if (iterPOC >= m_pocLast)</div><div>                     {</div><div> </div><div>-                        TemporalFilter* mctf = frameEnc->m_mcstf;</div><div>-                        while (mctf->m_numRef)</div><div>+                        TemporalFilter* mcstf = frameEnc->m_mcstf;</div><div>+                        while (mcstf->m_numRef)</div><div>                         {</div><div>-                            memset(currEncoder->m_mcstfRefList[mctf->m_numRef].mvs0,  0, sizeof(MV) * ((mctf->m_sourceWidth / 16) * (mctf->m_sourceHeight / 16)));</div><div>-                            memset(currEncoder->m_mcstfRefList[mctf->m_numRef].mvs1,  0, sizeof(MV) * ((mctf->m_sourceWidth / 16) * (mctf->m_sourceHeight / 16)));</div><div>-                            memset(currEncoder->m_mcstfRefList[mctf->m_numRef].mvs2,  0, sizeof(MV) * ((mctf->m_sourceWidth / 16) * (mctf->m_sourceHeight / 16)));</div><div>-                            memset(currEncoder->m_mcstfRefList[mctf->m_numRef].mvs,   0, sizeof(MV) * ((mctf->m_sourceWidth /  4) * (mctf->m_sourceHeight /  4)));</div><div>-                            memset(currEncoder->m_mcstfRefList[mctf->m_numRef].noise, 0, sizeof(int) * ((mctf->m_sourceWidth / 4) * (mctf->m_sourceHeight / 4)));</div><div>-                            memset(currEncoder->m_mcstfRefList[mctf->m_numRef].error, 0, sizeof(int) * ((mctf->m_sourceWidth / 4) * (mctf->m_sourceHeight / 4)));</div><div>-</div><div>-                            mctf->m_numRef--;</div><div>+                            memset(currEncoder->m_mcstfRefList[mcstf->m_numRef].mvs0,  0, sizeof(MV) * ((mcstf->m_sourceWidth / 16) * (mcstf->m_sourceHeight / 16)));</div><div>+                            memset(currEncoder->m_mcstfRefList[mcstf->m_numRef].mvs1,  0, sizeof(MV) * ((mcstf->m_sourceWidth / 16) * (mcstf->m_sourceHeight / 16)));</div><div>+                            memset(currEncoder->m_mcstfRefList[mcstf->m_numRef].mvs2,  0, sizeof(MV) * ((mcstf->m_sourceWidth / 16) * (mcstf->m_sourceHeight / 16)));</div><div>+                            memset(currEncoder->m_mcstfRefList[mcstf->m_numRef].mvs,   0, sizeof(MV) * ((mcstf->m_sourceWidth /  4) * (mcstf->m_sourceHeight /  4)));</div><div>+                            memset(currEncoder->m_mcstfRefList[mcstf->m_numRef].noise, 0, sizeof(int) * ((mcstf->m_sourceWidth / 4) * (mcstf->m_sourceHeight / 4)));</div><div>+                            memset(currEncoder->m_mcstfRefList[mcstf->m_numRef].error, 0, sizeof(int) * ((mcstf->m_sourceWidth / 4) * (mcstf->m_sourceHeight / 4)));</div><div>+</div><div>+                            mcstf->m_numRef--;</div><div>                         }</div><div> </div><div>                         break;</div><div>@@ -1752,7 +1752,7 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>         m_exportedPic = NULL;</div><div>         m_dpb->recycleUnreferenced();</div><div> </div><div>-        if (m_param->bEnableGopBasedTemporalFilter)</div><div>+        if (m_param->bEnableTemporalFilter)</div><div>             m_origPicBuffer->recycleOrigPicList();</div><div>     }</div><div> </div><div>@@ -2125,12 +2125,12 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>         if (m_reconfigureRc)</div><div>             inFrame->m_reconfigureRc = true;</div><div> </div><div>-        if (m_param->bEnableGopBasedTemporalFilter)</div><div>+        if (m_param->bEnableTemporalFilter)</div><div>         {</div><div>             if (!m_pocLast)</div><div>             {</div><div>                 /*One shot allocation of frames in OriginalPictureBuffer*/</div><div>-                int numFramesinOPB = X265_MAX(m_param->bframes, (inFrame->m_mcstf->s_range << 1)) + 1;</div><div>+                int numFramesinOPB = X265_MAX(m_param->bframes, (inFrame->m_mcstf->m_range << 1)) + 1;</div><div>                 for (int i = 0; i < numFramesinOPB; i++)</div><div>                 {</div><div>                     Frame* dupFrame = new Frame;</div><div>@@ -2162,11 +2162,11 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>                 }</div><div>             }</div><div> </div><div>-            inFrame->m_refPicCnt[1] = 2 * inFrame->m_mcstf->s_range + 1;</div><div>-            if (inFrame->m_poc < inFrame->m_mcstf->s_range)</div><div>-                inFrame->m_refPicCnt[1] -= (uint8_t)(inFrame->m_mcstf->s_range - inFrame->m_poc);</div><div>-            if (m_param->totalFrames && (inFrame->m_poc >= (m_param->totalFrames - inFrame->m_mcstf->s_range)))</div><div>-                inFrame->m_refPicCnt[1] -= (uint8_t)(inFrame->m_poc + inFrame->m_mcstf->s_range - m_param->totalFrames + 1);</div><div>+            inFrame->m_refPicCnt[1] = 2 * inFrame->m_mcstf->m_range + 1;</div><div>+            if (inFrame->m_poc < inFrame->m_mcstf->m_range)</div><div>+                inFrame->m_refPicCnt[1] -= (uint8_t)(inFrame->m_mcstf->m_range - inFrame->m_poc);</div><div>+            if (m_param->totalFrames && (inFrame->m_poc >= (m_param->totalFrames - inFrame->m_mcstf->m_range)))</div><div>+                inFrame->m_refPicCnt[1] -= (uint8_t)(inFrame->m_poc + inFrame->m_mcstf->m_range - m_param->totalFrames + 1);</div><div> </div><div>             //Extend full-res original picture border</div><div>             PicYuv *orig = inFrame->m_fencPic;</div><div>@@ -2420,14 +2420,14 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>                 outFrame->m_rcData->currentSatd = curEncoder->m_rce.coeffBits;</div><div>             }</div><div> </div><div>-            if (m_param->bEnableGopBasedTemporalFilter)</div><div>+            if (m_param->bEnableTemporalFilter)</div><div>             {</div><div>                 Frame *curFrame = m_origPicBuffer->m_mcstfPicList.getPOCMCSTF(outFrame->m_poc);</div><div>-                X265_CHECK(curFrame, "Outframe not found in DPB's mctfPicList");</div><div>+                X265_CHECK(curFrame, "Outframe not found in DPB's mcstfPicList");</div><div>                 curFrame->m_refPicCnt[0]--;</div><div>                 curFrame->m_refPicCnt[1]--;</div><div>                 curFrame = m_origPicBuffer->m_mcstfOrigPicList.getPOCMCSTF(outFrame->m_poc);</div><div>-                X265_CHECK(curFrame, "Outframe not found in OPB's mctfOrigPicList");</div><div>+                X265_CHECK(curFrame, "Outframe not found in OPB's mcstfOrigPicList");</div><div>                 curFrame->m_refPicCnt[1]--;</div><div>             }</div><div> </div><div>@@ -2436,7 +2436,7 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>             {</div><div>                 ATOMIC_DEC(&outFrame->m_countRefEncoders);</div><div>                 m_dpb->recycleUnreferenced();</div><div>-                if (m_param->bEnableGopBasedTemporalFilter)</div><div>+                if (m_param->bEnableTemporalFilter)</div><div>                     m_origPicBuffer->recycleOrigPicList();</div><div>             }</div><div>             else</div><div>@@ -2640,7 +2640,7 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>             /* determine references, setup RPS, etc */</div><div>             m_dpb->prepareEncode(frameEnc);</div><div> </div><div>-            if (m_param->bEnableGopBasedTemporalFilter)</div><div>+            if (m_param->bEnableTemporalFilter)</div><div>             {</div><div>                 X265_CHECK(!m_origPicBuffer->m_mcstfOrigPicFreeList.empty(), "Frames not available in Encoded OPB");</div><div> </div><div>@@ -2648,12 +2648,12 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>                 dupFrame->m_fencPic->copyFromFrame(frameEnc->m_fencPic);</div><div>                 dupFrame->m_poc = frameEnc->m_poc;</div><div>                 dupFrame->m_encodeOrder = frameEnc->m_encodeOrder;</div><div>-                dupFrame->m_refPicCnt[1] = 2 * dupFrame->m_mcstf->s_range + 1;</div><div>+                dupFrame->m_refPicCnt[1] = 2 * dupFrame->m_mcstf->m_range + 1;</div><div> </div><div>-                if (dupFrame->m_poc < dupFrame->m_mcstf->s_range)</div><div>-                    dupFrame->m_refPicCnt[1] -= (uint8_t)(dupFrame->m_mcstf->s_range - dupFrame->m_poc);</div><div>-                if (m_param->totalFrames && (dupFrame->m_poc >= (m_param->totalFrames - dupFrame->m_mcstf->s_range)))</div><div>-                    dupFrame->m_refPicCnt[1] -= (uint8_t)(dupFrame->m_poc + dupFrame->m_mcstf->s_range - m_param->totalFrames + 1);</div><div>+                if (dupFrame->m_poc < dupFrame->m_mcstf->m_range)</div><div>+                    dupFrame->m_refPicCnt[1] -= (uint8_t)(dupFrame->m_mcstf->m_range - dupFrame->m_poc);</div><div>+                if (m_param->totalFrames && (dupFrame->m_poc >= (m_param->totalFrames - dupFrame->m_mcstf->m_range)))</div><div>+                    dupFrame->m_refPicCnt[1] -= (uint8_t)(dupFrame->m_poc + dupFrame->m_mcstf->m_range - m_param->totalFrames + 1);</div><div> </div><div>                 m_origPicBuffer->addEncPictureToPicList(dupFrame);</div><div>                 m_origPicBuffer->setOrigPicList(frameEnc, m_pocLast);</div><div>@@ -2688,14 +2688,14 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>             if (m_param->bIntraRefresh)</div><div>                  calcRefreshInterval(frameEnc);</div><div> </div><div>-            // Generate MCTF References and perform HME</div><div>-            if (m_param->bEnableGopBasedTemporalFilter && isFilterThisframe(frameEnc->m_mcstf->m_sliceTypeConfig, frameEnc->m_lowres.sliceType))</div><div>+            // Generate MCSTF References and perform HME</div><div>+            if (m_param->bEnableTemporalFilter && isFilterThisframe(frameEnc->m_mcstf->m_sliceTypeConfig, frameEnc->m_lowres.sliceType))</div><div>             {</div><div> </div><div>-                if (!generateMctfRef(frameEnc, curEncoder))</div><div>+                if (!generateMcstfRef(frameEnc, curEncoder))</div><div>                 {</div><div>                     m_aborted = true;</div><div>-                    x265_log(m_param, X265_LOG_ERROR, "Failed to initialize MCTFReferencePicInfo at POC %d\n", frameEnc->m_poc);</div><div>+                    x265_log(m_param, X265_LOG_ERROR, "Failed to initialize MCSTFReferencePicInfo at POC %d\n", frameEnc->m_poc);</div><div>                     fflush(stderr);</div><div>                     return -1;</div><div>                 }</div><div>@@ -2710,7 +2710,7 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div> </div><div>                 for (uint8_t i = 1; i <= frameEnc->m_mcstf->m_numRef; i++)</div><div>                 {</div><div>-                    MCTFReferencePicInfo *ref = &curEncoder->m_mcstfRefList[i - 1];</div><div>+                    TemporalFilterRefPicInfo *ref = &curEncoder->m_mcstfRefList[i - 1];</div><div>                     if (!*ref->isSubsampled)</div><div>                     {</div><div>                         curEncoder->m_frameEncTF->subsampleLuma(ref->picBuffer, ref->picBufferSubSampled2);</div><div>@@ -2721,7 +2721,7 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div> </div><div>                 for (uint8_t i = 1; i <= frameEnc->m_mcstf->m_numRef; i++)</div><div>                 {</div><div>-                    MCTFReferencePicInfo *ref = &curEncoder->m_mcstfRefList[i - 1];</div><div>+                    TemporalFilterRefPicInfo *ref = &curEncoder->m_mcstfRefList[i - 1];</div><div> </div><div>                     curEncoder->m_frameEncTF->motionEstimationLuma(ref->mvs0, ref->mvsStride0, frameEnc->m_fencPicSubsampled4, ref->picBufferSubSampled4, 16);</div><div>                     curEncoder->m_frameEncTF->motionEstimationLuma(ref->mvs1, ref->mvsStride1, frameEnc->m_fencPicSubsampled2, ref->picBufferSubSampled2, 16, ref->mvs0, ref->mvsStride0, 2);</div><div>@@ -2731,7 +2731,7 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div> </div><div>                 for (int i = 0; i < frameEnc->m_mcstf->m_numRef; i++)</div><div>                 {</div><div>-                    MCTFReferencePicInfo *ref = &curEncoder->m_mcstfRefList[i];</div><div>+                    TemporalFilterRefPicInfo *ref = &curEncoder->m_mcstfRefList[i];</div><div>                     ref->slicetype = m_lookahead->FindSliceType(frameEnc->m_poc + ref->origOffset);</div><div>                     Frame* dpbframePtr = m_dpb->m_picList.getPOC(frameEnc->m_poc + ref->origOffset);</div><div>                     if (dpbframePtr != NULL)</div><div>diff --git a/source/encoder/encoder.h b/source/encoder/encoder.h</div><div>index 41f2ed463..669154da3 100644</div><div>--- a/source/encoder/encoder.h</div><div>+++ b/source/encoder/encoder.h</div><div>@@ -396,7 +396,7 @@ public:</div><div>     void configureVideoSignalTypePreset(x265_param* p);</div><div> </div><div>     bool isFilterThisframe(uint8_t sliceTypeConfig, int curSliceType);</div><div>-    bool generateMctfRef(Frame* frameEnc, FrameEncoder* currEncoder);</div><div>+    bool generateMcstfRef(Frame* frameEnc, FrameEncoder* currEncoder);</div><div> </div><div> protected:</div><div> </div><div>diff --git a/source/encoder/frameencoder.cpp b/source/encoder/frameencoder.cpp</div><div>index ec78fc9f2..6f567b9cf 100644</div><div>--- a/source/encoder/frameencoder.cpp</div><div>+++ b/source/encoder/frameencoder.cpp</div><div>@@ -103,11 +103,11 @@ void FrameEncoder::destroy()</div><div>         delete m_rce.hrdTiming;</div><div>     }</div><div> </div><div>-    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+    if (m_param->bEnableTemporalFilter)</div><div>     {</div><div>         delete m_frameEncTF->m_metld;</div><div> </div><div>-        for (int i = 0; i < (m_frameEncTF->s_range << 1); i++)</div><div>+        for (int i = 0; i < (m_frameEncTF->m_range << 1); i++)</div><div>             m_frameEncTF->destroyRefPicInfo(&m_mcstfRefList[i]);</div><div> </div><div>         delete m_frameEncTF;</div><div>@@ -206,13 +206,13 @@ bool FrameEncoder::init(Encoder *top, int numRows, int numCols)</div><div>         m_sliceAddrBits = (uint16_t)(tmp + 1);</div><div>     }</div><div> </div><div>-    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+    if (m_param->bEnableTemporalFilter)</div><div>     {</div><div>         m_frameEncTF = new TemporalFilter();</div><div>         if (m_frameEncTF)</div><div>             m_frameEncTF->init(m_param);</div><div> </div><div>-        for (int i = 0; i < (m_frameEncTF->s_range << 1); i++)</div><div>+        for (int i = 0; i < (m_frameEncTF->m_range << 1); i++)</div><div>             ok &= !!m_frameEncTF->createRefPicInfo(&m_mcstfRefList[i], m_param);</div><div>     }</div><div> </div><div>@@ -600,11 +600,10 @@ void FrameEncoder::compressFrame()</div><div>     int qp = m_top->m_rateControl->rateControlStart(m_frame, &m_rce, m_top);</div><div>     m_rce.newQp = qp;</div><div> </div><div>-    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+    if (m_param->bEnableTemporalFilter)</div><div>     {</div><div>         m_frameEncTF->m_QP = qp;</div><div>-        double overallStrength = 0.95;</div><div>-        m_frameEncTF->bilateralFilter(m_frame, m_mcstfRefList, overallStrength);</div><div>+        m_frameEncTF->bilateralFilter(m_frame, m_mcstfRefList, m_param->temporalFilterStrength);</div><div>     }</div><div> </div><div>     if (m_nr)</div><div>@@ -974,10 +973,10 @@ void FrameEncoder::compressFrame()</div><div>     if (m_param->bDynamicRefine && m_top->m_startPoint <= m_frame->m_encodeOrder) //Avoid collecting data that will not be used by future frames.</div><div>         collectDynDataFrame();</div><div> </div><div>-    if (m_param->bEnableGopBasedTemporalFilter && m_top->isFilterThisframe(m_frame->m_mcstf->m_sliceTypeConfig, m_frame->m_lowres.sliceType))</div><div>+    if (m_param->bEnableTemporalFilter && m_top->isFilterThisframe(m_frame->m_mcstf->m_sliceTypeConfig, m_frame->m_lowres.sliceType))</div><div>     {</div><div>-        //Reset the MCTF context in Frame Encoder and Frame</div><div>-        for (int i = 0; i < (m_frameEncTF->s_range << 1); i++)</div><div>+        //Reset the MCSTF context in Frame Encoder and Frame</div><div>+        for (int i = 0; i < (m_frameEncTF->m_range << 1); i++)</div><div>         {</div><div>             memset(m_mcstfRefList[i].mvs0, 0, sizeof(MV) * ((m_param->sourceWidth / 16) * (m_param->sourceHeight / 16)));</div><div>             memset(m_mcstfRefList[i].mvs1, 0, sizeof(MV) * ((m_param->sourceWidth / 16) * (m_param->sourceHeight / 16)));</div><div>diff --git a/source/encoder/frameencoder.h b/source/encoder/frameencoder.h</div><div>index 267e9033a..9c5810883 100644</div><div>--- a/source/encoder/frameencoder.h</div><div>+++ b/source/encoder/frameencoder.h</div><div>@@ -236,7 +236,7 @@ public:</div><div> </div><div>     // initialization for mcstf</div><div>     TemporalFilter*          m_frameEncTF;</div><div>-    MCTFReferencePicInfo     m_mcstfRefList[MAX_MCTF_TEMPORAL_WINDOW_LENGTH];</div><div>+    TemporalFilterRefPicInfo m_mcstfRefList[MAX_MCSTF_TEMPORAL_WINDOW_LENGTH];</div><div> </div><div>     class WeightAnalysis : public BondedTaskGroup</div><div>     {</div><div>diff --git a/source/x265.h b/source/x265.h</div><div>index 4b3177a94..c10c767c3 100644</div><div>--- a/source/x265.h</div><div>+++ b/source/x265.h</div><div>@@ -1994,7 +1994,7 @@ typedef struct x265_param</div><div>     char* filmGrain;</div><div> </div><div>     /*Motion compensated temporal filter*/</div><div>-    int      bEnableGopBasedTemporalFilter;</div><div>+    int      bEnableTemporalFilter;</div><div>     double   temporalFilterStrength;</div><div> } x265_param;</div><div> </div><div>diff --git a/source/x265cli.cpp b/source/x265cli.cpp</div><div>index 69d77e7bf..75e628f7f 100755</div><div>--- a/source/x265cli.cpp</div><div>+++ b/source/x265cli.cpp</div><div>@@ -370,7 +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>+        H0("   --[no-]mcstf                  Enable GOP based temporal filter. Default %d\n", param->bEnableTemporalFilter);</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 29d85f96f..78938f923 100644</div><div>--- a/source/x265cli.h</div><div>+++ b/source/x265cli.h</div><div>@@ -356,8 +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>+    { "mcstf",                 no_argument, NULL, 0 },</div><div>+    { "no-mcstf",              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>