# HG changeset patch
# User Min Chen <[email protected]>
# Date 1394845762 25200
# Node ID 626df01b607061744e1e8301e2de9c5c2ba62cb6
# Parent 27c40f54ac64752f5dea816535ac02b62ba9a019
optimize: rewrite TComTrQuant::xGetICRateCost
diff -r 27c40f54ac64 -r 626df01b6070 source/Lib/TLibCommon/TComTrQuant.cpp
--- a/source/Lib/TLibCommon/TComTrQuant.cpp Fri Mar 14 18:09:01 2014 -0700
+++ b/source/Lib/TLibCommon/TComTrQuant.cpp Fri Mar 14 18:09:22 2014 -0700
@@ -633,15 +633,15 @@
if (scanPos == lastScanPos)
{
level = xGetCodedLevel(costCoeff[scanPos],
costCoeff0[scanPos], costSig[scanPos],
- levelDouble, maxAbsLevel, 0,
oneCtx, absCtx, goRiceParam,
- c1Idx, c2Idx, qbits, scaleFactor,
1);
+ levelDouble, maxAbsLevel,
baseLevel, 0, oneCtx, absCtx, goRiceParam,
+ c1c2Idx, qbits, scaleFactor, 1);
}
else
{
uint16_t ctxSig = getSigCtxInc(patternSigCtx,
codingParameters, blkPos);
level = xGetCodedLevel(costCoeff[scanPos],
costCoeff0[scanPos], costSig[scanPos],
- levelDouble, maxAbsLevel,
ctxSig, oneCtx, absCtx, goRiceParam,
- c1Idx, c2Idx, qbits,
scaleFactor, 0);
+ levelDouble, maxAbsLevel,
baseLevel, ctxSig, oneCtx, absCtx, goRiceParam,
+ c1c2Idx, qbits,
scaleFactor, 0);
sigRateDelta[blkPos] =
m_estBitsSbac->significantBits[ctxSig][1] -
m_estBitsSbac->significantBits[ctxSig][0];
}
deltaU[blkPos] = (levelDouble - ((int)level << qbits)) >>
(qbits - 8);
@@ -1125,12 +1125,12 @@
double& codedCostSig,
int levelDouble,
uint32_t maxAbsLevel,
- uint16_t ctxNumSig,
- uint16_t ctxNumOne,
- uint16_t ctxNumAbs,
- uint16_t absGoRice,
- uint32_t c1Idx,
- uint32_t c2Idx,
+ uint32_t baseLevel,
+ uint32_t ctxNumSig,
+ uint32_t ctxNumOne,
+ uint32_t ctxNumAbs,
+ uint32_t absGoRice,
+ uint32_t c1c2Idx,
int qbits,
double scaleFactor,
bool last) const
@@ -1161,7 +1161,7 @@
for (int absLevel = maxAbsLevel; absLevel >= minAbsLevel; absLevel--)
{
double err = double(levelDouble - (absLevel << qbits));
- double curCost = err * err * scaleFactor + xGetICRateCost(absLevel,
ctxNumOne, ctxNumAbs, absGoRice, c1Idx, c2Idx);
+ double curCost = err * err * scaleFactor + xGetICRateCost(absLevel,
absLevel - baseLevel, ctxNumOne, ctxNumAbs, absGoRice, c1c2Idx);
curCost += curCostSig;
if (curCost < codedCost)
@@ -1183,58 +1183,60 @@
* \returns cost of given absolute transform level
*/
inline double TComTrQuant::xGetICRateCost(uint32_t absLevel,
- uint16_t ctxNumOne,
- uint16_t ctxNumAbs,
- uint16_t absGoRice,
- uint32_t c1Idx,
- uint32_t c2Idx) const
+ int32_t diffLevel,
+ uint32_t ctxNumOne,
+ uint32_t ctxNumAbs,
+ uint32_t absGoRice,
+ uint32_t c1c2Idx) const
{
- double rate = xGetIEPRate();
- uint32_t baseLevel = (c1Idx < C1FLAG_NUMBER) ? (2 + (c2Idx <
C2FLAG_NUMBER)) : 1;
+ assert(absLevel > 0);
+ uint32_t rate = xGetIEPRate();
+ const int *greaterOneBits = m_estBitsSbac->greaterOneBits[ctxNumOne];
+ const int *levelAbsBits = m_estBitsSbac->levelAbsBits[ctxNumAbs];
- if (absLevel >= baseLevel)
+ if (diffLevel < 0)
{
- uint32_t symbol = absLevel - baseLevel;
+ assert((absLevel == 1) || (absLevel == 2));
+ rate += greaterOneBits[(absLevel == 2)];
+
+ if (absLevel == 2)
+ {
+ rate += levelAbsBits[0];
+ }
+ }
+ else
+ {
+ uint32_t symbol = diffLevel;
uint32_t length;
- if (symbol < (COEF_REMAIN_BIN_REDUCTION << absGoRice))
+ if ((symbol >> absGoRice) < COEF_REMAIN_BIN_REDUCTION)
{
length = symbol >> absGoRice;
rate += (length + 1 + absGoRice) << 15;
}
else
{
- length = absGoRice;
- symbol = symbol - (COEF_REMAIN_BIN_REDUCTION << absGoRice);
- while (symbol >= (1 << length))
+ length = 0;
+ symbol = (symbol >> absGoRice) - COEF_REMAIN_BIN_REDUCTION;
+ if (symbol != 0)
{
- symbol -= (1 << (length++));
+ unsigned long idx;
+ CLZ32(idx, symbol + 1);
+ length = idx;
}
- rate += (COEF_REMAIN_BIN_REDUCTION + length + 1 - absGoRice +
length) << 15;
+ rate += (COEF_REMAIN_BIN_REDUCTION + length + absGoRice + 1 +
length) << 15;
}
- if (c1Idx < C1FLAG_NUMBER)
+ if (c1c2Idx & 1)
{
- rate += m_estBitsSbac->greaterOneBits[ctxNumOne][1];
+ rate += greaterOneBits[1];
+ }
- if (c2Idx < C2FLAG_NUMBER)
- {
- rate += m_estBitsSbac->levelAbsBits[ctxNumAbs][1];
- }
+ if (c1c2Idx == 3)
+ {
+ rate += levelAbsBits[1];
}
}
- else if (absLevel == 1)
- {
- rate += m_estBitsSbac->greaterOneBits[ctxNumOne][0];
- }
- else if (absLevel == 2)
- {
- rate += m_estBitsSbac->greaterOneBits[ctxNumOne][1];
- rate += m_estBitsSbac->levelAbsBits[ctxNumAbs][0];
- }
- else
- {
- assert(0);
- }
+
return xGetICost(rate);
}
diff -r 27c40f54ac64 -r 626df01b6070 source/Lib/TLibCommon/TComTrQuant.h
--- a/source/Lib/TLibCommon/TComTrQuant.h Fri Mar 14 18:09:01 2014 -0700
+++ b/source/Lib/TLibCommon/TComTrQuant.h Fri Mar 14 18:09:22 2014 -0700
@@ -194,10 +194,10 @@
uint32_t xRateDistOptQuant(TComDataCU* cu, int32_t* srcCoeff, TCoeff*
dstCoeff, uint32_t trSize, TextType ttype, uint32_t absPartIdx, int32_t
*lastPos);
inline uint32_t xGetCodedLevel(double& codedCost, double& codedCost0,
double& codedCostSig, int levelDouble,
- uint32_t maxAbsLevel, uint16_t ctxNumSig,
uint16_t ctxNumOne, uint16_t ctxNumAbs, uint16_t absGoRice,
- uint32_t c1Idx, uint32_t c2Idx, int qbits,
double scale, bool bLast) const;
+ uint32_t maxAbsLevel, uint32_t baseLevel,
uint32_t ctxNumSig, uint32_t ctxNumOne, uint32_t ctxNumAbs, uint32_t absGoRice,
+ uint32_t c1c2Idx, int qbits, double scale,
bool bLast) const;
- inline double xGetICRateCost(uint32_t absLevel, uint16_t ctxNumOne,
uint16_t ctxNumAbs, uint16_t absGoRice, uint32_t c1Idx, uint32_t c2Idx) const;
+ inline double xGetICRateCost(uint32_t absLevel, int32_t diffLevel,
uint32_t ctxNumOne, uint32_t ctxNumAbs, uint32_t absGoRice, uint32_t c1c2Idx)
const;
inline int xGetICRate(uint32_t absLevel, int32_t diffLevel, uint32_t
ctxNumOne, uint32_t ctxNumAbs, uint32_t absGoRice, uint32_t c1c2Idx) const;
_______________________________________________
x265-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/x265-devel