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

Ximing Cheng chengximing1989 at gmail.com
Fri Oct 16 11:53:28 CEST 2015


The lastRemovedSatdCost only save a copy of last removed value, but
not the index, so the m_sliderPos++, the lastRemovedSatdCost only
changes into the next removed copy of value.

The reason of why m_sliderPos == s_slidingWindowFrames does not delete
any value is the first calculation is on index 0, when m_sliderPos ==
s_slidingWindowFrames, the calculation is only proceed on
s_slidingWindowFrames - 1 index of the sliding window, which the
slidingWindow is full first time, when m_sliderPos ==
s_slidingWindowFrames + 1, it has to remove the index 0 (first one)
value of the slidingWindow.

The logic of this patch and the logic of the original is the same, we
can debug and print the value of each rce->movingAvgSum and
m_sliderPos, it is always the same value <m_sliderPos,
rce->movingAvgSum> before and after changing this logic.

On Fri, Oct 16, 2015 at 5:31 PM, Aarthi Priya Thirumalai
<aarthi at multicorewareinc.com> wrote:
>
>
> 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
>
>
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>


More information about the x265-devel mailing list