[x265] [PATCH] Entropy: Replaced getCtxQtCbf() with table

Deepthi Nandakumar deepthi at multicorewareinc.com
Tue Sep 2 08:34:54 CEST 2014


Is it also possible to change codeQtCbf so that only uint32_t cbf needs to
be passed in, and not entire TComDataCU*? This will help since our coming
refactors will get rid of TComDataCU.




On Mon, Sep 1, 2014 at 3:17 PM, Steve Borho <steve at borho.org> wrote:

> On 09/01, ashok at multicorewareinc.com wrote:
> > # HG changeset patch
> > # User Ashok Kumar Mishra<ashok at multicorewareinc.com>
> > # Date 1409562155 -19800
> > #      Mon Sep 01 14:32:35 2014 +0530
> > # Node ID e7f58267b15c2d6d477bd370f936d00377d2bbc3
> > # Parent  4d96eb40f4d6e5cd0883a0a61f20bf00c07ed8f0
> > Entropy: Replaced getCtxQtCbf() with table
>
> nice! but a nit
>
> > diff -r 4d96eb40f4d6 -r e7f58267b15c
> source/Lib/TLibCommon/ContextTables.h
> > --- a/source/Lib/TLibCommon/ContextTables.h   Thu Aug 28 13:14:34 2014
> +0530
> > +++ b/source/Lib/TLibCommon/ContextTables.h   Mon Sep 01 14:32:35 2014
> +0530
> > @@ -144,6 +144,7 @@
> >  #define NEIGHBOURHOOD_00_CONTEXT_1_THRESHOLD_4x4  3
> >  #define NEIGHBOURHOOD_00_CONTEXT_2_THRESHOLD_4x4  1
> >
> > +static const uint32_t CtxCbf[3][3] = { { 1, 0, 0 }, { 2, 3, 4 }, { 2,
> 3, 4} };
>
> upper-case names are reserved for classes/structs.
>
> static const uint32_t ctxCbf[MAX_NUM_CHANNEL_TYPE][3] = ...
>
> >  static const uint32_t
> significanceMapContextSetStart[MAX_NUM_CHANNEL_TYPE][3] = { { 0,  9, 21 },
> { 0,  9, 12 } };
> >  static const uint32_t
> significanceMapContextSetSize[MAX_NUM_CHANNEL_TYPE][3]  = { { 9, 12,  6 },
> { 9,  3,  3 } };
> >  static const uint32_t
> nonDiagonalScan8x8ContextOffset[MAX_NUM_CHANNEL_TYPE]   = {  6, 0  };
> > diff -r 4d96eb40f4d6 -r e7f58267b15c
> source/Lib/TLibEncoder/TEncSearch.cpp
> > --- a/source/Lib/TLibEncoder/TEncSearch.cpp   Thu Aug 28 13:14:34 2014
> +0530
> > +++ b/source/Lib/TLibEncoder/TEncSearch.cpp   Mon Sep 01 14:32:35 2014
> +0530
> > @@ -2798,7 +2798,7 @@
> >                  else
> >                      singleCostY = m_rdCost.calcRdCost(nonZeroDistY,
> singleBitsComp[TEXT_LUMA][0]);
> >                  m_entropyCoder->resetBits();
> > -                m_entropyCoder->codeQtCbfZero(cu, TEXT_LUMA, trMode);
> > +                m_entropyCoder->codeQtCbfZero(TEXT_LUMA, trMode);
>
> unrelated to this patch, but why is depth here stored in trMode/trModeC?
>
> >                  const uint32_t nullBitsY =
> m_entropyCoder->getNumberOfWrittenBits();
> >                  uint64_t nullCostY = 0;
> >                  if (m_rdCost.m_psyRd)
> > @@ -2826,7 +2826,7 @@
> >          else if (checkTransformSkipY)
> >          {
> >              m_entropyCoder->resetBits();
> > -            m_entropyCoder->codeQtCbfZero(cu, TEXT_LUMA, trMode);
> > +            m_entropyCoder->codeQtCbfZero(TEXT_LUMA, trMode);
> >              const uint32_t nullBitsY =
> m_entropyCoder->getNumberOfWrittenBits();
> >              if (m_rdCost.m_psyRd)
> >                  minCost[TEXT_LUMA][0] = m_rdCost.calcPsyRdCost(distY,
> nullBitsY, psyEnergyY);
> > @@ -2898,7 +2898,7 @@
> >                          else
> >                              singleCostU =
> m_rdCost.calcRdCost(nonZeroDistU,
> singleBitsComp[TEXT_CHROMA_U][tuIterator.section]);
> >                          m_entropyCoder->resetBits();
> > -                        m_entropyCoder->codeQtCbfZero(cu,
> TEXT_CHROMA_U, trMode);
> > +                        m_entropyCoder->codeQtCbfZero(TEXT_CHROMA_U,
> trMode);
> >                          const uint32_t nullBitsU =
> m_entropyCoder->getNumberOfWrittenBits();
> >                          uint64_t nullCostU = 0;
> >                          if (m_rdCost.m_psyRd)
> > @@ -2926,7 +2926,7 @@
> >                  else if (checkTransformSkipUV)
> >                  {
> >                      m_entropyCoder->resetBits();
> > -                    m_entropyCoder->codeQtCbfZero(cu, TEXT_CHROMA_U,
> trModeC);
> > +                    m_entropyCoder->codeQtCbfZero(TEXT_CHROMA_U,
> trModeC);
> >                      const uint32_t nullBitsU =
> m_entropyCoder->getNumberOfWrittenBits();
> >                      if (m_rdCost.m_psyRd)
> >                          minCost[TEXT_CHROMA_U][tuIterator.section] =
> m_rdCost.calcPsyRdCost(distU, nullBitsU, psyEnergyU);
> > @@ -2980,7 +2980,7 @@
> >                          else
> >                              singleCostV =
> m_rdCost.calcRdCost(nonZeroDistV,
> singleBitsComp[TEXT_CHROMA_V][tuIterator.section]);
> >                          m_entropyCoder->resetBits();
> > -                        m_entropyCoder->codeQtCbfZero(cu,
> TEXT_CHROMA_V, trMode);
> > +                        m_entropyCoder->codeQtCbfZero(TEXT_CHROMA_V,
> trMode);
> >                          const uint32_t nullBitsV =
> m_entropyCoder->getNumberOfWrittenBits();
> >                          uint64_t nullCostV = 0;
> >                          if (m_rdCost.m_psyRd)
> > @@ -3008,7 +3008,7 @@
> >                  else if (checkTransformSkipUV)
> >                  {
> >                      m_entropyCoder->resetBits();
> > -                    m_entropyCoder->codeQtCbfZero(cu, TEXT_CHROMA_V,
> trModeC);
> > +                    m_entropyCoder->codeQtCbfZero(TEXT_CHROMA_V,
> trModeC);
> >                      const uint32_t nullBitsV =
> m_entropyCoder->getNumberOfWrittenBits();
> >                      if (m_rdCost.m_psyRd)
> >                          minCost[TEXT_CHROMA_V][tuIterator.section] =
> m_rdCost.calcPsyRdCost(distV, nullBitsV, psyEnergyV);
> > diff -r 4d96eb40f4d6 -r e7f58267b15c source/encoder/entropy.cpp
> > --- a/source/encoder/entropy.cpp      Thu Aug 28 13:14:34 2014 +0530
> > +++ b/source/encoder/entropy.cpp      Mon Sep 01 14:32:35 2014 +0530
> > @@ -1469,7 +1469,7 @@
> >
> >  void Entropy::codeQtCbf(TComDataCU* cu, uint32_t absPartIdx, uint32_t
> absPartIdxStep, uint32_t width, uint32_t height, TextType ttype, uint32_t
> trDepth, bool lowestLevel)
> >  {
> > -    uint32_t ctx = cu->getCtxQtCbf(ttype, trDepth);
> > +    uint32_t ctx = CtxCbf[ttype][trDepth];
> >
> >      bool canQuadSplit       = (width >= (MIN_TU_SIZE * 2)) && (height
> >= (MIN_TU_SIZE * 2));
> >      uint32_t lowestTUDepth  = trDepth + ((!lowestLevel &&
> !canQuadSplit) ? 1 : 0); // unsplittable TUs inherit their parent's CBF
> > @@ -1498,7 +1498,7 @@
> >
> >  void Entropy::codeQtCbf(TComDataCU* cu, uint32_t absPartIdx, TextType
> ttype, uint32_t trDepth)
> >  {
> > -    uint32_t ctx = cu->getCtxQtCbf(ttype, trDepth);
> > +    uint32_t ctx = CtxCbf[ttype][trDepth];
> >      uint32_t cbf = cu->getCbf(absPartIdx, ttype, trDepth);
> >      encodeBin(cbf, m_contextState[OFF_QT_CBF_CTX + ctx]);
> >  }
> > @@ -1522,14 +1522,12 @@
> >      encodeBin(cbf, m_contextState[OFF_QT_ROOT_CBF_CTX + ctx]);
> >  }
> >
> > -void Entropy::codeQtCbfZero(TComDataCU* cu, TextType ttype, uint32_t
> trDepth)
> > +void Entropy::codeQtCbfZero(TextType ttype, uint32_t trDepth)
> >  {
> >      // this function is only used to estimate the bits when cbf is 0
> >      // and will never be called when writing the bistream. do not need
> to write log
> > -    uint32_t cbf = 0;
> > -    uint32_t ctx = cu->getCtxQtCbf(ttype, trDepth);
> > -
> > -    encodeBin(cbf, m_contextState[OFF_QT_CBF_CTX + ctx]);
> > +    uint32_t ctx = CtxCbf[ttype][trDepth];
> > +    encodeBin(0, m_contextState[OFF_QT_CBF_CTX + ctx]);
> >  }
> >
> >  void Entropy::codeQtRootCbfZero(TComDataCU*)
> > diff -r 4d96eb40f4d6 -r e7f58267b15c source/encoder/entropy.h
> > --- a/source/encoder/entropy.h        Thu Aug 28 13:14:34 2014 +0530
> > +++ b/source/encoder/entropy.h        Mon Sep 01 14:32:35 2014 +0530
> > @@ -39,6 +39,7 @@
> >  class TComDataCU;
> >  class ScalingList;
> >
> > +
> >  enum SplitType
> >  {
> >      DONT_SPLIT            = 0,
> > @@ -167,7 +168,7 @@
> >      void codeTransformSubdivFlag(uint32_t symbol, uint32_t ctx);
> >      void codeQtCbf(TComDataCU* cu, uint32_t absPartIdx, uint32_t
> absPartIdxStep, uint32_t width, uint32_t height, TextType ttype, uint32_t
> trDepth, bool lowestLevel);
> >      void codeQtCbf(TComDataCU* cu, uint32_t absPartIdx, TextType ttype,
> uint32_t trDepth);
> > -    void codeQtCbfZero(TComDataCU* cu, TextType ttype, uint32_t
> trDepth);
> > +    void codeQtCbfZero(TextType ttype, uint32_t trDepth);
> >      void codeQtRootCbfZero(TComDataCU* cu);
> >      void codeCoeff(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth,
> bool& bCodeDQP);
> >      void codeCoeffNxN(TComDataCU* cu, coeff_t* coef, uint32_t
> absPartIdx, uint32_t log2TrSize, TextType ttype);
> > _______________________________________________
> > x265-devel mailing list
> > x265-devel at videolan.org
> > https://mailman.videolan.org/listinfo/x265-devel
>
> --
> Steve Borho
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20140902/4b2fb36e/attachment-0001.html>


More information about the x265-devel mailing list