[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