[x265] [PATCH] rc: recompute planned frame size when using vbv with --qpfile

Aarthi Priya Thirumalai aarthi at multicorewareinc.com
Thu Mar 12 04:12:20 CET 2015


I will send the other part as a different patch. It is to prevent drastic
qp changes from  vbv lookahead estimations due to possible mispredictions
by the default vbv frame size predictors.
On Mar 12, 2015 6:23 AM, "Deepthi Nandakumar" <deepthi at multicorewareinc.com>
wrote:

> No, this is not. This is for a customer who wanted to be able to use
> qpfile with VBV. The first half is - I'm not sure about the second half of
> the patch.
>
> On Thu, Mar 12, 2015 at 1:44 AM, Steve Borho <steve at borho.org> wrote:
>
>> On 03/11, aarthi at multicorewareinc.com wrote:
>> > # HG changeset patch
>> > # User Aarthi Thirumalai
>> > # Date 1425994215 -19800
>> > #      Tue Mar 10 19:00:15 2015 +0530
>> > # Node ID 9b7b93384e39e90cf2d4c0c0a53213abff362f70
>> > # Parent  8f148ac8dbe4b68e88ceff84f40e33b29e888dc9
>> > rc: recompute planned frame size when using vbv with --qpfile
>>
>> is this at all related to issue 111?
>>
>> > diff -r 8f148ac8dbe4 -r 9b7b93384e39 source/encoder/ratecontrol.cpp
>> > --- a/source/encoder/ratecontrol.cpp  Tue Mar 10 15:46:36 2015 +0530
>> > +++ b/source/encoder/ratecontrol.cpp  Tue Mar 10 19:00:15 2015 +0530
>> > @@ -1067,7 +1067,15 @@
>> >      {
>> >          m_qp = (int32_t)(curFrame->m_forceqp + 0.5) - 1;
>> >          m_qp = x265_clip3(QP_MIN, QP_MAX_MAX, m_qp);
>> > -        rce->qpaRc = curEncData.m_avgQpRc = curEncData.m_avgQpAq =
>> m_qp;
>> > +        rce->qpaRc =curEncData.m_avgQpRc = curEncData.m_avgQpAq = m_qp;
>> > +        if (m_isAbr)
>> > +        {
>> > +            rce->qpNoVbv = rce->qpaRc;
>> > +            m_lastQScaleFor[m_sliceType] = x265_qp2qScale(rce->qpaRc);
>> > +            if (rce->poc == 0)
>> > +                 m_lastQScaleFor[P_SLICE] =
>> m_lastQScaleFor[m_sliceType] * fabs(m_param->rc.ipFactor);
>> > +            rce->frameSizePlanned = predictSize(&m_pred[m_sliceType],
>> rce->qpaRc, (double)m_currentSatd);
>> > +        }
>> >      }
>> >      // Do not increment m_startEndOrder here. Make rateControlEnd of
>> previous thread
>> >      // to wait until rateControlUpdateStats of this frame is called
>> > @@ -1360,13 +1368,14 @@
>> >              q += m_pbOffset;
>> >
>> >          double qScale = x265_qp2qScale(q);
>> > +        double lmin = 0, lmax = 0;
>> >          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;
>> > +                 lmin = m_lastQScaleFor[P_SLICE] / m_lstep;
>> > +                 lmax = m_lastQScaleFor[P_SLICE] * m_lstep;
>> >                  qScale = x265_clip3(lmin, lmax, qScale);
>> >              }
>> >              q = x265_qScale2qp(qScale);
>> > @@ -1375,6 +1384,8 @@
>> >          if (!m_2pass && m_isVbv)
>> >          {
>> >              qScale = clipQscale(curFrame, rce, qScale);
>> > +            if (m_pred[m_sliceType].count == 1)
>> > +                qScale = x265_clip3(lmin, lmax, qScale);
>> >              m_lastQScaleFor[m_sliceType] = qScale;
>> >              rce->frameSizePlanned = predictSize(&m_pred[m_sliceType],
>> qScale, (double)m_currentSatd);
>> >          }
>> > @@ -1460,7 +1471,7 @@
>> >               * tolerances, the bit distribution approaches that of
>> 2pass. */
>> >
>> >              double overflow = 1;
>> > -
>> > +            double lqmin = 0, lqmax = 0;
>> >              m_shortTermCplxSum *= 0.5;
>> >              m_shortTermCplxCount *= 0.5;
>> >              m_shortTermCplxSum += m_currentSatd /
>> (CLIP_DURATION(m_frameDuration) / BASE_FRAME_DURATION);
>> > @@ -1494,7 +1505,6 @@
>> >              {
>> >                  if (m_param->rc.rateControlMode != X265_RC_CRF)
>> >                  {
>> > -                    double lqmin = 0, lqmax = 0;
>> >                      lqmin = m_lastQScaleFor[m_sliceType] / m_lstep;
>> >                      lqmax = m_lastQScaleFor[m_sliceType] * m_lstep;
>> >                      if (!m_partialResidualFrames)
>> > @@ -1520,6 +1530,8 @@
>> >              q = x265_clip3(MIN_QPSCALE, MAX_MAX_QPSCALE, q);
>> >              rce->qpNoVbv = x265_qScale2qp(q);
>> >              q = clipQscale(curFrame, rce, q);
>> > +            if (m_pred[m_sliceType].count == 1 && m_framesDone > 0)
>> > +                q = x265_clip3(lqmin, lqmax, q);
>> >          }
>> >          m_lastQScaleFor[m_sliceType] = q;
>> >          if ((m_curSlice->m_poc == 0 || m_lastQScaleFor[P_SLICE] < q)
>> && !(m_2pass && !m_isVbv))
>> > _______________________________________________
>> > x265-devel mailing list
>> > x265-devel at videolan.org
>> > https://mailman.videolan.org/listinfo/x265-devel
>>
>> --
>> Steve Borho
>> _______________________________________________
>> 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/20150312/1e75d799/attachment-0001.html>


More information about the x265-devel mailing list