[x265] [PATCH] Added few varibales in related to ABR stuff in x265_param_t and made corresponding changes in ratecontrol.cpp and .h
Steve Borho
steve at borho.org
Tue Aug 13 09:26:22 CEST 2013
On Tue, Aug 13, 2013 at 1:22 AM, <sumalatha at multicorewareinc.com> wrote:
> # HG changeset patch
> # User sumalatha
> # Date 1376370329 -19800
> # Node ID 3144cbb0d745ffd94a58f5414e3fd8070166a43d
> # Parent c8fff4b1bec8716803984b5d378e917f01720e8b
> Added few varibales in related to ABR stuff in x265_param_t and made
> corresponding changes in ratecontrol.cpp and .h.
>
the commit summary line should be fairly short, use extra lines if you need
to impart more data, for this change I would use:
x265: add rate control parameters to x265_param_t
and make corresponding changes to ratecontrol.cpp and h
>
> diff -r c8fff4b1bec8 -r 3144cbb0d745 source/common/common.cpp
> --- a/source/common/common.cpp Mon Aug 12 22:38:13 2013 -0500
> +++ b/source/common/common.cpp Tue Aug 13 10:35:29 2013 +0530
> @@ -137,6 +137,14 @@
> param->bEnableRDOQTS = 1;
> param->bEnableTransformSkip = 1;
> param->bEnableTSkipFast = 1;
> + //ABR relatedstuff
>
The comment is somewhat off, some of these are for more than just ABR. I
would leave the comment out.
> + param->bitrate = 1000;
> + param->rateTolerance = 1;
> + param->qCompress = 0.6;
> + param->ipFactor = 1.4;
> + param->pbFactor = 1.3;
> + param->qpStep = 4;
> + param->rateControlMode = X265_RC_ABR;
>
These need to be param->rc.rateControlMode, etc.
> }
>
> extern "C"
> diff -r c8fff4b1bec8 -r 3144cbb0d745 source/encoder/ratecontrol.cpp
> --- a/source/encoder/ratecontrol.cpp Mon Aug 12 22:38:13 2013 -0500
> +++ b/source/encoder/ratecontrol.cpp Tue Aug 13 10:35:29 2013 +0530
> @@ -31,20 +31,19 @@
> keyFrameInterval = param->keyframeInterval;
> fps = param->frameRate;
> bframes = param->bframes;
> - //TODO : set default value here,later can get from param as done in
> x264?
> - rateTolerance = 1;
> - //TODO : introduce bitrate var in param and cli options
> - bitrate = param->bitrate * 1000;
> + rateTolerance = param->rc.rateTolerance;
> + bitrate = param->rc.bitrate * 1000;
> fps = param->frameRate;
> - isAbrEnabled = true; // set from param later.
> + rateControlMode = param->rc.rateControlMode;
> ncu = (param->sourceHeight * param->sourceWidth) / pow(2,
> param->maxCUSize);
> lastNonBPictType = -1;
> - //TODO : need to confirm default val if mbtree is disabled
> - qCompress = 1;
> - if (isAbrEnabled)
> + qCompress = param->rc.qCompress;
> + ipFactor = param->rc.ipFactor;
> + pbFactor = param->rc.pbFactor;
> + if (rateControlMode == X265_RC_ABR)
> {
> //TODO : confirm this value. obtained it from x264 when crf is
> disabled , abr enabled.
> -#define ABR_INIT_QP (24 + 6 * (param->internalBitDepth - 8));
> +#define ABR_INIT_QP (24 + 6 * (X265_DEPTH - 8))
> accumPNorm = .01;
> accumPQp = (ABR_INIT_QP)*accumPNorm;
> /* estimated ratio that produces a reasonable QP for the first
> I-frame */
> @@ -52,6 +51,16 @@
> wantedBitsWindow = 1.0 * bitrate / fps;
> lastNonBPictType = I_SLICE;
> }
> + ipOffset = 6.0 * log( param->rc.ipFactor );
> + pbOffset = 6.0 * log( param->rc.pbFactor );
> + for( int i = 0; i < 3; i++ )
> + {
> + lastQScaleFor[i] = qp2qScale( ABR_INIT_QP );
> + lmin[i] = qp2qScale( MIN_QP);
> + lmax[i] = qp2qScale( MAX_QP );
> + }
> + lstep = pow( 2, param->rc.qpStep / 6.0 );
> +
> }
>
> void RateControl::rateControlInit(TComSlice* frame)
> @@ -66,7 +75,7 @@
> float q;
>
> //Always enabling ABR
> - if (isAbrEnabled)
> + if (rateControlMode == X265_RC_ABR)
> {
> q = qScale2qp(rateEstimateQscale(lFrame));
> }
> @@ -86,7 +95,6 @@
>
> void RateControl::accumPQpUpdate()
> {
> - //x264_ratecontrol_t *rc = h->rc;
> accumPQp *= .95;
> accumPNorm *= .95;
> accumPNorm += 1;
> @@ -131,7 +139,6 @@
> else
> q += pbOffset;
>
> - qpNoVbv = q;
> return qp2qScale(q);
> }
> else
> @@ -152,20 +159,14 @@
>
> double wantedBits, overflow = 1;
>
> - lastSatd = 0; //need to get this from lookahead
> //x264_rc_analyse_slice( h );
> - shortTermCplxSum *= 0.5;
> - shortTermCplxCount *= 0.5;
> - //TODO:need to get the duration for each frame
> - //short_term_cplxsum += last_satd /
> (CLIP_DURATION(h->fenc->f_duration) / BASE_FRAME_DURATION);
> - shortTermCplxCount++;
> -
> + lastSatd = 0; //TODO:need to get this from lookahead
> //x264_rc_analyse_slice( h );
> rce->pCount = ncu;
>
> rce->pictType = pictType;
>
> //TODO:wanted_bits_window, fps , h->fenc->i_reordered_pts,
> h->i_reordered_pts_delay, h->fref_nearest[0]->f_qp_avg_rc,
> h->param.rc.f_ip_factor, h->sh.i_type
> //need to checked where it is initialized
> - q = getQScale(rce, wantedBitsWindow / cplxrSum, fps);
> + q = getQScale(rce, wantedBitsWindow / 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. */
> @@ -193,7 +194,7 @@
> && lastNonBPictType != I_SLICE)
> {
> q = qp2qScale(accumPQp / accumPNorm);
> - q /= fabs(h->param.rc.f_ip_factor);
> + q /= fabs(ipFactor);
> }
> else if (fps > 0)
> {
> @@ -212,7 +213,7 @@
> }
> }
>
> - qpNoVbv = qScale2qp(q);
> + //qpNoVbv = qScale2qp(q);
>
> //FIXME use get_diff_limited_q() ?
> //q = clip_qscale( h, pict_type, q );
> @@ -224,7 +225,7 @@
> lastQScale = q;
>
> if (!fps == 0)
> - lastQScaleFor[P_SLICE] = q * fabs(h->param.rc.f_ip_factor);
> + lastQScaleFor[P_SLICE] = q * fabs(ipFactor);
>
> //this is for VBV stuff
> //frame_size_planned = predict_size( &pred[h->sh.i_type], q,
> last_satd );
> @@ -249,7 +250,7 @@
> q = lastQScaleFor[rce->pictType];
> else
> {
> - lastRceq = q;
> + //lastRceq = q;// CHECK: not used further
> q /= rateFactor;
> lastQScale = q;
> }
> diff -r c8fff4b1bec8 -r 3144cbb0d745 source/encoder/ratecontrol.h
> --- a/source/encoder/ratecontrol.h Mon Aug 12 22:38:13 2013 -0500
> +++ b/source/encoder/ratecontrol.h Tue Aug 13 10:35:29 2013 +0530
> @@ -59,8 +59,8 @@
> int ncu; /* number of CUs in a frame */
> TComSlice *curFrame; /* all info abt the current frame */
> SliceType frameType; /* Current frame type */
> - float frameDuration; /* current frame duration in seconds */
> - int fps; /* current frame number TODO: need to initaialize
> in init */
> + //float frameDuration; /* current frame duration in seconds */
> + int fps; /* current frame rate TODO: need to
> initaialize in init */
> int keyFrameInterval; /* TODO: need to initialize in init */
> bool isAbrEnabled;
>
> @@ -75,17 +75,13 @@
> int bframes;
> /* ABR stuff */
> int lastSatd;
> - double lastRceq;
> double cplxrSum; /* sum of bits*qscale/rceq */
> - double expectedBitsSum; /* sum of qscale2bits after rceq,
> ratefactor, and overflow, only includes finished frames */
> - int64_t fillerBitsSum; /* sum in bits of finished frames' filler
> data */
> double wantedBitsWindow; /* target bitrate * window */
> - double cbrDecay;
> - double shortTermCplxSum;
> - double shortTermCplxCount;
> - double rateFactorConstant;
> +
> double ipOffset;
> double pbOffset;
> + float ipFactor;
> + float pbFactor;
>
> int lastNonBPictType;
> double accumPQp; /* for determining I-frame quant */
> @@ -97,7 +93,8 @@
> float qpNoVbv; /* QP for the current frame if 1-pass VBV
> was disabled. */
> double lmin[3]; /* min qscale by frame type */
> double lmax[3];
> - double frameSizePlanned;
> +
> + RcMethod rateControlMode;
>
> RateControl(x265_param_t * param); // constructor for initializing
> values for ratecontrol vars
> void rateControlInit(TComSlice* frame); // to be called for each
> frame to set the reqired parameters for rateControl.
> diff -r c8fff4b1bec8 -r 3144cbb0d745 source/x265.h
> --- a/source/x265.h Mon Aug 12 22:38:13 2013 -0500
> +++ b/source/x265.h Tue Aug 13 10:35:29 2013 +0530
> @@ -155,6 +155,27 @@
> #define X265_LOG_INFO 2
> #define X265_LOG_DEBUG 3
>
> +/* rate tolerance method */
> +typedef enum RcMethod
> +{
> + X265_RC_ABR,
> + X265_RC_CQP
> +}
> +X265_RC_METHODS;
> +
> +typedef struct rate_control_t
> +{
> + double bitrate;
> + double rateTolerance;
> + double qCompress;
> + float ipFactor;
> + float pbFactor;
> + int qpStep;
> + RcMethod rateControlMode;
> +}
> +rate_control_t;
> +
> +
> typedef struct x265_param_t
> {
> int logLevel;
> @@ -218,6 +239,9 @@
>
> // debugging
> int bEnableDecodedPictureHashSEI; ///<
> Checksum(3)/CRC(2)/MD5(1)/disable(0) acting on decoded picture hash SEI
> message
> +
> + //rate control related Stuff
>
again, the comment isn't that helpful as it is self-evidently related to
rate-control, I would leave it off
> + rate_control_t rc;
>
I think the way x264 declares the struct within the struct is cleaner. ie:
struct
{
int bitrate;
...
}
rc;
also, in x264, bitrate parameter is an integer
> }
> x265_param_t;
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> http://mailman.videolan.org/listinfo/x265-devel
>
--
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/private/x265-devel/attachments/20130813/16e41425/attachment.html>
More information about the x265-devel
mailing list