[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