<div dir="ltr"><div dir="ltr"><div>From c6ba808838338d4c4e7c1bf1e364c44cd32608ee 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:18:48 +0530</div><div>Subject: [PATCH] Motion compensate and apply bilateral filter on mctf frames</div><div><br></div><div>---</div><div> source/encoder/frameencoder.cpp | 43 +++++++++++++++++++++++++++++++++</div><div> 1 file changed, 43 insertions(+)</div><div><br></div><div>diff --git a/source/encoder/frameencoder.cpp b/source/encoder/frameencoder.cpp</div><div>index 9dc9242f6..0a44eb22f 100644</div><div>--- a/source/encoder/frameencoder.cpp</div><div>+++ b/source/encoder/frameencoder.cpp</div><div>@@ -34,6 +34,7 @@</div><div> #include "common.h"</div><div> #include "slicetype.h"</div><div> #include "nal.h"</div><div>+#include "temporalfilter.h"</div><div> </div><div> namespace X265_NS {</div><div> void weightAnalyse(Slice& slice, Frame& frame, x265_param& param);</div><div>@@ -101,6 +102,14 @@ void FrameEncoder::destroy()</div><div>         delete m_rce.picTimingSEI;</div><div>         delete m_rce.hrdTiming;</div><div>     }</div><div>+</div><div>+    if (m_param->bEnableGopBasedTemporalFilter)</div><div>+    {</div><div>+        for (int i = 0; i < (m_frameEncTF->s_range << 1); i++)</div><div>+            m_frameEncTF->destroyRefPicInfo(&m_mcstfRefList[i]);</div><div>+</div><div>+        delete m_frameEncTF;</div><div>+    }</div><div> }</div><div> </div><div> bool FrameEncoder::init(Encoder *top, int numRows, int numCols)</div><div>@@ -195,6 +204,16 @@ 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>+    {</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>+            ok &= !!m_frameEncTF->createRefPicInfo(&m_mcstfRefList[i], m_param);</div><div>+    }</div><div>+</div><div>     return ok;</div><div> }</div><div> </div><div>@@ -579,6 +598,13 @@ 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>+    {</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>+    }</div><div>+</div><div>     if (m_nr)</div><div>     {</div><div>         if (qp > QP_MAX_SPEC && m_frame->m_param->rc.vbvBufferSize)</div><div>@@ -946,6 +972,23 @@ 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>+    {</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>+        {</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>+            memset(m_mcstfRefList[i].mvs2, 0, sizeof(MV) * ((m_param->sourceWidth / 16) * (m_param->sourceHeight / 16)));</div><div>+            memset(m_mcstfRefList[i].mvs,  0, sizeof(MV) * ((m_param->sourceWidth / 4) * (m_param->sourceHeight / 4)));</div><div>+            memset(m_mcstfRefList[i].noise, 0, sizeof(int) * ((m_param->sourceWidth / 4) * (m_param->sourceHeight / 4)));</div><div>+            memset(m_mcstfRefList[i].error, 0, sizeof(int) * ((m_param->sourceWidth / 4) * (m_param->sourceHeight / 4)));</div><div>+</div><div>+            m_frame->m_mcstf->m_numRef = 0;</div><div>+        }</div><div>+    }</div><div>+</div><div>+</div><div>     if (m_param->rc.bStatWrite)</div><div>     {</div><div>         int totalI = 0, totalP = 0, totalSkip = 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>