[x265] [PATCH 1 of 3 RFC] rc: define function for updating rate control statistics in processRowEncoder
Steve Borho
steve at borho.org
Fri Jul 11 22:44:59 CEST 2014
On Fri, Jul 11, 2014 at 6:24 AM, <santhoshini at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Santhoshini Sekar <santhoshini at multicorewareinc.com>
> # Date 1405070640 -19800
> # Fri Jul 11 14:54:00 2014 +0530
> # Node ID 902e1d37847f0bc222fdc05dcd4a7f6dd26b0751
> # Parent e171ad8bc8a3611b75e084587f4c07c41427c73d
> rc: define function for updating rate control statistics in processRowEncoder
this description is pretty sparse; why is much more important than what or how.
Please explain why is it helpful to update rate control stats after two rows?
> diff -r e171ad8bc8a3 -r 902e1d37847f source/encoder/ratecontrol.cpp
> --- a/source/encoder/ratecontrol.cpp Fri Jul 11 01:44:43 2014 -0500
> +++ b/source/encoder/ratecontrol.cpp Fri Jul 11 14:54:00 2014 +0530
> @@ -274,6 +274,7 @@
> m_residualCost = 0;
> m_rateFactorMaxIncrement = 0;
> m_rateFactorMaxDecrement = 0;
> + m_startEndOrder.set(0);
this change probably belongs in a different patch
>
> if (m_param->rc.rateControlMode == X265_RC_CRF)
> {
> @@ -781,6 +782,46 @@
> }
> }
>
> +void RateControl::rateControlUpdateStats(RateControlEntry* rce)
> +{
> + ScopedLock scope(m_lock);
is m_lock necessary given the way access to the functions is currently
restricted? it seems redundant now
> +
> + if (rce->sliceType == I_SLICE)
> + {
> + /* previous I still had a residual; roll it into the new loan */
> + if (m_residualFrames)
> + rce->rowTotalBits += m_residualCost * m_residualFrames;
> +
> + m_residualFrames = X265_MIN(s_amortizeFrames, m_param->keyframeMax);
> + m_residualCost = (int)((rce->rowTotalBits * s_amortizeFraction) / m_residualFrames);
> + rce->rowTotalBits -= m_residualCost * m_residualFrames;
> + }
> + else if (m_residualFrames)
> + {
> + rce->rowTotalBits += m_residualCost;
> + }
> +
> + if (rce->sliceType != B_SLICE)
> + {
> + rce->rowCplxrSum = rce->rowTotalBits * x265_qp2qScale(rce->qpaRc) / rce->qRceq;
> + }
> + else
> + {
> + rce->rowCplxrSum = rce->rowTotalBits * x265_qp2qScale(rce->qpaRc) / (rce->qRceq * fabs(m_param->rc.pbFactor));
> + }
please don't use braces around single-line expressions
> +
> + m_cplxrSum += rce->rowCplxrSum;
> + m_totalBits += rce->rowTotalBits;
> + m_startEndOrder.incr();
> +
> + /* delay incrementing m_startEndOrder until here to sync with rateControlStart() */
> + if (rce->encodeOrder < m_param->frameNumThreads - 1)
> + {
> + m_startEndOrder.incr(); // faked rateControlEnd calls for negative frames
> + }
> +
we don't normally have trailing white-space within functions
> +}
> +
> void RateControl::checkAndResetABR(RateControlEntry* rce, bool isFrameDone)
> {
> double abrBuffer = 2 * m_param->rc.rateTolerance * m_bitrate;
> diff -r e171ad8bc8a3 -r 902e1d37847f source/encoder/ratecontrol.h
> --- a/source/encoder/ratecontrol.h Fri Jul 11 01:44:43 2014 -0500
> +++ b/source/encoder/ratecontrol.h Fri Jul 11 14:54:00 2014 +0530
> @@ -68,6 +68,8 @@
> double frameSizePlanned; /* frame Size decided by RateCotrol before encoding the frame */
> double bufferRate;
> double movingAvgSum;
> + double rowCplxrSum;
> + int64_t rowTotalBits; /* update cplxrsum and totalbits at the end of 2 rows */
> double qpNoVbv;
> double bufferFill;
> Predictor rowPreds[3][2];
> @@ -135,6 +137,8 @@
> int64_t m_totalBits; /* total bits used for already encoded frames */
> int m_framesDone; /* # of frames passed through RateCotrol already */
>
> + ThreadSafeInteger m_startEndOrder;
> +
> /* hrd stuff */
> SEIBufferingPeriod m_bufPeriodSEI;
> double m_nominalRemovalTime;
> @@ -158,11 +162,13 @@
> // to be called for each frame to process RateControl and set QP
> void rateControlStart(Frame* pic, Lookahead *, RateControlEntry* rce, Encoder* enc);
> void calcAdaptiveQuantFrame(Frame *pic);
> + void rateControlUpdateStats(RateControlEntry* rce);
> int rateControlEnd(Frame* pic, int64_t bits, RateControlEntry* rce, FrameStats* stats);
> int rowDiagonalVbvRateControl(Frame* pic, uint32_t row, RateControlEntry* rce, double& qpVbv);
> void hrdFullness(SEIBufferingPeriod* sei);
> bool init(TComSPS* sps);
> void initHRD(TComSPS* sps);
> + Lock m_lock;
> protected:
>
> static const double s_amortizeFraction;
> _______________________________________________
> 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