[x265] [PATCH 2 of 2] rc: Remove the redundant calculation on slidingWindow

Aarthi Priya Thirumalai aarthi at multicorewareinc.com
Fri Oct 16 11:31:16 CEST 2015


On Fri, Oct 16, 2015 at 1:50 PM, Ximing Cheng <chengximing1989 at gmail.com>
wrote:

> This patch reduce the calculation by saving the SATD moving sum last
> time (frame), then the next frame can calculate its SATD moving sum by
> the last moving sum and the replaced value in the slidingWindow, so
> that each frame in rate ctrl does not need to do a loop for at most
> s_slidingWindowFrames times to calculate its SATD moving sum.
>
> Suppose slidingWindow size is 6, value is x y z a b c
>
> rc frame (m_sliderPos)                moving sum
> 0                                               0
> 1                                               0.5x
> 2                                               0.5^2x+0.5y
> 3                                               0.5^3x+0.5^2y+0.5z
> 4                                               0.5^4x+0.5^3y+0.5^2z+0.5a
> 5
>  0.5^5x+0.5^4y+0.5^3z+0.5^2a+0.5b
> 6
> 0.5^5x+0.5^4y+0.5^3z+0.5^2a+0.5b+c
> 7                                               0.5
> (0.5^4y+0.5^3z+0.5^2a+0.5b+c)+x_1   == 0.5
> (0.5^5x+0.5^4y+0.5^3z+0.5^2a+0.5b+c -  0.5^5x) + x_1
>
> which x_1 is the replaced value of x
>
> On Mon, Oct 12, 2015 at 10:26 AM, Ximing Cheng
> <chengximing1989 at foxmail.com> wrote:
> > # HG changeset patch
> > # User Ximing Cheng <ximingcheng at tencent.com>
> > # Date 1444616617 -28800
> > #      Mon Oct 12 10:23:37 2015 +0800
> > # Node ID 0d1cfbb2716edcf9ba5b8ccc8b0fd585f4de59d7
> > # Parent  667253981f61f18c36bf5c7f607fbf6ea8cc6474
> > rc: Remove the redundant calculation on slidingWindow
> >
> > diff -r 667253981f61 -r 0d1cfbb2716e source/encoder/ratecontrol.cpp
> > --- a/source/encoder/ratecontrol.cpp    Mon Oct 12 10:18:55 2015 +0800
> > +++ b/source/encoder/ratecontrol.cpp    Mon Oct 12 10:23:37 2015 +0800
> > @@ -219,6 +219,7 @@
> >      m_cutreeStatFileOut = m_cutreeStatFileIn = NULL;
> >      m_rce2Pass = NULL;
> >      m_lastBsliceSatdCost = 0;
> > +    m_movingAvgSum = 0.0;
> >
> >      // vbv initialization
> >      m_param->rc.vbvBufferSize = x265_clip3(0, 2000000,
> m_param->rc.vbvBufferSize);
> > @@ -1347,18 +1348,28 @@
> >      {
> >          if (m_isAbr)
> >          {
> > -            double slidingWindowCplxSum = 0;
> > -            int start = m_sliderPos > s_slidingWindowFrames ?
> m_sliderPos : 0;
> > -            for (int cnt = 0; cnt < s_slidingWindowFrames; cnt++,
> start++)
> > +            int pos = m_sliderPos % s_slidingWindowFrames;
> > +            int addPos = (pos + s_slidingWindowFrames - 1) %
> s_slidingWindowFrames;
> > +            if (m_sliderPos > s_slidingWindowFrames)
> >              {
> > -                int pos = start % s_slidingWindowFrames;
> > -                slidingWindowCplxSum *= 0.5;
> > -                if (!m_satdCostWindow[pos])
> > -                    break;
> > -                slidingWindowCplxSum += m_satdCostWindow[pos];
> > +                const static double base = pow(0.5,
> s_slidingWindowFrames - 1);
> > +                m_movingAvgSum -= m_lastRemovedSatdCost * base;
> > +                m_movingAvgSum *= 0.5;
> > +                m_movingAvgSum += m_satdCostWindow[addPos];
> >              }
> > -            rce->movingAvgSum = slidingWindowCplxSum;
> > -            m_satdCostWindow[m_sliderPos % s_slidingWindowFrames] =
> rce->lastSatd;
> > +            else if (m_sliderPos == s_slidingWindowFrames)
> > +            {
> > +                m_movingAvgSum += m_satdCostWindow[addPos];
> > +            }
> > +            else if (m_sliderPos > 0)
> > +            {
> > +                m_movingAvgSum += m_satdCostWindow[addPos];
> > +                m_movingAvgSum *= 0.5;
> > +            }
> > +
> > +            rce->movingAvgSum = m_movingAvgSum;
> > +            m_lastRemovedSatdCost = m_satdCostWindow[pos];
> > +            m_satdCostWindow[pos] = rce->lastSatd;
> >              m_sliderPos++;
> >          }
> >      }
>
should the m_lastRemovedSatdCost be taken after incrementing the
m_sliderPos  ?
because at the position = s_slidingWindowFrames, it should delete the data
written in m_satdCostWindow
but the lastRemovedSatdCost would not be pointing to that yet - can you
check this once.

> diff -r 667253981f61 -r 0d1cfbb2716e source/encoder/ratecontrol.h
> > --- a/source/encoder/ratecontrol.h      Mon Oct 12 10:18:55 2015 +0800
> > +++ b/source/encoder/ratecontrol.h      Mon Oct 12 10:23:37 2015 +0800
> > @@ -167,6 +167,8 @@
> >      int64_t m_satdCostWindow[50];
> >      int64_t m_encodedBitsWindow[50];
> >      int     m_sliderPos;
> > +    int64_t m_lastRemovedSatdCost;
> > +    double  m_movingAvgSum;
> >
> >      /* To detect a pattern of low detailed static frames in single pass
> ABR using satdcosts */
> >      int64_t m_lastBsliceSatdCost;
> >
> >
> > _______________________________________________
> > x265-devel mailing list
> > x265-devel at videolan.org
> > https://mailman.videolan.org/listinfo/x265-devel
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20151016/0bb56695/attachment-0001.html>


More information about the x265-devel mailing list