<div dir="ltr"><div># HG changeset patch</div><div># User Ximing Cheng <<a href="mailto:ximingcheng@tencent.com">ximingcheng@tencent.com</a>></div><div># Date 1444406456 -28800</div><div>#      Sat Oct 10 00:00:56 2015 +0800</div><div># Node ID 276e3a0d90a4e3b38a482c3c1789befc9cdde945</div><div># Parent  4176ffb657db00f173ba15a8d54c821f6811f514</div><div>Remove the redundant calculation on slidingWindow</div><div><br></div><div>diff --git a/source/encoder/ratecontrol.cpp b/source/encoder/ratecontrol.cpp</div><div>--- a/source/encoder/ratecontrol.cpp</div><div>+++ b/source/encoder/ratecontrol.cpp</div><div>@@ -219,6 +219,7 @@</div><div>     m_cutreeStatFileOut = m_cutreeStatFileIn = NULL;</div><div>     m_rce2Pass = NULL;</div><div>     m_lastBsliceSatdCost = 0;</div><div>+    m_movingAvgSum = 0.0;</div><div> </div><div>     // vbv initialization</div><div>     m_param->rc.vbvBufferSize = x265_clip3(0, 2000000, m_param->rc.vbvBufferSize);</div><div>@@ -1347,18 +1348,28 @@</div><div>     {</div><div>         if (m_isAbr)</div><div>         {</div><div>-            double slidingWindowCplxSum = 0;</div><div>-            int start = m_sliderPos > s_slidingWindowFrames ?  m_sliderPos : 0;</div><div>-            for (int cnt = 0; cnt < s_slidingWindowFrames; cnt++, start++)</div><div>+            int pos = m_sliderPos % s_slidingWindowFrames;</div><div>+            int addPos = (pos + s_slidingWindowFrames - 1) % s_slidingWindowFrames;</div><div>+            if (m_sliderPos > s_slidingWindowFrames)</div><div>             {</div><div>-                int pos = start % s_slidingWindowFrames;</div><div>-                slidingWindowCplxSum *= 0.5;</div><div>-                if (!m_satdCostWindow[pos])</div><div>-                    break;</div><div>-                slidingWindowCplxSum += m_satdCostWindow[pos];</div><div>+                const static double base = pow(0.5, s_slidingWindowFrames - 1);</div><div>+                m_movingAvgSum -= m_lastRemovedSatdCost * base;</div><div>+                m_movingAvgSum *= 0.5;</div><div>+                m_movingAvgSum += m_satdCostWindow[addPos];</div><div>             }</div><div>-            rce->movingAvgSum = slidingWindowCplxSum;</div><div>-            m_satdCostWindow[m_sliderPos % s_slidingWindowFrames] = rce->lastSatd;</div><div>+            else if (m_sliderPos == s_slidingWindowFrames)</div><div>+            {</div><div>+                m_movingAvgSum += m_satdCostWindow[addPos];</div><div>+            }</div><div>+            else if (m_sliderPos > 0)</div><div>+            {</div><div>+                m_movingAvgSum += m_satdCostWindow[addPos];</div><div>+                m_movingAvgSum *= 0.5;</div><div>+            }</div><div>+</div><div>+            rce->movingAvgSum = m_movingAvgSum;</div><div>+            m_lastRemovedSatdCost = m_satdCostWindow[pos];</div><div>+            m_satdCostWindow[pos] = rce->lastSatd;</div><div>             m_sliderPos++;</div><div>         }</div><div>     }</div><div>diff --git a/source/encoder/ratecontrol.h b/source/encoder/ratecontrol.h</div><div>--- a/source/encoder/ratecontrol.h</div><div>+++ b/source/encoder/ratecontrol.h</div><div>@@ -174,6 +174,8 @@</div><div>     bool    m_isPatternPresent;</div><div>     bool    m_isSceneTransition;</div><div>     int     m_lastPredictorReset;</div><div>+    int64_t m_lastRemovedSatdCost;</div><div>+    double  m_movingAvgSum;</div><div> </div><div>     /* a common variable on which rateControlStart, rateControlEnd and rateControUpdateStats waits to</div><div>      * sync the calls to these functions. For example</div><div><br></div></div>