<div dir="ltr"><div dir="ltr"><div>From fe75245f197219f57008e75a60e67ccf0a1b5580 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 18:15:04 +0530</div><div>Subject: [PATCH] sub sample and motion estimate for mcstf frames</div><div><br></div><div>---</div><div> source/encoder/encoder.cpp    | 258 +++++++++++++++++++++++++++++++++-</div><div> source/encoder/encoder.h      |   5 +</div><div> source/encoder/frameencoder.h |   5 +</div><div> 3 files changed, 262 insertions(+), 6 deletions(-)</div><div><br></div><div>diff --git a/source/encoder/encoder.cpp b/source/encoder/encoder.cpp</div><div>index a54b0e197..790503d80 100644</div><div>--- a/source/encoder/encoder.cpp</div><div>+++ b/source/encoder/encoder.cpp</div><div>@@ -174,6 +174,7 @@ Encoder::Encoder()</div><div>     m_scaledEdgeThreshold = 0.0;</div><div>     m_scaledChromaThreshold = 0.0;</div><div>     m_zoneIndex = 0;</div><div>+    m_origPicBuffer = 0;</div><div> }</div><div> </div><div> inline char *strcatFilename(const char *input, const char *suffix)</div><div>@@ -391,6 +392,10 @@ void Encoder::create()</div><div>             lookAheadThreadPool[i].start();</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>+        m_origPicBuffer = new OrigPicBuffer();</div><div>+</div><div>     m_rateControl = new RateControl(*m_param, this);</div><div>     if (!m_param->bResetZoneConfig)</div><div>     {</div><div>@@ -967,6 +972,10 @@ void Encoder::destroy()</div><div>         delete[] zoneReadCount;</div><div>         delete[] zoneWriteCount;</div><div>     }</div><div>+</div><div>+    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+        delete m_origPicBuffer;</div><div>+</div><div>     if (m_rateControl)</div><div>     {</div><div>         m_rateControl->destroy();</div><div>@@ -1616,6 +1625,92 @@ void Encoder::findSceneCuts(x265_picture *pic, bool& bDup, double maxUVSad, doub</div><div>     }</div><div> }</div><div> </div><div>+bool Encoder::isFilterThisframe(uint8_t sliceTypeConfig, int curSliceType)</div><div>+{</div><div>+    uint8_t newSliceType = 0;</div><div>+    switch (curSliceType)</div><div>+    {</div><div>+    case 1: newSliceType |= 1 << 0;</div><div>+        break;</div><div>+    case 2: newSliceType |= 1 << 0;</div><div>+        break;</div><div>+    case 3: newSliceType |= 1 << 1;</div><div>+        break;</div><div>+    case 4: newSliceType |= 1 << 2;</div><div>+        break;</div><div>+    case 5: newSliceType |= 1 << 3;</div><div>+        break;</div><div>+    default: return 0;</div><div>+    }</div><div>+    return ((sliceTypeConfig & newSliceType) != 0);</div><div>+}</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>+    dest->picBuffer = iterFrame->m_fencPic;</div><div>+    dest->picBufferSubSampled2 = iterFrame->m_fencPicSubsampled2;</div><div>+    dest->picBufferSubSampled4 = iterFrame->m_fencPicSubsampled4;</div><div>+    dest->isFilteredFrame = isPreFiltered;</div><div>+    dest->isSubsampled = iterFrame->m_isSubSampled;</div><div>+    dest->origOffset = i;</div><div>+    curFrame->m_mcstf->m_numRef++;</div><div>+</div><div>+    return 1;</div><div>+}</div><div>+</div><div>+bool Encoder::generateMctfRef(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>+    {</div><div>+        bool isFound = false;</div><div>+        if (iterPOC != frameEnc->m_poc)</div><div>+        {</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>+                {</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>+                        {</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>+                        }</div><div>+</div><div>+                        break;</div><div>+                    }</div><div>+                    Frame* iterFrame = frameEnc->m_encData->m_slice->m_mcstfRefFrameList[1][j];</div><div>+                    if (iterFrame->m_poc == iterPOC)</div><div>+                    {</div><div>+                        if (!enqueueRefFrame(currEncoder, iterFrame, frameEnc, false, (int16_t)(iterPOC - frameEnc->m_poc)))</div><div>+                        {</div><div>+                            return false;</div><div>+                        };</div><div>+                        break;</div><div>+                    }</div><div>+                }</div><div>+            }</div><div>+        }</div><div>+    }</div><div>+</div><div>+    return true;</div><div>+}</div><div>+</div><div> /**</div><div>  * Feed one new input frame into the encoder, get one frame out. If pic_in is</div><div>  * NULL, a flush condition is implied and pic_in must be NULL for all subsequent</div><div>@@ -1651,10 +1746,16 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>     {</div><div>         if (!m_param->bUseAnalysisFile && m_param->analysisSave)</div><div>             x265_free_analysis_data(m_param, &m_exportedPic->m_analysisData);</div><div>+</div><div>         ATOMIC_DEC(&m_exportedPic->m_countRefEncoders);</div><div>+</div><div>         m_exportedPic = NULL;</div><div>         m_dpb->recycleUnreferenced();</div><div>+</div><div>+        if (m_param->bEnableGopBasedTemporalFilter)</div><div>+            m_origPicBuffer->recycleOrigPicList();</div><div>     }</div><div>+</div><div>     if ((pic_in && (!m_param->chunkEnd || (m_encodedFrameNum < m_param->chunkEnd))) || (m_param->bEnableFrameDuplication && !pic_in && (read < written)))</div><div>     {</div><div>         if (m_param->bHistBasedSceneCut && pic_in)</div><div>@@ -2024,6 +2125,59 @@ 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>+        {</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>+                for (int i = 0; i < numFramesinOPB; i++)</div><div>+                {</div><div>+                    Frame* dupFrame = new Frame;</div><div>+                    if (!(dupFrame->create(m_param, pic_in->quantOffsets)))</div><div>+                    {</div><div>+                        m_aborted = true;</div><div>+                        x265_log(m_param, X265_LOG_ERROR, "Memory allocation failure, aborting encode\n");</div><div>+                        fflush(stderr);</div><div>+                        dupFrame->destroy();</div><div>+                        delete dupFrame;</div><div>+                        return -1;</div><div>+                    }</div><div>+                    else</div><div>+                    {</div><div>+                        if (m_sps.cuOffsetY)</div><div>+                        {</div><div>+                            dupFrame->m_fencPic->m_cuOffsetC = m_sps.cuOffsetC;</div><div>+                            dupFrame->m_fencPic->m_buOffsetC = m_sps.buOffsetC;</div><div>+                            dupFrame->m_fencPic->m_cuOffsetY = m_sps.cuOffsetY;</div><div>+                            dupFrame->m_fencPic->m_buOffsetY = m_sps.buOffsetY;</div><div>+                            if (m_param->internalCsp != X265_CSP_I400)</div><div>+                            {</div><div>+                                dupFrame->m_fencPic->m_cuOffsetC = m_sps.cuOffsetC;</div><div>+                                dupFrame->m_fencPic->m_buOffsetC = m_sps.buOffsetC;</div><div>+                            }</div><div>+                            m_origPicBuffer->addEncPicture(dupFrame);</div><div>+                        }</div><div>+                    }</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>+</div><div>+            //Extend full-res original picture border</div><div>+            PicYuv *orig = inFrame->m_fencPic;</div><div>+            extendPicBorder(orig->m_picOrg[0], orig->m_stride, orig->m_picWidth, orig->m_picHeight, orig->m_lumaMarginX, orig->m_lumaMarginY);</div><div>+            extendPicBorder(orig->m_picOrg[1], orig->m_strideC, orig->m_picWidth >> orig->m_hChromaShift, orig->m_picHeight >> orig->m_vChromaShift, orig->m_chromaMarginX, orig->m_chromaMarginY);</div><div>+            extendPicBorder(orig->m_picOrg[2], orig->m_strideC, orig->m_picWidth >> orig->m_hChromaShift, orig->m_picHeight >> orig->m_vChromaShift, orig->m_chromaMarginX, orig->m_chromaMarginY);</div><div>+</div><div>+            //TODO: Add subsampling here if required</div><div>+            m_origPicBuffer->addPicture(inFrame);</div><div>+        }</div><div>+</div><div>         m_lookahead->addPicture(*inFrame, sliceType);</div><div>         m_numDelayedPic++;</div><div>     }</div><div>@@ -2245,7 +2399,7 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>                 if (m_rateControl->writeRateControlFrameStats(outFrame, &curEncoder->m_rce))</div><div>                     m_aborted = true;</div><div>             if (pic_out)</div><div>-            { </div><div>+            {</div><div>                 /* m_rcData is allocated for every frame */</div><div>                 pic_out->rcData = outFrame->m_rcData;</div><div>                 outFrame->m_rcData->qpaRc = outFrame->m_encData->m_avgQpRc;</div><div>@@ -2266,11 +2420,24 @@ 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>+            {</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>+                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>+                curFrame->m_refPicCnt[1]--;</div><div>+            }</div><div>+</div><div>             /* Allow this frame to be recycled if no frame encoders are using it for reference */</div><div>             if (!pic_out)</div><div>             {</div><div>                 ATOMIC_DEC(&outFrame->m_countRefEncoders);</div><div>                 m_dpb->recycleUnreferenced();</div><div>+                if (m_param->bEnableGopBasedTemporalFilter)</div><div>+                    m_origPicBuffer->recycleOrigPicList();</div><div>             }</div><div>             else</div><div>                 m_exportedPic = outFrame;</div><div>@@ -2472,6 +2639,26 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div>             }</div><div>             /* determine references, setup RPS, etc */</div><div>             m_dpb->prepareEncode(frameEnc);</div><div>+</div><div>+            if (m_param->bEnableGopBasedTemporalFilter)</div><div>+            {</div><div>+                X265_CHECK(!m_origPicBuffer->m_mcstfOrigPicFreeList.empty(), "Frames not available in Encoded OPB");</div><div>+</div><div>+                Frame *dupFrame = m_origPicBuffer->m_mcstfOrigPicFreeList.popBackMCSTF();</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>+</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>+</div><div>+                m_origPicBuffer->addEncPictureToPicList(dupFrame);</div><div>+                m_origPicBuffer->setOrigPicList(frameEnc, m_pocLast);</div><div>+            }</div><div>+</div><div>             if (!!m_param->selectiveSAO)</div><div>             {</div><div>                 Slice* slice = frameEnc->m_encData->m_slice;</div><div>@@ -2497,9 +2684,68 @@ int Encoder::encode(const x265_picture* pic_in, x265_picture* pic_out)</div><div> </div><div>             if (m_param->rc.rateControlMode != X265_RC_CQP)</div><div>                 m_lookahead->getEstimatedPictureCost(frameEnc);</div><div>+</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>+            {</div><div>+</div><div>+                if (!generateMctfRef(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>+                    fflush(stderr);</div><div>+                    return -1;</div><div>+                }</div><div>+</div><div>+</div><div>+                if (!*frameEnc->m_isSubSampled)</div><div>+                {</div><div>+                    curEncoder->m_frameEncTF->subsampleLuma(frameEnc->m_fencPic, frameEnc->m_fencPicSubsampled2);</div><div>+                    curEncoder->m_frameEncTF->subsampleLuma(frameEnc->m_fencPicSubsampled2, frameEnc->m_fencPicSubsampled4);</div><div>+                    *frameEnc->m_isSubSampled = true;</div><div>+                }</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>+                    if (!*ref->isSubsampled)</div><div>+                    {</div><div>+                        curEncoder->m_frameEncTF->subsampleLuma(ref->picBuffer, ref->picBufferSubSampled2);</div><div>+                        curEncoder->m_frameEncTF->subsampleLuma(ref->picBufferSubSampled2, ref->picBufferSubSampled4);</div><div>+                        *ref->isSubsampled = true;</div><div>+                    }</div><div>+                }</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>+</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>+                    curEncoder->m_frameEncTF->motionEstimationLuma(ref->mvs2, ref->mvsStride2, frameEnc->m_fencPic, ref->picBuffer, 16, ref->mvs1, ref->mvsStride1, 2);</div><div>+                    curEncoder->m_frameEncTF->motionEstimationLuma(ref->mvs,  ref->mvsStride, frameEnc->m_fencPic, ref->picBuffer, 8, ref->mvs2, ref->mvsStride2, 1, true, ref->error);</div><div>+                }</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>+                    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>+                    {</div><div>+                        if (dpbframePtr->m_encData->m_slice->m_sliceType == B_SLICE)</div><div>+                            ref->slicetype = X265_TYPE_B;</div><div>+                        else if (dpbframePtr->m_encData->m_slice->m_sliceType == P_SLICE)</div><div>+                            ref->slicetype = X265_TYPE_P;</div><div>+                        else</div><div>+                            ref->slicetype = X265_TYPE_I;</div><div>+                    }</div><div>+                }</div><div>+            }</div><div>+</div><div>             /* Allow FrameEncoder::compressFrame() to start in the frame encoder thread */</div><div>             if (!curEncoder->startCompressFrame(frameEnc))</div><div>                 m_aborted = true;</div><div>@@ -2571,11 +2817,11 @@ int Encoder::reconfigureParam(x265_param* encParam, x265_param* param)</div><div>         encParam->dynamicRd = param->dynamicRd;</div><div>         encParam->bEnableTransformSkip = param->bEnableTransformSkip;</div><div>         encParam->bEnableAMP = param->bEnableAMP;</div><div>-<span style="white-space:pre">                </span>if (param->confWinBottomOffset == 0 && param->confWinRightOffset == 0)</div><div>-<span style="white-space:pre">         </span>{</div><div>-<span style="white-space:pre">                    </span>encParam->confWinBottomOffset = param->confWinBottomOffset;</div><div>-<span style="white-space:pre">                    </span>encParam->confWinRightOffset = param->confWinRightOffset;</div><div>-<span style="white-space:pre">              </span>}</div><div>+        if (param->confWinBottomOffset == 0 && param->confWinRightOffset == 0)</div><div>+        {</div><div>+            encParam->confWinBottomOffset = param->confWinBottomOffset;</div><div>+            encParam->confWinRightOffset = param->confWinRightOffset;</div><div>+        }</div><div>         /* Resignal changes in params in Parameter Sets */</div><div>         m_sps.maxAMPDepth = (m_sps.bUseAMP = param->bEnableAMP && param->bEnableAMP) ? param->maxCUDepth : 0;</div><div>         m_pps.bTransformSkipEnabled = param->bEnableTransformSkip ? 1 : 0;</div><div>diff --git a/source/encoder/encoder.h b/source/encoder/encoder.h</div><div>index cfbb55fe0..41f2ed463 100644</div><div>--- a/source/encoder/encoder.h</div><div>+++ b/source/encoder/encoder.h</div><div>@@ -32,6 +32,7 @@</div><div> #include "nal.h"</div><div> #include "framedata.h"</div><div> #include "svt.h"</div><div>+#include "temporalfilter.h"</div><div> #ifdef ENABLE_HDR10_PLUS</div><div>     #include "dynamicHDR10/hdr10plus.h"</div><div> #endif</div><div>@@ -297,6 +298,7 @@ public:</div><div>     ThreadSafeInteger* zoneWriteCount;</div><div>     /* Film grain model file */</div><div>     FILE* m_filmGrainIn;</div><div>+    OrigPicBuffer*          m_origPicBuffer;</div><div> </div><div>     Encoder();</div><div>     ~Encoder()</div><div>@@ -393,6 +395,9 @@ public:</div><div> </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>+</div><div> protected:</div><div> </div><div>     void initVPS(VPS *vps);</div><div>diff --git a/source/encoder/frameencoder.h b/source/encoder/frameencoder.h</div><div>index 5d972cb26..267e9033a 100644</div><div>--- a/source/encoder/frameencoder.h</div><div>+++ b/source/encoder/frameencoder.h</div><div>@@ -40,6 +40,7 @@</div><div> #include "ratecontrol.h"</div><div> #include "reference.h"</div><div> #include "nal.h"</div><div>+#include "temporalfilter.h"</div><div> </div><div> namespace X265_NS {</div><div> // private x265 namespace</div><div>@@ -233,6 +234,10 @@ public:</div><div>     FrameFilter              m_frameFilter;</div><div>     NALList                  m_nalList;</div><div> </div><div>+    // initialization for mcstf</div><div>+    TemporalFilter*          m_frameEncTF;</div><div>+    MCTFReferencePicInfo     m_mcstfRefList[MAX_MCTF_TEMPORAL_WINDOW_LENGTH];</div><div>+</div><div>     class WeightAnalysis : public BondedTaskGroup</div><div>     {</div><div>     public:</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>