[x265] [PATCH 4 of 6] rc: adjust qp for B frames from ABR feedback in case of CBR

Steve Borho steve at borho.org
Wed Nov 26 20:08:58 CET 2014


On 11/27, aarthi at multicorewareinc.com wrote:
> # HG changeset patch
> # User Aarthi Thirumalai
> # Date 1416918804 -19800
> #      Tue Nov 25 18:03:24 2014 +0530
> # Node ID 3d5510385b89f072fc034c436128006056c1c6e5
> # Parent  64207385c7b0153826df955c965228d8af3c8369
> rc: adjust qp for B frames from ABR feedback in case of CBR.
> 
> limits the bitrate fluctuation for CBR with respect to the target bitrate set.
> 
> diff -r 64207385c7b0 -r 3d5510385b89 source/encoder/ratecontrol.cpp
> --- a/source/encoder/ratecontrol.cpp	Tue Nov 25 18:01:00 2014 +0530
> +++ b/source/encoder/ratecontrol.cpp	Tue Nov 25 18:03:24 2014 +0530
> @@ -1350,6 +1350,25 @@
>      return false;
>  }
>  
> +double RateControl::tuneAbrQScaleFromFeedBack(double qScale)

Feedback is one word, will adjust capitalization

> +{
> +    double abrBuffer = 2 * m_param->rc.rateTolerance * m_bitrate;
> +    if (m_currentSatd)
> +    {
> +        /* use framesDone instead of POC as poc count is not serial with bframes enabled */
> +        double overflow = 1.0;
> +        double timeDone = (double)(m_framesDone - m_param->frameNumThreads + 1) * m_frameDuration;
> +        double wantedBits = timeDone * m_bitrate;
> +        if (wantedBits > 0 && m_totalBits > 0 && !m_partialResidualFrames)
> +        {
> +            abrBuffer *= X265_MAX(1, sqrt(timeDone));
> +            overflow = Clip3(.5, 2.0, 1.0 + (m_totalBits - wantedBits) / abrBuffer);
> +            qScale *= overflow;
> +        }
> +    }
> +    return qScale;
> +}
> +
>  double RateControl::rateEstimateQscale(Frame* curFrame, RateControlEntry *rce)
>  {
>      double q;
> @@ -1422,9 +1441,20 @@
>              q += m_pbOffset / 2;
>          else
>              q += m_pbOffset;
> +
> +        double qScale = x265_qp2qScale(q);
> +        if (m_isCbr)
> +        {
> +            qScale = tuneAbrQScaleFromFeedBack(qScale);
> +            if (!m_isAbrReset)
> +            {
> +                double lmin = m_lastQScaleFor[P_SLICE] / m_lstep;
> +                double lmax = m_lastQScaleFor[P_SLICE] * m_lstep;
> +                qScale = Clip3(lmin, lmax, qScale);
> +            }
> +            q = x265_qScale2qp(qScale);
> +        }
>          rce->qpNoVbv = q;
> -        double qScale = x265_qp2qScale(q);
> -
>          if (!m_2pass && m_isVbv)
>          {
>              qScale = clipQscale(curFrame, rce, qScale);
> @@ -1512,7 +1542,7 @@
>               * tradeoff between quality and bitrate precision. But at large
>               * tolerances, the bit distribution approaches that of 2pass. */
>  
> -            double wantedBits, overflow = 1;
> +            double overflow = 1;
>  
>              m_shortTermCplxSum *= 0.5;
>              m_shortTermCplxCount *= 0.5;
> @@ -1532,23 +1562,9 @@
>              {
>                  if (!m_param->rc.bStatRead)
>                      checkAndResetABR(rce, false);
> -                q = getQScale(rce, m_wantedBitsWindow / m_cplxrSum);
> -
> -                /* ABR code can potentially be counterproductive in CBR, so just
> -                 * don't bother.  Don't run it if the frame complexity is zero
> -                 * either. */
> -                if (!m_isCbr && m_currentSatd)
> -                {
> -                    /* use framesDone instead of POC as poc count is not serial with bframes enabled */
> -                    double timeDone = (double)(m_framesDone - m_param->frameNumThreads + 1) * m_frameDuration;
> -                    wantedBits = timeDone * m_bitrate;
> -                    if (wantedBits > 0 && m_totalBits > 0 && !m_partialResidualFrames)
> -                    {
> -                        abrBuffer *= X265_MAX(1, sqrt(timeDone));
> -                        overflow = Clip3(.5, 2.0, 1.0 + (m_totalBits - wantedBits) / abrBuffer);
> -                        q *= overflow;
> -                    }
> -                }
> +                double initialQScale = getQScale(rce, m_wantedBitsWindow / m_cplxrSum);
> +                q = tuneAbrQScaleFromFeedBack(initialQScale);
> +                overflow = q / initialQScale;
>              }
>  
>              if (m_sliceType == I_SLICE && m_param->keyframeMax > 1
> diff -r 64207385c7b0 -r 3d5510385b89 source/encoder/ratecontrol.h
> --- a/source/encoder/ratecontrol.h	Tue Nov 25 18:01:00 2014 +0530
> +++ b/source/encoder/ratecontrol.h	Tue Nov 25 18:03:24 2014 +0530
> @@ -233,6 +233,7 @@
>      void initHRD(SPS* sps);
>      int rateControlSliceType(int frameNum);
>      bool cuTreeReadFor2Pass(Frame* curFrame);
> +    double tuneAbrQScaleFromFeedBack(double qScale);
>  
>  protected:
>  
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel

-- 
Steve Borho


More information about the x265-devel mailing list