[x265] [PATCH] merge multiple encodeBinEP to encodeBinsEP

Steve Borho steve at borho.org
Tue Oct 22 04:33:51 CEST 2013


On Mon, Oct 21, 2013 at 7:37 AM, Min Chen <chenm003 at 163.com> wrote:

> # HG changeset patch
> # User Min Chen <chenm003 at 163.com>
> # Date 1382359024 -28800
> # Node ID 881dea872e800800f2c987e5212a4554ff0abb6a
> # Parent  8fc308449916b49cea8b0839690d91cebcfb528b
> merge multiple encodeBinEP to encodeBinsEP
>
> diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibCommon/TComDataCU.cpp
> --- a/source/Lib/TLibCommon/TComDataCU.cpp      Mon Oct 21 14:09:12 2013
> +0530
> +++ b/source/Lib/TLibCommon/TComDataCU.cpp      Mon Oct 21 20:37:04 2013
> +0800
> @@ -1317,12 +1317,11 @@
>  *\param   piMode          it is set with MPM mode in case both MPM are
> equal. It is used to restrict RD search at encode side.
>  *\returns Number of MPM
>  */
> -int TComDataCU::getIntraDirLumaPredictor(UInt absPartIdx, int*
> intraDirPred, int* modes)
> +void TComDataCU::getIntraDirLumaPredictor(UInt absPartIdx, int*
> intraDirPred, int* modes)
>  {
>      TComDataCU* tempCU;
>      UInt        tempPartIdx;
>      int         leftIntraDir, aboveIntraDir;
> -    int         predNum = 0;
>
>      // Get intra direction of left PU
>      tempCU = getPULeft(tempPartIdx, m_absIdxInLCU + absPartIdx);
> @@ -1334,7 +1333,6 @@
>
>      aboveIntraDir = tempCU ? (tempCU->isIntra(tempPartIdx) ?
> tempCU->getLumaIntraDir(tempPartIdx) : DC_IDX) : DC_IDX;
>
> -    predNum = 3;
>      if (leftIntraDir == aboveIntraDir)
>      {
>          if (modes)
> @@ -1373,8 +1371,6 @@
>              intraDirPred[2] =  (leftIntraDir + aboveIntraDir) < 2 ?
> VER_IDX : DC_IDX;
>          }
>      }
> -
> -    return predNum;
>  }
>
>  UInt TComDataCU::getCtxSplitFlag(UInt absPartIdx, UInt depth)
> diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibCommon/TComDataCU.h
> --- a/source/Lib/TLibCommon/TComDataCU.h        Mon Oct 21 14:09:12 2013
> +0530
> +++ b/source/Lib/TLibCommon/TComDataCU.h        Mon Oct 21 20:37:04 2013
> +0800
> @@ -490,7 +490,7 @@
>      UInt          getIntraSizeIdx(UInt absPartIdx);
>
>      void          getAllowedChromaDir(UInt absPartIdx, UInt* modeList);
> -    int           getIntraDirLumaPredictor(UInt absPartIdx, int*
> intraDirPred, int* mode = NULL);
> +    void          getIntraDirLumaPredictor(UInt absPartIdx, int*
> intraDirPred, int* mode = NULL);
>
>      //
> -------------------------------------------------------------------------------------------------------------------
>      // member functions for SBAC context
> diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibEncoder/TEncSbac.cpp
> --- a/source/Lib/TLibEncoder/TEncSbac.cpp       Mon Oct 21 14:09:12 2013
> +0530
> +++ b/source/Lib/TLibEncoder/TEncSbac.cpp       Mon Oct 21 20:37:04 2013
> +0800
> @@ -529,21 +529,15 @@
>
>      if (numCand > 1)
>      {
> -        for (UInt ui = 0; ui < numCand - 1; ++ui)
> +        m_binIf->encodeBin((unaryIdx != 0),
> m_contextModels[OFF_MERGE_IDX_EXT_CTX]);
> +
> +        assert(unaryIdx < numCand);
> +
> +        if (unaryIdx != 0)
>          {
> -            const UInt symbol = ui == unaryIdx ? 0 : 1;
> -            if (ui == 0)
> -            {
> -                m_binIf->encodeBin(symbol,
> m_contextModels[OFF_MERGE_IDX_EXT_CTX]);
> -            }
> -            else
> -            {
> -                m_binIf->encodeBinEP(symbol);
> -            }
> -            if (symbol == 0)
> -            {
> -                break;
> -            }
> +            UInt mask = (1 << unaryIdx) - 2;
> +            mask >>= (unaryIdx == numCand - 1) ? 1 : 0;
> +            m_binIf->encodeBinsEP(mask, unaryIdx - (unaryIdx == numCand -
> 1));
>          }
>      }
>      DTRACE_CABAC_VL(g_nSymbolCounter++);
> @@ -583,7 +577,7 @@
>  {
>      UInt dir[4], j;
>      int preds[4][3] = { { -1, -1, -1 }, { -1, -1, -1 }, { -1, -1, -1 }, {
> -1, -1, -1 } };
> -    int predNum[4], predIdx[4] = { -1, -1, -1, -1 };
> +    int predIdx[4] = { -1, -1, -1, -1 };
>      PartSize mode = cu->getPartitionSize(absPartIdx);
>      UInt partNum = isMultiple ? (mode == SIZE_NxN ? 4 : 1) : 1;
>      UInt partOffset = (cu->getPic()->getNumPartInCU() >>
> (cu->getDepth(absPartIdx) << 1)) >> 2;
> @@ -591,8 +585,8 @@
>      for (j = 0; j < partNum; j++)
>      {
>          dir[j] = cu->getLumaIntraDir(absPartIdx + partOffset * j);
> -        predNum[j] = cu->getIntraDirLumaPredictor(absPartIdx + partOffset
> * j, preds[j]);
> -        for (UInt i = 0; i < predNum[j]; i++)
> +        cu->getIntraDirLumaPredictor(absPartIdx + partOffset * j,
> preds[j]);
> +        for (UInt i = 0; i < 3; i++)
>          {
>              if (dir[j] == preds[j][i])
>              {
> @@ -607,11 +601,13 @@
>      {
>          if (predIdx[j] != -1)
>          {
> -            m_binIf->encodeBinEP(predIdx[j] ? 1 : 0);
> -            if (predIdx[j])
> -            {
> -                m_binIf->encodeBinEP(predIdx[j] - 1);
> -            }
> +            assert((predIdx[j] >= 0) && (predIdx[j] <= 2));
> +            // NOTE: Mapping
> +            //       0 = 0
> +            //       1 = 10
> +            //       2 = 11
> +            int nonzero = (!!predIdx[j]);
> +            m_binIf->encodeBinsEP(predIdx[j] + nonzero, 1 + nonzero);
>          }
>          else
>          {
> @@ -627,10 +623,9 @@
>              {
>                  std::swap(preds[j][1], preds[j][2]);
>              }
> -            for (int i = (predNum[j] - 1); i >= 0; i--)
> -            {
> -                dir[j] = dir[j] > preds[j][i] ? dir[j] - 1 : dir[j];
> -            }
> +            dir[j] += (dir[j] > preds[j][2]) ? -1 : 0;
> +            dir[j] += (dir[j] > preds[j][1]) ? -1 : 0;
> +            dir[j] += (dir[j] > preds[j][0]) ? -1 : 0;
>
>              m_binIf->encodeBinsEP(dir[j], 5);
>          }
> @@ -692,6 +687,7 @@
>              UInt refNum = cu->getSlice()->getNumRefIdx(eRefList) - 2;
>              idx++;
>              refFrame--;
> +            // TODO: reference codeMergeIndex() to improvement
>              for (UInt i = 0; i < refNum; ++i)
>              {
>                  const UInt symbol = i == refFrame ? 0 : 1;
> @@ -1274,40 +1270,21 @@
>      }
>  }
>
> -/** code SAO offset sign
> - * \param code sign value
> - */
> -void TEncSbac::codeSAOSign(UInt code)
> -{
> -    m_binIf->encodeBinEP(code);
> -}
> -
>  void TEncSbac::codeSaoMaxUvlc(UInt code, UInt maxSymbol)
>  {
> -    if (maxSymbol == 0)
> +    assert(maxSymbol > 0);
> +
> +    UInt isCodeLast = (maxSymbol > code) ? 1 : 0;
> +    UInt isCodeNonZero = (code != 0) ? 1 : 0;
> +
> +    m_binIf->encodeBinEP(isCodeNonZero);
> +    if (isCodeNonZero)
>      {
> -        return;
> -    }
> +        UInt mask = (1 << (code - 1)) - 1;
> +        UInt len = code - 1 + isCodeLast;
> +        mask <<= isCodeLast;
>
> -    int i;
> -    bool bCodeLast = (maxSymbol > code);
> -
> -    if (code == 0)
> -    {
> -        m_binIf->encodeBinEP(0);
> -    }
> -    else
> -    {
> -        m_binIf->encodeBinEP(1);
> -        for (i = 0; i < code - 1; i++)
> -        {
> -            m_binIf->encodeBinEP(1);
> -        }
> -
> -        if (bCodeLast)
> -        {
> -            m_binIf->encodeBinEP(0);
> -        }
> +        m_binIf->encodeBinsEP(mask, len);
>      }
>  }
>
> diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibEncoder/TEncSbac.h
> --- a/source/Lib/TLibEncoder/TEncSbac.h Mon Oct 21 14:09:12 2013 +0530
> +++ b/source/Lib/TLibEncoder/TEncSbac.h Mon Oct 21 20:37:04 2013 +0800
> @@ -100,7 +100,15 @@
>      void  codeSaoMerge(UInt code);
>      void  codeSaoTypeIdx(UInt code);
>      void  codeSaoUflc(UInt length, UInt code);
> -    void  codeSAOSign(UInt code);
> +
> +    /** code SAO offset sign
> +     * \param code sign value
> +     */
> +    void TEncSbac::codeSAOSign(UInt code)
>

GCC gave a warning for the TEncSbac:: qualification within a class
declaration.

I've queued this patch with this fixed


> +    {
> +        m_binIf->encodeBinEP(code);
> +    }
> +
>      void  codeScalingList(TComScalingList*) { assert(0); }
>
>  private:
> diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibEncoder/TEncSearch.cpp
> --- a/source/Lib/TLibEncoder/TEncSearch.cpp     Mon Oct 21 14:09:12 2013
> +0530
> +++ b/source/Lib/TLibEncoder/TEncSearch.cpp     Mon Oct 21 20:37:04 2013
> +0800
> @@ -1678,7 +1678,8 @@
>
>              int preds[3] = { -1, -1, -1 };
>              int mode = -1;
> -            int numCand = cu->getIntraDirLumaPredictor(partOffset, preds,
> &mode);
> +            int numCand = 3;
> +            cu->getIntraDirLumaPredictor(partOffset, preds, &mode);
>              if (mode >= 0)
>              {
>                  numCand = mode;
>
> _______________________________________________
> 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/20131021/3c9a5cac/attachment-0001.html>


More information about the x265-devel mailing list