[x265] [PATCH] optimize: rewrite TEncBinCABAC::encodeBin

Steve Borho steve at borho.org
Wed Mar 19 03:35:37 CET 2014


On Mon, Mar 17, 2014 at 8:12 PM, Min Chen <chenm003 at 163.com> wrote:
> # HG changeset patch
> # User Min Chen <chenm003 at 163.com>
> # Date 1395105163 25200
> # Node ID a56d6e0b44894e9ab81bfa971ec070bd2569ed72
> # Parent  8d5deb7cafd83ac554489deb8577f905a0cda6b3
> optimize: rewrite TEncBinCABAC::encodeBin

This was pushed yesterday but I've found it introduced a compile
warning on MinGW:

x265/source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp:361:22: warning:
declaration of 'byte' shadows a global declaration [-Wshadow]
             uint32_t byte = m_bufferedByte + carry;
                      ^

> diff -r 8d5deb7cafd8 -r a56d6e0b4489 source/Lib/TLibCommon/ContextTables.h
> --- a/source/Lib/TLibCommon/ContextTables.h     Mon Mar 17 00:47:24 2014 -0500
> +++ b/source/Lib/TLibCommon/ContextTables.h     Mon Mar 17 18:12:43 2014 -0700
> @@ -136,7 +136,7 @@
>      uint8_t bBinsCoded;
>  } ContextModel;
>
> -extern const int     g_entropyBits[128];
> +extern const uint32_t g_entropyBits[128];
>  extern const uint8_t g_nextState[128][2];
>  uint8_t sbacInit(int qp, int initValue);   ///< initialize state with initial probability
>
> diff -r 8d5deb7cafd8 -r a56d6e0b4489 source/Lib/TLibCommon/TComRom.cpp
> --- a/source/Lib/TLibCommon/TComRom.cpp Mon Mar 17 00:47:24 2014 -0500
> +++ b/source/Lib/TLibCommon/TComRom.cpp Mon Mar 17 18:12:43 2014 -0700
> @@ -573,18 +573,6 @@
>      {   2,   2,   2,   2 }
>  };
>
> -const uint8_t g_renormTable[32] =
> -{
> -    6,  5,  4,  4,
> -    3,  3,  3,  3,
> -    2,  2,  2,  2,
> -    2,  2,  2,  2,
> -    1,  1,  1,  1,
> -    1,  1,  1,  1,
> -    1,  1,  1,  1,
> -    1,  1,  1,  1
> -};
> -
>  const uint8_t x265_exp2_lut[64] =
>  {
>      0,  3,  6,  8,  11, 14,  17,  20,  23,  26,  29,  32,  36,  39,  42,  45,
> diff -r 8d5deb7cafd8 -r a56d6e0b4489 source/Lib/TLibCommon/TComRom.h
> --- a/source/Lib/TLibCommon/TComRom.h   Mon Mar 17 00:47:24 2014 -0500
> +++ b/source/Lib/TLibCommon/TComRom.h   Mon Mar 17 18:12:43 2014 -0700
> @@ -272,7 +272,6 @@
>  extern const double x265_lambda2_non_I[MAX_MAX_QP + 1];
>  // CABAC tables
>  extern const uint8_t g_lpsTable[64][4];
> -extern const uint8_t g_renormTable[32];
>  extern const uint8_t x265_exp2_lut[64];
>  }
>
> diff -r 8d5deb7cafd8 -r a56d6e0b4489 source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp
> --- a/source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp      Mon Mar 17 00:47:24 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp      Mon Mar 17 18:12:43 2014 -0700
> @@ -37,6 +37,7 @@
>
>  #include "TEncBinCoderCABAC.h"
>  #include "TLibCommon/TComRom.h"
> +#include "threading.h"  // CLZ32
>
>  using namespace x265;
>
> @@ -180,7 +181,7 @@
>
>      uint32_t mstate = ctxModel.m_state;
>
> -    ctxModel.m_state = sbacNext(ctxModel.m_state, binValue);
> +    ctxModel.m_state = sbacNext(mstate, binValue);
>
>      if (m_bIsCounter)
>      {
> @@ -194,25 +195,32 @@
>      uint32_t lps = g_lpsTable[state][(m_range >> 6) & 3];
>      m_range -= lps;
>
> -    int numBits = g_renormTable[lps >> 3];
> +    assert(lps != 0);
> +
> +    int numBits = (uint32_t)(m_range - 256) >> 31;
> +    uint32_t low = m_low;
> +    uint32_t range = m_range;
>      if (binValue != mps)
>      {
> -        m_low     = (m_low + m_range) << numBits;
> -        m_range   = lps << numBits;
> +        // NOTE: lps is non-zero and the maximum of idx is 8 because lps less than 256
> +        //numBits   = g_renormTable[lps >> 3];
> +        unsigned long idx;
> +        CLZ32(idx, lps);
> +        numBits = 8 - idx;
> +        if (numBits >= 6)
> +            numBits = 6;
> +
> +        low    += range;
> +        range   = lps;
>      }
> -    else
> -    {
> -        if (m_range >= 256)
> -        {
> -            return;
> -        }
> -        numBits = 1;
> -        m_low <<= 1;
> -        m_range <<= 1;
> -    }
> +    m_low = (low << numBits);
> +    m_range = (range << numBits);
>      m_bitsLeft += numBits;
>
> -    testAndWriteOut();
> +    if (m_bitsLeft >= 0)
> +    {
> +        writeOut();
> +    }
>  }
>
>  /**
> @@ -240,7 +248,10 @@
>      }
>      m_bitsLeft++;
>
> -    testAndWriteOut();
> +    if (m_bitsLeft >= 0)
> +    {
> +        writeOut();
> +    }
>  }
>
>  /**
> @@ -274,14 +285,20 @@
>          binValues -= pattern << numBins;
>          m_bitsLeft += 8;
>
> -        testAndWriteOut();
> +        if (m_bitsLeft >= 0)
> +        {
> +            writeOut();
> +        }
>      }
>
>      m_low <<= numBins;
>      m_low += m_range * binValues;
>      m_bitsLeft += numBins;
>
> -    testAndWriteOut();
> +    if (m_bitsLeft >= 0)
> +    {
> +        writeOut();
> +    }
>  }
>
>  /**
> @@ -316,11 +333,6 @@
>          m_bitsLeft++;
>      }
>
> -    testAndWriteOut();
> -}
> -
> -void TEncBinCABAC::testAndWriteOut()
> -{
>      if (m_bitsLeft >= 0)
>      {
>          writeOut();
> diff -r 8d5deb7cafd8 -r a56d6e0b4489 source/Lib/TLibEncoder/TEncBinCoderCABAC.h
> --- a/source/Lib/TLibEncoder/TEncBinCoderCABAC.h        Mon Mar 17 00:47:24 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncBinCoderCABAC.h        Mon Mar 17 18:12:43 2014 -0700
> @@ -85,7 +85,6 @@
>
>  protected:
>
> -    void testAndWriteOut();
>      void writeOut();
>
>  public:
> diff -r 8d5deb7cafd8 -r a56d6e0b4489 source/Lib/TLibEncoder/TEncSbac.cpp
> --- a/source/Lib/TLibEncoder/TEncSbac.cpp       Mon Mar 17 00:47:24 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncSbac.cpp       Mon Mar 17 18:12:43 2014 -0700
> @@ -61,7 +61,7 @@
>
>  #endif // if ENC_DEC_TRACE
>
> -const int g_entropyBits[128] =
> +const uint32_t g_entropyBits[128] =
>  {
>      // Corrected table, most notably for last state
>      0x07b23, 0x085f9, 0x074a0, 0x08cbc, 0x06ee4, 0x09354, 0x067f4, 0x09c1b, 0x060b0, 0x0a62a, 0x05a9c, 0x0af5b, 0x0548d, 0x0b955, 0x04f56, 0x0c2a9,
> diff -r 8d5deb7cafd8 -r a56d6e0b4489 source/Lib/TLibEncoder/TEncSbac.h
> --- a/source/Lib/TLibEncoder/TEncSbac.h Mon Mar 17 00:47:24 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncSbac.h Mon Mar 17 18:12:43 2014 -0700
> @@ -58,6 +58,8 @@
>  class TEncSbac : public SyntaxElementWriter, public TEncEntropyIf
>  {
>  public:
> +    uint64_t pad;
> +    ContextModel m_contextModels[MAX_OFF_CTX_MOD];
>
>      TComSlice*    m_slice;
>      TEncBinCABAC* m_binIf;
> @@ -153,8 +155,6 @@
>      void xCopyContextsFrom(TEncSbac* src);
>      void xCodePredWeightTable(TComSlice* slice);
>      void xCodeScalingList(TComScalingList* scalingList, uint32_t sizeId, uint32_t listId);
> -
> -    ContextModel         m_contextModels[MAX_OFF_CTX_MOD];
>  };
>  }
>  //! \}
>
> _______________________________________________
> 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