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

Steve Borho steve at borho.org
Wed Jun 10 17:33:27 CEST 2015


On 06/10, Divya Manivannan wrote:
> # HG changeset patch
> # User Divya Manivannan <divya at multicorewareinc.com>
> # Date 1433937731 -19800
> #      Wed Jun 10 17:32:11 2015 +0530
> # Node ID fbd752fe09427150250cdc13c30506c17d330052
> # Parent  6245476add8f0562e3ccb657f572ff94fe96adf0
> stats: move FrameStats from ratecontrol.h to framedata.h
> 
> diff -r 6245476add8f -r fbd752fe0942 source/common/framedata.h
> --- a/source/common/framedata.h	Wed Jun 10 11:54:27 2015 +0530
> +++ b/source/common/framedata.h	Wed Jun 10 17:32:11 2015 +0530
> @@ -34,6 +34,23 @@
>  class PicYuv;
>  class JobProvider;
>  
> +/* 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;
> +};
> +
>  /* Per-frame data that is used during encodes and referenced while the picture
>   * is available for reference. A FrameData instance is attached to a Frame as it
>   * comes out of the lookahead. Frames which are not being encoded do not have a
> @@ -85,6 +102,7 @@
>  
>      RCStatCU*      m_cuStat;
>      RCStatRow*     m_rowStat;
> +    FrameStats     m_frameStats; // stats of current frame for multi-pass encodes
>  
>      double         m_avgQpRc;    /* avg QP as decided by rate-control */
>      double         m_avgQpAq;    /* avg QP as decided by AQ in addition to rate-control */
> diff -r 6245476add8f -r fbd752fe0942 source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp	Wed Jun 10 11:54:27 2015 +0530
> +++ b/source/encoder/frameencoder.cpp	Wed Jun 10 17:32:11 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_encData->m_frameStats), 0, sizeof(m_frame->m_encData->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_encData->m_frameStats.mvBits    += m_rows[i].rowStats.mvBits;
> +            m_frame->m_encData->m_frameStats.coeffBits += m_rows[i].rowStats.coeffBits;
> +            m_frame->m_encData->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_encData->m_frameStats.percent8x8Intra = (double)totalI / totalCuCount;
> +        m_frame->m_encData->m_frameStats.percent8x8Inter = (double)totalP / totalCuCount;
> +        m_frame->m_encData->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 6245476add8f -r fbd752fe0942 source/encoder/frameencoder.h
> --- a/source/encoder/frameencoder.h	Wed Jun 10 11:54:27 2015 +0530
> +++ b/source/encoder/frameencoder.h	Wed Jun 10 17:32:11 2015 +0530
> @@ -29,6 +29,7 @@
>  #include "wavefront.h"
>  #include "bitstream.h"
>  #include "frame.h"
> +#include "framedata.h"

it seems unnecessary to include framedata.h here, perhaps just
frameencoder.cpp. this is a minor nit

>  #include "picyuv.h"
>  #include "md5.h"
>  
> @@ -157,7 +158,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 6245476add8f -r fbd752fe0942 source/encoder/ratecontrol.cpp
> --- a/source/encoder/ratecontrol.cpp	Wed Jun 10 11:54:27 2015 +0530
> +++ b/source/encoder/ratecontrol.cpp	Wed Jun 10 17:32:11 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_encData->m_frameStats.coeffBits,
> +                    curFrame->m_encData->m_frameStats.mvBits,
> +                    curFrame->m_encData->m_frameStats.miscBits,
> +                    curFrame->m_encData->m_frameStats.percent8x8Intra * m_ncu,
> +                    curFrame->m_encData->m_frameStats.percent8x8Inter * m_ncu,
> +                    curFrame->m_encData->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 6245476add8f -r fbd752fe0942 source/encoder/ratecontrol.h
> --- a/source/encoder/ratecontrol.h	Wed Jun 10 11:54:27 2015 +0530
> +++ b/source/encoder/ratecontrol.h	Wed Jun 10 17:32:11 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