[x265] [PATCH] stats: move FrameStats from ratecontrol.h to frame.h

Steve Borho steve at borho.org
Tue Jun 9 17:37:01 CEST 2015


On 06/09, Divya Manivannan wrote:
> # HG changeset patch
> # User Divya Manivannan <divya at multicorewareinc.com>
> # Date 1433855003 -19800
> #      Tue Jun 09 18:33:23 2015 +0530
> # Node ID 15ec1081fa3d13dcd5235bc8b49d49e4478d71c8
> # Parent  6538cd24ab98e36b2346298237f27198c6e5aad2
> stats: move FrameStats from ratecontrol.h to frame.h
> 
> diff -r 6538cd24ab98 -r 15ec1081fa3d source/common/frame.h
> --- a/source/common/frame.h	Tue Jun 09 18:15:48 2015 +0530
> +++ b/source/common/frame.h	Tue Jun 09 18:33:23 2015 +0530
> @@ -35,6 +35,23 @@
>  class PicYuv;
>  struct SPS;
>  
> +/* Current frame stats for 2 pass */
> +struct FrameStats
> +{
> +    int         mvBits;    /* MV bits (MV+Ref+Block Type) */
> +    int         coeffBits; /* Texture bits (DCT coefs) */
> +    int         miscBits;
> +
> +    int         intra8x8Cnt;
> +    int         inter8x8Cnt;
> +    int         skip8x8Cnt;
> +
> +    /* CU type counts stored as percentage */
> +    double      percent8x8Intra;
> +    double      percent8x8Inter;
> +    double      percent8x8Skip;
> +};
> +
>  #define IS_REFERENCED(frame) (frame->m_lowres.sliceType != X265_TYPE_B) 
>  
>  class Frame
> @@ -67,6 +84,7 @@
>      Frame*                 m_prev;
>      x265_param*            m_param;              // Points to the latest param set for the frame.
>      x265_analysis_data     m_analysisData;
> +    FrameStats             m_frameStats;          // stats of current frame for multi-pass encodes
>      Frame();


in general, data that is generated during the encode and kept until the
frame is discarded is kept in FrameData. This way you do not waste
memory on this stuff for the frames queued in the lookahead.

>      bool create(x265_param *param);
> diff -r 6538cd24ab98 -r 15ec1081fa3d source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp	Tue Jun 09 18:15:48 2015 +0530
> +++ b/source/encoder/frameencoder.cpp	Tue Jun 09 18:33:23 2015 +0530
> @@ -59,7 +59,6 @@
>      m_cuGeoms = NULL;
>      m_ctuGeomMap = NULL;
>      m_localTldIdx = 0;
> -    memset(&m_frameStats, 0, sizeof(m_frameStats));
>      memset(&m_rce, 0, sizeof(RateControlEntry));
>  }
>  
> @@ -313,7 +312,7 @@
>      m_SSDY = m_SSDU = m_SSDV = 0;
>      m_ssim = 0;
>      m_ssimCnt = 0;
> -    memset(&m_frameStats, 0, sizeof(m_frameStats));
> +    memset(&(m_frame->m_frameStats), 0, sizeof(m_frame->m_frameStats));
>  
>      /* Emit access unit delimiter unless this is the first frame and the user is
>       * not repeating headers (since AUD is supposed to be the first NAL in the access
> @@ -559,17 +558,17 @@
>          // accumulate intra,inter,skip cu count per frame for 2 pass
>          for (uint32_t i = 0; i < m_numRows; i++)
>          {
> -            m_frameStats.mvBits    += m_rows[i].rowStats.mvBits;
> -            m_frameStats.coeffBits += m_rows[i].rowStats.coeffBits;
> -            m_frameStats.miscBits  += m_rows[i].rowStats.miscBits;
> -            totalI                 += m_rows[i].rowStats.intra8x8Cnt;
> -            totalP                 += m_rows[i].rowStats.inter8x8Cnt;
> -            totalSkip              += m_rows[i].rowStats.skip8x8Cnt;
> +            m_frame->m_frameStats.mvBits    += m_rows[i].rowStats.mvBits;
> +            m_frame->m_frameStats.coeffBits += m_rows[i].rowStats.coeffBits;
> +            m_frame->m_frameStats.miscBits  += m_rows[i].rowStats.miscBits;
> +            totalI                          += m_rows[i].rowStats.intra8x8Cnt;
> +            totalP                          += m_rows[i].rowStats.inter8x8Cnt;
> +            totalSkip                       += m_rows[i].rowStats.skip8x8Cnt;
>          }
>          int totalCuCount = totalI + totalP + totalSkip;
> -        m_frameStats.percent8x8Intra = (double)totalI / totalCuCount;
> -        m_frameStats.percent8x8Inter = (double)totalP / totalCuCount;
> -        m_frameStats.percent8x8Skip  = (double)totalSkip / totalCuCount;
> +        m_frame->m_frameStats.percent8x8Intra = (double)totalI / totalCuCount;
> +        m_frame->m_frameStats.percent8x8Inter = (double)totalP / totalCuCount;
> +        m_frame->m_frameStats.percent8x8Skip  = (double)totalSkip / totalCuCount;
>      }
>  
>      m_bs.resetBits();
> @@ -638,7 +637,7 @@
>      m_endCompressTime = x265_mdate();
>  
>      /* rateControlEnd may also block for earlier frames to call rateControlUpdateStats */
> -    if (m_top->m_rateControl->rateControlEnd(m_frame, m_accessUnitBits, &m_rce, &m_frameStats) < 0)
> +    if (m_top->m_rateControl->rateControlEnd(m_frame, m_accessUnitBits, &m_rce) < 0)
>          m_top->m_aborted = true;
>  
>      /* Decrement referenced frame reference counts, allow them to be recycled */
> diff -r 6538cd24ab98 -r 15ec1081fa3d source/encoder/frameencoder.h
> --- a/source/encoder/frameencoder.h	Tue Jun 09 18:15:48 2015 +0530
> +++ b/source/encoder/frameencoder.h	Tue Jun 09 18:33:23 2015 +0530
> @@ -157,7 +157,6 @@
>      uint32_t                 m_crc[3];
>      uint32_t                 m_checksum[3];
>      StatisticLog             m_sliceTypeLog[3];     // per-slice type CU statistics
> -    FrameStats               m_frameStats;          // stats of current frame for multi-pass encodes
>  
>      volatile int             m_activeWorkerCount;        // count of workers currently encoding or filtering CTUs
>      volatile int             m_totalActiveWorkerCount;   // sum of m_activeWorkerCount sampled at end of each CTU
> diff -r 6538cd24ab98 -r 15ec1081fa3d source/encoder/ratecontrol.cpp
> --- a/source/encoder/ratecontrol.cpp	Tue Jun 09 18:15:48 2015 +0530
> +++ b/source/encoder/ratecontrol.cpp	Tue Jun 09 18:33:23 2015 +0530
> @@ -2146,7 +2146,7 @@
>  }
>  
>  /* After encoding one frame, update rate control state */
> -int RateControl::rateControlEnd(Frame* curFrame, int64_t bits, RateControlEntry* rce, FrameStats* stats)
> +int RateControl::rateControlEnd(Frame* curFrame, int64_t bits, RateControlEntry* rce)
>  {
>      int orderValue = m_startEndOrder.get();
>      int endOrdinal = (rce->encodeOrder + m_param->frameNumThreads) * 2 - 1;
> @@ -2217,12 +2217,12 @@
>                      "in:%d out:%d type:%c q:%.2f q-aq:%.2f tex:%d mv:%d misc:%d icu:%.2f pcu:%.2f scu:%.2f ;\n",
>                      rce->poc, rce->encodeOrder,
>                      cType, curEncData.m_avgQpRc, curEncData.m_avgQpAq,
> -                    stats->coeffBits,
> -                    stats->mvBits,
> -                    stats->miscBits,
> -                    stats->percent8x8Intra * m_ncu,
> -                    stats->percent8x8Inter * m_ncu,
> -                    stats->percent8x8Skip  * m_ncu) < 0)
> +                    curFrame->m_frameStats.coeffBits,
> +                    curFrame->m_frameStats.mvBits,
> +                    curFrame->m_frameStats.miscBits,
> +                    curFrame->m_frameStats.percent8x8Intra * m_ncu,
> +                    curFrame->m_frameStats.percent8x8Inter * m_ncu,
> +                    curFrame->m_frameStats.percent8x8Skip  * m_ncu) < 0)
>              goto writeFailure;
>          /* Don't re-write the data in multi-pass mode. */
>          if (m_param->rc.cuTree && IS_REFERENCED(curFrame) && !m_param->rc.bStatRead)
> diff -r 6538cd24ab98 -r 15ec1081fa3d source/encoder/ratecontrol.h
> --- a/source/encoder/ratecontrol.h	Tue Jun 09 18:15:48 2015 +0530
> +++ b/source/encoder/ratecontrol.h	Tue Jun 09 18:33:23 2015 +0530
> @@ -46,23 +46,6 @@
>  #define MIN_AMORTIZE_FRACTION 0.2
>  #define CLIP_DURATION(f) x265_clip3(MIN_FRAME_DURATION, MAX_FRAME_DURATION, f)
>  
> -/* Current frame stats for 2 pass */
> -struct FrameStats
> -{
> -    int         mvBits;    /* MV bits (MV+Ref+Block Type) */
> -    int         coeffBits; /* Texture bits (DCT coefs) */
> -    int         miscBits;
> -
> -    int         intra8x8Cnt;
> -    int         inter8x8Cnt;
> -    int         skip8x8Cnt;
> -    
> -    /* CU type counts stored as percentage */
> -    double      percent8x8Intra;
> -    double      percent8x8Inter;
> -    double      percent8x8Skip;
> -};
> -
>  struct Predictor
>  {
>      double coeff;
> @@ -241,7 +224,7 @@
>      // to be called for each curFrame to process RateControl and set QP
>      int  rateControlStart(Frame* curFrame, RateControlEntry* rce, Encoder* enc);
>      void rateControlUpdateStats(RateControlEntry* rce);
> -    int  rateControlEnd(Frame* curFrame, int64_t bits, RateControlEntry* rce, FrameStats* stats);
> +    int  rateControlEnd(Frame* curFrame, int64_t bits, RateControlEntry* rce);
>      int  rowDiagonalVbvRateControl(Frame* curFrame, uint32_t row, RateControlEntry* rce, double& qpVbv);
>      int  rateControlSliceType(int frameNum);
>      bool cuTreeReadFor2Pass(Frame* curFrame);
> _______________________________________________
> 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