[x265] [PATCH] cabac: cleanup TEncBinCoderCABACCounter to reduce C++ feature

Steve Borho steve at borho.org
Sat Oct 12 22:05:38 CEST 2013


On Sat, Oct 12, 2013 at 3:10 AM, Min Chen <chenm003 at 163.com> wrote:

> # HG changeset patch
> # User Min Chen <chenm003 at 163.com>
> # Date 1381565425 -28800
> # Node ID e5778c8db6af3cc61e1affc600324a93df57a11b
> # Parent  9a02765f182e9da2924113f7e712abf3ea22759f
> cabac: cleanup TEncBinCoderCABACCounter to reduce C++ feature
>
> diff -r 9a02765f182e -r e5778c8db6af
> source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp
> --- a/source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp      Fri Oct 11
> 23:41:41 2013 -0500
> +++ b/source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp      Sat Oct 12
> 16:10:25 2013 +0800
> @@ -47,6 +47,7 @@
>      : m_pcTComBitIf(0)
>      , m_binCountIncrement(0)
>      , m_fracBits(0)
> +    , m_isCounter(false)
>  {}
>
>  TEncBinCABAC::~TEncBinCABAC()
> @@ -73,6 +74,14 @@
>
>  void TEncBinCABAC::finish()
>  {
> +    if (m_isCounter)
> +    {
> +        // TODO: why write 0 bits?
> +        m_pcTComBitIf->write(0, UInt(m_fracBits >> 15));
> +        m_fracBits &= 32767;
> +        assert(0);
> +    }
> +
>      if (m_uiLow >> (32 - m_bitsLeft))
>

Can you make a sweep through the CABAC source files and remove hungarian
notation (separate patch, of course)


>      {
>          //assert( m_numBufferedBytes > 0 );
> @@ -166,7 +175,10 @@
>
>  UInt TEncBinCABAC::getNumWrittenBits()
>  {
> -    return m_pcTComBitIf->getNumberOfWrittenBits() + 8 *
> m_numBufferedBytes + 23 - m_bitsLeft;
> +    if (m_isCounter)
> +        return m_pcTComBitIf->getNumberOfWrittenBits() + UInt(m_fracBits
> >> 15);
> +    else
> +        return m_pcTComBitIf->getNumberOfWrittenBits() + 8 *
> m_numBufferedBytes + 23 - m_bitsLeft;
>  }
>
>  /**
> @@ -186,6 +198,12 @@
>          DTRACE_CABAC_T("\n")
>      }
>      m_uiBinsCoded += m_binCountIncrement;
> +    if (m_isCounter)
> +    {
> +        m_fracBits += rcCtxModel.getEntropyBits(binValue);
> +        rcCtxModel.update(binValue);
> +        return;
> +    }
>      rcCtxModel.setBinsCoded(1);
>
>      UInt  uiLPS   = g_lpsTable[rcCtxModel.getState()][(m_uiRange >> 6) &
> 3];
> @@ -230,6 +248,11 @@
>          DTRACE_CABAC_T("\n")
>      }
>      m_uiBinsCoded += m_binCountIncrement;
> +    if (m_isCounter)
> +    {
> +        m_fracBits += 32768;
> +        return;
> +    }
>      m_uiLow <<= 1;
>      if (binValue)
>      {
> @@ -249,6 +272,11 @@
>  void TEncBinCABAC::encodeBinsEP(UInt binValues, int numBins)
>  {
>      m_uiBinsCoded += numBins & - m_binCountIncrement;
> +    if (m_isCounter)
> +    {
> +        m_fracBits += 32768 * numBins;
> +        return;
> +    }
>
>      for (int i = 0; i < numBins; i++)
>      {
> @@ -285,6 +313,12 @@
>  void TEncBinCABAC::encodeBinTrm(UInt binValue)
>  {
>      m_uiBinsCoded += m_binCountIncrement;
> +    if (m_isCounter)
> +    {
> +        m_fracBits += ContextModel::getEntropyBitsTrm(binValue);
> +        return;
> +    }
> +
>      m_uiRange -= 2;
>      if (binValue)
>      {
> diff -r 9a02765f182e -r e5778c8db6af
> source/Lib/TLibEncoder/TEncBinCoderCABAC.h
> --- a/source/Lib/TLibEncoder/TEncBinCoderCABAC.h        Fri Oct 11
> 23:41:41 2013 -0500
> +++ b/source/Lib/TLibEncoder/TEncBinCoderCABAC.h        Sat Oct 12
> 16:10:25 2013 +0800
> @@ -98,6 +98,7 @@
>      UInt                m_uiBinsCoded;
>      int                 m_binCountIncrement;
>      UInt64              m_fracBits;
> +    bool                m_isCounter;
>  };
>  }
>  //! \}
> diff -r 9a02765f182e -r e5778c8db6af
> source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.cpp
> --- a/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.cpp       Fri Oct 11
> 23:41:41 2013 -0500
> +++ b/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.cpp       Sat Oct 12
> 16:10:25 2013 +0800
> @@ -497,16 +497,17 @@
>
>      int maxDepth = 4;
>      m_rdSbacCoders = new TEncSbac * *[maxDepth + 1];
> -    m_binCoderCABAC = new TEncBinCABACCounter * *[maxDepth + 1];
> +    m_binCoderCABAC = new TEncBinCABAC * *[maxDepth + 1];
>
>      for (int d = 0; d < maxDepth + 1; d++)
>      {
>          m_rdSbacCoders[d] = new TEncSbac*[CI_NUM];
> -        m_binCoderCABAC[d] = new TEncBinCABACCounter*[CI_NUM];
> +        m_binCoderCABAC[d] = new TEncBinCABAC*[CI_NUM];
>          for (int ciIdx = 0; ciIdx < CI_NUM; ciIdx++)
>          {
>              m_rdSbacCoders[d][ciIdx] = new TEncSbac;
> -            m_binCoderCABAC[d][ciIdx] = new TEncBinCABACCounter;
> +            m_binCoderCABAC[d][ciIdx] = new TEncBinCABAC;
> +            m_binCoderCABAC[d][ciIdx]->m_isCounter = true;
>              m_rdSbacCoders[d][ciIdx]->init(m_binCoderCABAC[d][ciIdx]);
>          }
>      }
> diff -r 9a02765f182e -r e5778c8db6af
> source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.h
> --- a/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.h Fri Oct 11
> 23:41:41 2013 -0500
> +++ b/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.h Sat Oct 12
> 16:10:25 2013 +0800
> @@ -63,7 +63,7 @@
>      TEncEntropy*      m_entropyCoder;
>      TEncSbac***       m_rdSbacCoders;            ///< for CABAC
>      TEncSbac*         m_rdGoOnSbacCoder;
> -    TEncBinCABACCounter*** m_binCoderCABAC;          ///< temporal CABAC
> state storage for RD computation
> +    TEncBinCABAC***   m_binCoderCABAC;          ///< temporal CABAC state
> storage for RD computation
>
>      Int64  ***m_count;
>  //[MAX_NUM_SAO_PART][MAX_NUM_SAO_TYPE][MAX_NUM_SAO_CLASS];
>      Int64  ***m_offset;
> //[MAX_NUM_SAO_PART][MAX_NUM_SAO_TYPE][MAX_NUM_SAO_CLASS];
> diff -r 9a02765f182e -r e5778c8db6af source/Lib/TLibEncoder/TEncSbac.h
> --- a/source/Lib/TLibEncoder/TEncSbac.h Fri Oct 11 23:41:41 2013 -0500
> +++ b/source/Lib/TLibEncoder/TEncSbac.h Sat Oct 12 16:10:25 2013 +0800
> @@ -45,7 +45,6 @@
>  #include "TEncEntropy.h"
>  #include "TEncBinCoder.h"
>  #include "TEncBinCoderCABAC.h"
> -#include "TEncBinCoderCABACCounter.h"
>
>  namespace x265 {
>  // private namespace
> diff -r 9a02765f182e -r e5778c8db6af source/encoder/CMakeLists.txt
> --- a/source/encoder/CMakeLists.txt     Fri Oct 11 23:41:41 2013 -0500
> +++ b/source/encoder/CMakeLists.txt     Sat Oct 12 16:10:25 2013 +0800
> @@ -17,7 +17,6 @@
>      ../Lib/TLibEncoder/TEncAnalyze.h
>      ../Lib/TLibEncoder/TEncBinCoder.h
>      ../Lib/TLibEncoder/TEncBinCoderCABAC.h
> -    ../Lib/TLibEncoder/TEncBinCoderCABACCounter.h
>      ../Lib/TLibEncoder/TEncCavlc.h
>      ../Lib/TLibEncoder/TEncCfg.h
>      ../Lib/TLibEncoder/TEncCu.h
> @@ -31,7 +30,6 @@
>      ../Lib/TLibEncoder/SEIwrite.cpp
>      ../Lib/TLibEncoder/SyntaxElementWriter.cpp
>      ../Lib/TLibEncoder/TEncBinCoderCABAC.cpp
> -    ../Lib/TLibEncoder/TEncBinCoderCABACCounter.cpp
>      ../Lib/TLibEncoder/TEncCavlc.cpp
>      ../Lib/TLibEncoder/TEncCu.cpp
>      ../Lib/TLibEncoder/TEncEntropy.cpp
> diff -r 9a02765f182e -r e5778c8db6af source/encoder/cturow.cpp
> --- a/source/encoder/cturow.cpp Fri Oct 11 23:41:41 2013 -0500
> +++ b/source/encoder/cturow.cpp Sat Oct 12 16:10:25 2013 +0800
> @@ -31,22 +31,24 @@
>
>  void CTURow::create(Encoder* top)
>  {
> +    m_rdGoOnBinCodersCABAC.m_isCounter = true;
>      m_rdGoOnSbacCoder.init(&m_rdGoOnBinCodersCABAC);
>      m_sbacCoder.init(&m_binCoderCABAC);
>      m_trQuant.init(1 << top->getQuadtreeTULog2MaxSize(),
> top->param.bEnableRDOQ, top->param.bEnableRDOQTS,
> top->param.bEnableTSkipFast);
>
>      m_rdSbacCoders = new TEncSbac **[g_maxCUDepth + 1];
> -    m_binCodersCABAC = new TEncBinCABACCounter **[g_maxCUDepth + 1];
> +    m_binCodersCABAC = new TEncBinCABAC **[g_maxCUDepth + 1];
>
>      for (UInt depth = 0; depth < g_maxCUDepth + 1; depth++)
>      {
>          m_rdSbacCoders[depth]  = new TEncSbac*[CI_NUM];
> -        m_binCodersCABAC[depth] = new TEncBinCABACCounter*[CI_NUM];
> +        m_binCodersCABAC[depth] = new TEncBinCABAC*[CI_NUM];
>
>          for (int ciIdx = 0; ciIdx < CI_NUM; ciIdx++)
>          {
>              m_rdSbacCoders[depth][ciIdx] = new TEncSbac;
> -            m_binCodersCABAC[depth][ciIdx] = new TEncBinCABACCounter;
> +            m_binCodersCABAC[depth][ciIdx] = new TEncBinCABAC;
> +            m_binCodersCABAC[depth][ciIdx]->m_isCounter = true;
>

this would be a lot cleaner to me if the TEncBinCABAC constructor took a
(bool bIsCounter) argument.


>
>  m_rdSbacCoders[depth][ciIdx]->init(m_binCodersCABAC[depth][ciIdx]);
>          }
>      }
> diff -r 9a02765f182e -r e5778c8db6af source/encoder/cturow.h
> --- a/source/encoder/cturow.h   Fri Oct 11 23:41:41 2013 -0500
> +++ b/source/encoder/cturow.h   Sat Oct 12 16:10:25 2013 +0800
> @@ -49,7 +49,7 @@
>      TEncSbac               m_rdGoOnSbacCoder;
>      TEncSbac               m_bufferSbacCoder;
>      TEncBinCABAC           m_binCoderCABAC;
> -    TEncBinCABACCounter    m_rdGoOnBinCodersCABAC;
> +    TEncBinCABAC           m_rdGoOnBinCodersCABAC;
>      TComBitCounter         m_bitCounter;
>      TComRdCost             m_rdCost;
>      TEncEntropy            m_entropyCoder;
> @@ -57,7 +57,7 @@
>      TEncCu                 m_cuCoder;
>      TComTrQuant            m_trQuant;
>      TEncSbac            ***m_rdSbacCoders;
> -    TEncBinCABACCounter ***m_binCodersCABAC;
> +    TEncBinCABAC        ***m_binCodersCABAC;
>
>      void create(Encoder* top);
>
> diff -r 9a02765f182e -r e5778c8db6af source/encoder/framefilter.cpp
> --- a/source/encoder/framefilter.cpp    Fri Oct 11 23:41:41 2013 -0500
> +++ b/source/encoder/framefilter.cpp    Sat Oct 12 16:10:25 2013 +0800
> @@ -82,6 +82,7 @@
>
>      m_saoRowDelay = m_cfg->param.bEnableLoopFilter ? 1 : 0;
>
>  m_loopFilter.setCfg(pic->getSlice()->getPPS()->getLoopFilterAcrossTilesEnabledFlag());
> +    m_rdGoOnBinCodersCABAC.m_isCounter = true;
>      m_rdGoOnSbacCoder.init(&m_rdGoOnBinCodersCABAC);
>      m_entropyCoder.setEntropyCoder(&m_rdGoOnSbacCoder, pic->getSlice());
>      m_entropyCoder.setBitstream(&m_bitCounter);
> @@ -128,7 +129,7 @@
>      if (row == 0 && m_cfg->param.bEnableSAO)
>      {
>          // NOTE: not need, seems HM's bug, I want to keep output exact
> matched.
> -        m_rdGoOnBinCodersCABAC.m_fracBits =
> ((TEncBinCABACCounter*)((TEncSbac*)m_rdGoOnSbacCoderRow0->m_pcBinIf))->m_fracBits;
> +        m_rdGoOnBinCodersCABAC.m_fracBits =
> ((TEncBinCABAC*)((TEncSbac*)m_rdGoOnSbacCoderRow0->m_pcBinIf))->m_fracBits;
>          m_sao.startSaoEnc(m_pic, &m_entropyCoder, &m_rdGoOnSbacCoder);
>      }
>
> diff -r 9a02765f182e -r e5778c8db6af source/encoder/framefilter.h
> --- a/source/encoder/framefilter.h      Fri Oct 11 23:41:41 2013 -0500
> +++ b/source/encoder/framefilter.h      Sat Oct 12 16:10:25 2013 +0800
> @@ -69,7 +69,7 @@
>      // SAO
>      TEncEntropy                 m_entropyCoder;
>      TEncSbac                    m_rdGoOnSbacCoder;
> -    TEncBinCABACCounter         m_rdGoOnBinCodersCABAC;
> +    TEncBinCABAC                m_rdGoOnBinCodersCABAC;
>      TComBitCounter              m_bitCounter;
>      TEncSbac*                   m_rdGoOnSbacCoderRow0;  // for bitstream
> exact only, depends on HM's bug
>  };
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>



-- 
Steve Borho
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20131012/a2f72962/attachment.html>


More information about the x265-devel mailing list