[x265] [PATCH algorithm modify] simplify coeff group clear when CG decide to not encode
Min Chen
chenm003 at 163.com
Tue Apr 7 14:04:16 CEST 2015
# HG changeset patch
# User Min Chen <chenm003 at 163.com>
# Date 1428408208 -28800
# Node ID d69e0b8066d7b146e1a4f1a17a9c6678e2740b30
# Parent 095ed87526e5964ad45949ec81903704451d79f8
simplify coeff group clear when CG decide to not encode
---
source/common/quant.cpp | 23 +++++++++--------------
1 files changed, 9 insertions(+), 14 deletions(-)
diff -r 095ed87526e5 -r d69e0b8066d7 source/common/quant.cpp
--- a/source/common/quant.cpp Tue Apr 07 09:42:31 2015 +0530
+++ b/source/common/quant.cpp Tue Apr 07 20:03:28 2015 +0800
@@ -585,6 +585,7 @@
TUEntropyCodingParameters codeParams;
cu.getTUEntropyCodingParameters(codeParams, absPartIdx, log2TrSize, bIsLuma);
const uint32_t cgNum = 1 << (codeParams.log2TrSizeCG * 2);
+ const uint32_t cgStride = (trSize >> MLS_CG_LOG2_SIZE);
/* TODO: update bit estimates if dirty */
EstBitsSbac& estBitsSbac = m_entropyCoder->m_estBitsSbac;
@@ -601,7 +602,7 @@
const uint64_t cgBlkPosMask = ((uint64_t)1 << cgBlkPos);
memset(&cgRdStats, 0, sizeof(coeffGroupRDStats));
- const int patternSigCtx = calcPatternSigCtx(sigCoeffGroupFlag64, cgPosX, cgPosY, cgBlkPos, (trSize >> MLS_CG_LOG2_SIZE));
+ const int patternSigCtx = calcPatternSigCtx(sigCoeffGroupFlag64, cgPosX, cgPosY, cgBlkPos, cgStride);
/* iterate over coefficients in each group in reverse scan order */
for (int scanPosinCG = cgSize - 1; scanPosinCG >= 0; scanPosinCG--)
@@ -824,7 +825,7 @@
* of the significant coefficient group flag and evaluate whether the RD cost of the
* coded group is more than the RD cost of the uncoded group */
- uint32_t sigCtx = getSigCoeffGroupCtxInc(sigCoeffGroupFlag64, cgPosX, cgPosY, cgBlkPos, (trSize >> MLS_CG_LOG2_SIZE));
+ uint32_t sigCtx = getSigCoeffGroupCtxInc(sigCoeffGroupFlag64, cgPosX, cgPosY, cgBlkPos, cgStride);
int64_t costZeroCG = totalRdCost + SIGCOST(estBitsSbac.significantCoeffGroupBits[sigCtx][0]);
costZeroCG += cgRdStats.uncodedDist; /* add distortion for resetting non-zero levels to zero levels */
@@ -841,23 +842,17 @@
costCoeffGroupSig[cgScanPos] = SIGCOST(estBitsSbac.significantCoeffGroupBits[sigCtx][0]);
/* reset all coeffs to 0. UNCODE THIS COEFF GROUP! */
- for (int scanPosinCG = cgSize - 1; scanPosinCG >= 0; scanPosinCG--)
- {
- scanPos = cgScanPos * cgSize + scanPosinCG;
- uint32_t blkPos = codeParams.scan[scanPos];
- if (dstCoeff[blkPos])
- {
- costCoeff[scanPos] = costUncoded[scanPos];
- costSig[scanPos] = 0;
- }
- dstCoeff[blkPos] = 0;
- }
+ const uint32_t blkPos = codeParams.scan[cgScanPos * cgSize];
+ memset(&dstCoeff[blkPos + 0 * trSize], 0, 4 * sizeof(*dstCoeff));
+ memset(&dstCoeff[blkPos + 1 * trSize], 0, 4 * sizeof(*dstCoeff));
+ memset(&dstCoeff[blkPos + 2 * trSize], 0, 4 * sizeof(*dstCoeff));
+ memset(&dstCoeff[blkPos + 3 * trSize], 0, 4 * sizeof(*dstCoeff));
}
}
else
{
/* there were no coded coefficients in this coefficient group */
- uint32_t ctxSig = getSigCoeffGroupCtxInc(sigCoeffGroupFlag64, cgPosX, cgPosY, cgBlkPos, (trSize >> MLS_CG_LOG2_SIZE));
+ uint32_t ctxSig = getSigCoeffGroupCtxInc(sigCoeffGroupFlag64, cgPosX, cgPosY, cgBlkPos, cgStride);
costCoeffGroupSig[cgScanPos] = SIGCOST(estBitsSbac.significantCoeffGroupBits[ctxSig][0]);
totalRdCost += costCoeffGroupSig[cgScanPos]; /* add cost of 0 bit in significant CG bitmap */
totalRdCost -= cgRdStats.sigCost; /* remove cost of significant coefficient bitmap */
More information about the x265-devel
mailing list