[x265] reduce xModeBitsIntra() call

Steve Borho steve at borho.org
Fri May 9 18:38:16 CEST 2014


On Fri, May 9, 2014 at 2:51 AM, Satoshi Nakagawa <nakagawa424 at oki.com> wrote:
> # HG changeset patch
> # User Satoshi Nakagawa <nakagawa424 at oki.com>
> # Date 1399621766 -32400
> #      Fri May 09 16:49:26 2014 +0900
> # Node ID 29afccf47900d6be2f000b07edc4b5ce52b880e2
> # Parent  129bfec3144f4521c9b2d2104f8ad66107d95f7c
> reduce xModeBitsIntra() call

queued for testing

> diff -r 129bfec3144f -r 29afccf47900 source/Lib/TLibCommon/TComDataCU.cpp
> --- a/source/Lib/TLibCommon/TComDataCU.cpp      Thu May 08 23:49:27 2014 -0500
> +++ b/source/Lib/TLibCommon/TComDataCU.cpp      Fri May 09 16:49:26 2014 +0900
> @@ -1196,11 +1196,11 @@
>  *\param   mode          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(uint32_t absPartIdx, int32_t* intraDirPred)
> +int TComDataCU::getIntraDirLumaPredictor(uint32_t absPartIdx, uint32_t* intraDirPred)
>  {
>      TComDataCU* tempCU;
>      uint32_t    tempPartIdx;
> -    int         leftIntraDir, aboveIntraDir;
> +    uint32_t    leftIntraDir, aboveIntraDir;
>
>      // Get intra direction of left PU
>      tempCU = getPULeft(tempPartIdx, m_absIdxInLCU + absPartIdx);
> diff -r 129bfec3144f -r 29afccf47900 source/Lib/TLibCommon/TComDataCU.h
> --- a/source/Lib/TLibCommon/TComDataCU.h        Thu May 08 23:49:27 2014 -0500
> +++ b/source/Lib/TLibCommon/TComDataCU.h        Fri May 09 16:49:26 2014 +0900
> @@ -431,7 +431,7 @@
>      // -------------------------------------------------------------------------------------------------------------------
>
>      void          getAllowedChromaDir(uint32_t absPartIdx, uint32_t* modeList);
> -    int           getIntraDirLumaPredictor(uint32_t absPartIdx, int32_t* intraDirPred);
> +    int           getIntraDirLumaPredictor(uint32_t absPartIdx, uint32_t* intraDirPred);
>
>      // -------------------------------------------------------------------------------------------------------------------
>      // member functions for SBAC context
> diff -r 129bfec3144f -r 29afccf47900 source/Lib/TLibEncoder/TEncSbac.cpp
> --- a/source/Lib/TLibEncoder/TEncSbac.cpp       Thu May 08 23:49:27 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncSbac.cpp       Fri May 09 16:49:26 2014 +0900
> @@ -1636,7 +1636,7 @@
>  void TEncSbac::codeIntraDirLumaAng(TComDataCU* cu, uint32_t absPartIdx, bool isMultiple)
>  {
>      uint32_t dir[4], j;
> -    int preds[4][3];
> +    uint32_t preds[4][3];
>      int predIdx[4];
>      PartSize mode = cu->getPartitionSize(absPartIdx);
>      uint32_t partNum = isMultiple ? (mode == SIZE_NxN ? 4 : 1) : 1;
> diff -r 129bfec3144f -r 29afccf47900 source/Lib/TLibEncoder/TEncSearch.cpp
> --- a/source/Lib/TLibEncoder/TEncSearch.cpp     Thu May 08 23:49:27 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncSearch.cpp     Fri May 09 16:49:26 2014 +0900
> @@ -1664,22 +1664,25 @@
>                  modeCosts[mode] = sa8d(cmp, srcStride, &tmp[(mode - 2) * (scaleSize * scaleSize)], scaleSize) << costShift;
>              }
>
> +            uint32_t preds[3];
> +            int numCand = cu->getIntraDirLumaPredictor(partOffset, preds);
> +
> +            uint64_t mpms;
> +            uint32_t rbits = xModeBitsRemIntra(cu, partOffset, depth, preds, mpms);
> +
>              // Find N least cost modes. N = numModesForFullRD
>              for (uint32_t mode = 0; mode < numModesAvailable; mode++)
>              {
>                  uint32_t sad = modeCosts[mode];
> -                uint32_t bits = xModeBitsIntra(cu, mode, partOffset, depth, initTrDepth);
> +                uint32_t bits = !(mpms & ((uint64_t)1 << mode)) ? rbits : xModeBitsIntra(cu, mode, partOffset, depth);
>                  uint64_t cost = m_rdCost->calcRdSADCost(sad, bits);
>                  candNum += xUpdateCandList(mode, cost, numModesForFullRD, rdModeList, candCostList);
>              }
>
> -            int preds[3];
> -            int numCand = cu->getIntraDirLumaPredictor(partOffset, preds);
> -
>              for (int j = 0; j < numCand; j++)
>              {
>                  bool mostProbableModeIncluded = false;
> -                int mostProbableMode = preds[j];
> +                uint32_t mostProbableMode = preds[j];
>
>                  for (int i = 0; i < numModesForFullRD; i++)
>                  {
> @@ -3984,12 +3987,12 @@
>      }
>  }
>
> -uint32_t TEncSearch::xModeBitsIntra(TComDataCU* cu, uint32_t mode, uint32_t partOffset, uint32_t depth, uint32_t initTrDepth)
> +uint32_t TEncSearch::xModeBitsIntra(TComDataCU* cu, uint32_t mode, uint32_t partOffset, uint32_t depth)
>  {
>      // Reload only contexts required for coding intra mode information
>      m_rdGoOnSbacCoder->loadIntraDirModeLuma(m_rdSbacCoders[depth][CI_CURR_BEST]);
>
> -    cu->setLumaIntraDirSubParts(mode, partOffset, depth + initTrDepth);
> +    cu->getLumaIntraDir()[partOffset] = (uint8_t)mode;
>
>      m_entropyCoder->resetBits();
>      m_entropyCoder->encodeIntraDirModeLuma(cu, partOffset);
> @@ -3997,6 +4000,23 @@
>      return m_entropyCoder->getNumberOfWrittenBits();
>  }
>
> +uint32_t TEncSearch::xModeBitsRemIntra(TComDataCU* cu, uint32_t partOffset, uint32_t depth, uint32_t preds[3], uint64_t& mpms)
> +{
> +    mpms = 0;
> +    for (int i = 0; i < 3; ++i)
> +    {
> +        mpms |= ((uint64_t)1 << preds[i]);
> +    }
> +
> +    uint32_t mode = 34;
> +    while (mpms & ((uint64_t)1 << mode))
> +    {
> +        --mode;
> +    }
> +
> +    return xModeBitsIntra(cu, mode, partOffset, depth);
> +}
> +
>  uint32_t TEncSearch::xUpdateCandList(uint32_t mode, uint64_t cost, uint32_t fastCandNum, uint32_t* CandModeList, uint64_t* CandCostList)
>  {
>      uint32_t i;
> diff -r 129bfec3144f -r 29afccf47900 source/Lib/TLibEncoder/TEncSearch.h
> --- a/source/Lib/TLibEncoder/TEncSearch.h       Thu May 08 23:49:27 2014 -0500
> +++ b/source/Lib/TLibEncoder/TEncSearch.h       Fri May 09 16:49:26 2014 +0900
> @@ -147,7 +147,8 @@
>
>      bool init(Encoder* cfg, TComRdCost* rdCost, TComTrQuant *trQuant);
>
> -    uint32_t xModeBitsIntra(TComDataCU* cu, uint32_t mode, uint32_t partOffset, uint32_t depth, uint32_t initTrDepth);
> +    uint32_t xModeBitsIntra(TComDataCU* cu, uint32_t mode, uint32_t partOffset, uint32_t depth);
> +    uint32_t xModeBitsRemIntra(TComDataCU * cu, uint32_t partOffset, uint32_t depth, uint32_t preds[3], uint64_t & mpms);
>      uint32_t xUpdateCandList(uint32_t mode, uint64_t cost, uint32_t fastCandNum, uint32_t* CandModeList, uint64_t* CandCostList);
>
>      void estIntraPredQT(TComDataCU* cu, TComYuv* fencYuv, TComYuv* predYuv, ShortYuv* resiYuv, TComYuv* reconYuv);
> diff -r 129bfec3144f -r 29afccf47900 source/encoder/compress.cpp
> --- a/source/encoder/compress.cpp       Thu May 08 23:49:27 2014 -0500
> +++ b/source/encoder/compress.cpp       Fri May 09 16:49:26 2014 +0900
> @@ -139,11 +139,17 @@
>      int log2SizeMinus2 = g_convertToBit[scaleWidth];
>      pixelcmp_t sa8d = primitives.sa8d[log2SizeMinus2];
>
> +    uint32_t preds[3];
> +    cu->getIntraDirLumaPredictor(partOffset, preds);
> +
> +    uint64_t mpms;
> +    uint32_t rbits = m_search->xModeBitsRemIntra(cu, partOffset, depth, preds, mpms);
> +
>      // DC
>      primitives.intra_pred[log2SizeMinus2][DC_IDX](tmp, scaleStride, left, above, 0, (scaleWidth <= 16));
>      bsad = costMultiplier * sa8d(fenc, scaleStride, tmp, scaleStride);
>      bmode = mode = DC_IDX;
> -    bbits  = m_search->xModeBitsIntra(cu, mode, partOffset, depth, initTrDepth);
> +    bbits = !(mpms & ((uint64_t)1 << mode)) ? rbits : m_search->xModeBitsIntra(cu, mode, partOffset, depth);
>      bcost = m_rdCost->calcRdSADCost(bsad, bbits);
>
>      pixel *abovePlanar   = above;
> @@ -159,7 +165,7 @@
>      primitives.intra_pred[log2SizeMinus2][PLANAR_IDX](tmp, scaleStride, leftPlanar, abovePlanar, 0, 0);
>      sad = costMultiplier * sa8d(fenc, scaleStride, tmp, scaleStride);
>      mode = PLANAR_IDX;
> -    bits = m_search->xModeBitsIntra(cu, mode, partOffset, depth, initTrDepth);
> +    bits = !(mpms & ((uint64_t)1 << mode)) ? rbits : m_search->xModeBitsIntra(cu, mode, partOffset, depth);
>      cost = m_rdCost->calcRdSADCost(sad, bits);
>      COPY4_IF_LT(bcost, cost, bmode, mode, bsad, sad, bbits, bits);
>
> @@ -174,7 +180,7 @@
>          pixel *cmp = (modeHor ? buf_trans : fenc);
>          intptr_t srcStride = (modeHor ? scaleWidth : scaleStride);
>          sad  = costMultiplier * sa8d(cmp, srcStride, &tmp[(mode - 2) * (scaleWidth * scaleWidth)], scaleWidth);
> -        bits = m_search->xModeBitsIntra(cu, mode, partOffset, depth, initTrDepth);
> +        bits = !(mpms & ((uint64_t)1 << mode)) ? rbits : m_search->xModeBitsIntra(cu, mode, partOffset, depth);
>          cost = m_rdCost->calcRdSADCost(sad, bits);
>          COPY4_IF_LT(bcost, cost, bmode, mode, bsad, sad, bbits, bits);
>      }
> _______________________________________________
> 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