[x265] encodeCoeffNxN(): call only if non-zero coeff exists
Satoshi Nakagawa
nakagawa424 at oki.com
Fri May 16 12:23:32 CEST 2014
# HG changeset patch
# User Satoshi Nakagawa <nakagawa424 at oki.com>
# Date 1400235646 -32400
# Fri May 16 19:20:46 2014 +0900
# Node ID 9125cb646a1a5c298ce5ac05859c9d07acf5f449
# Parent 7d11f60c5dba82f5804c8bef7610d65c9ac278b4
encodeCoeffNxN(): call only if non-zero coeff exists
diff -r 7d11f60c5dba -r 9125cb646a1a source/Lib/TLibEncoder/TEncEntropy.cpp
--- a/source/Lib/TLibEncoder/TEncEntropy.cpp Fri May 16 14:31:01 2014 +0530
+++ b/source/Lib/TLibEncoder/TEncEntropy.cpp Fri May 16 19:20:46 2014 +0900
@@ -363,7 +363,7 @@
}
if (cbfY)
{
- m_entropyCoderIf->codeCoeffNxN(cu, (cu->getCoeffY() + offsetLuma), absPartIdx, width, depth, TEXT_LUMA);
+ m_entropyCoderIf->codeCoeffNxN(cu, (cu->getCoeffY() + offsetLuma), absPartIdx, width, TEXT_LUMA);
}
int chFmt = cu->getChromaFormat();
@@ -384,11 +384,11 @@
coeff_t* coeffChroma = (chromaId == 1) ? cu->getCoeffCb() : cu->getCoeffCr();
do
{
- uint32_t cbf = cu->getCbf(tuIterator.m_absPartIdxTURelCU, (TextType)chromaId, trIdx);
+ uint32_t cbf = cu->getCbf(tuIterator.m_absPartIdxTURelCU, (TextType)chromaId, trIdx + splitIntoSubTUs);
uint32_t subTUIndex = tuIterator.m_section * trWidthC * trWidthC;
if (cbf)
{
- m_entropyCoderIf->codeCoeffNxN(cu, (coeffChroma + m_bakChromaOffset + subTUIndex), tuIterator.m_absPartIdxTURelCU, trWidthC, depth, (TextType)chromaId);
+ m_entropyCoderIf->codeCoeffNxN(cu, (coeffChroma + m_bakChromaOffset + subTUIndex), tuIterator.m_absPartIdxTURelCU, trWidthC, (TextType)chromaId);
}
}
while (isNextTUSection(&tuIterator));
@@ -409,11 +409,11 @@
coeff_t* coeffChroma = (chromaId == 1) ? cu->getCoeffCb() : cu->getCoeffCr();
do
{
- uint32_t cbf = cu->getCbf(tuIterator.m_absPartIdxTURelCU, (TextType)chromaId, trIdx);
+ uint32_t cbf = cu->getCbf(tuIterator.m_absPartIdxTURelCU, (TextType)chromaId, trIdx + splitIntoSubTUs);
uint32_t subTUIndex = tuIterator.m_section * trWidthC * trHeightC;
if (cbf)
{
- m_entropyCoderIf->codeCoeffNxN(cu, (coeffChroma + offsetChroma + subTUIndex), tuIterator.m_absPartIdxTURelCU, trWidthC, depth, (TextType)chromaId);
+ m_entropyCoderIf->codeCoeffNxN(cu, (coeffChroma + offsetChroma + subTUIndex), tuIterator.m_absPartIdxTURelCU, trWidthC, (TextType)chromaId);
}
}
while (isNextTUSection(&tuIterator));
@@ -616,27 +616,9 @@
xEncodeTransform(cu, lumaOffset, chromaOffset, absPartIdx, absPartIdxStep, depth, width, height, 0, bCodeDQP);
}
-void TEncEntropy::encodeCoeffNxN(TComDataCU* cu, coeff_t* coeff, uint32_t absPartIdx, uint32_t trWidth, uint32_t trHeight, uint32_t depth, TextType ttype)
+void TEncEntropy::encodeCoeffNxN(TComDataCU* cu, coeff_t* coeff, uint32_t absPartIdx, uint32_t trSize, TextType ttype)
{
- // This is for Transform unit processing. This may be used at mode selection stage for Inter.
- if (trWidth != trHeight)
- {
- uint32_t curPartNum = cu->getPic()->getNumPartInCU() >> (depth << 1);
- TComTURecurse tuIterator;
- initTUEntropySection(&tuIterator, VERTICAL_SPLIT, curPartNum, absPartIdx);
- trHeight >>= 1;
- uint32_t subTUSize = trWidth * trHeight;
-
- do
- {
- m_entropyCoderIf->codeCoeffNxN(cu, coeff + tuIterator.m_section * subTUSize, tuIterator.m_absPartIdxTURelCU, trWidth, depth, ttype);
- }
- while (isNextTUSection(&tuIterator));
- }
- else
- {
- m_entropyCoderIf->codeCoeffNxN(cu, coeff, absPartIdx, trWidth, depth, ttype);
- }
+ m_entropyCoderIf->codeCoeffNxN(cu, coeff, absPartIdx, trSize, ttype);
}
void TEncEntropy::estimateBit(estBitsSbacStruct* estBitsSBac, int trSize, TextType ttype)
diff -r 7d11f60c5dba -r 9125cb646a1a source/Lib/TLibEncoder/TEncEntropy.h
--- a/source/Lib/TLibEncoder/TEncEntropy.h Fri May 16 14:31:01 2014 +0530
+++ b/source/Lib/TLibEncoder/TEncEntropy.h Fri May 16 19:20:46 2014 +0900
@@ -123,7 +123,7 @@
virtual void codeRefFrmIdx(TComDataCU* cu, uint32_t absPartIdx, int eRefList) = 0;
virtual void codeMvd(TComDataCU* cu, uint32_t absPartIdx, int eRefList) = 0;
virtual void codeDeltaQP(TComDataCU* cu, uint32_t absPartIdx) = 0;
- virtual void codeCoeffNxN(TComDataCU* cu, coeff_t* pcCoef, uint32_t absPartIdx, uint32_t trSize, uint32_t depth, TextType ttype) = 0;
+ virtual void codeCoeffNxN(TComDataCU* cu, coeff_t* pcCoef, uint32_t absPartIdx, uint32_t trSize, TextType ttype) = 0;
virtual void codeSAOSign(uint32_t code) = 0;
virtual void codeSaoMaxUvlc(uint32_t code, uint32_t maxSymbol) = 0;
virtual void codeSaoMerge(uint32_t code) = 0;
@@ -204,7 +204,7 @@
void encodeCoeff(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, uint32_t width, uint32_t height, bool& bCodeDQP);
- void encodeCoeffNxN(TComDataCU* cu, coeff_t* pcCoeff, uint32_t absPartIdx, uint32_t trWidth, uint32_t trHeight, uint32_t depth, TextType ttype);
+ void encodeCoeffNxN(TComDataCU* cu, coeff_t* pcCoeff, uint32_t absPartIdx, uint32_t trSize, TextType ttype);
void estimateBit(estBitsSbacStruct* estBitsSbac, int trSize, TextType ttype);
void encodeSaoOffset(SaoLcuParam* saoLcuParam, uint32_t compIdx);
diff -r 7d11f60c5dba -r 9125cb646a1a source/Lib/TLibEncoder/TEncSbac.cpp
--- a/source/Lib/TLibEncoder/TEncSbac.cpp Fri May 16 14:31:01 2014 +0530
+++ b/source/Lib/TLibEncoder/TEncSbac.cpp Fri May 16 19:20:46 2014 +0900
@@ -2089,7 +2089,7 @@
}
}
-void TEncSbac::codeCoeffNxN(TComDataCU* cu, coeff_t* coeff, uint32_t absPartIdx, uint32_t trSize, uint32_t depth, TextType ttype)
+void TEncSbac::codeCoeffNxN(TComDataCU* cu, coeff_t* coeff, uint32_t absPartIdx, uint32_t trSize, TextType ttype)
{
#if ENC_DEC_TRACE
DTRACE_CABAC_VL(g_nSymbolCounter++)
@@ -2099,8 +2099,6 @@
DTRACE_CABAC_V(trSize)
DTRACE_CABAC_T("\theight=")
DTRACE_CABAC_V(trSize)
- DTRACE_CABAC_T("\tdepth=")
- DTRACE_CABAC_V(depth)
DTRACE_CABAC_T("\tabspartidx=")
DTRACE_CABAC_V(absPartIdx)
DTRACE_CABAC_T("\ttoCU-X=")
@@ -2116,8 +2114,6 @@
DTRACE_CABAC_T("\tpredmode=")
DTRACE_CABAC_V(cu->getPredictionMode(absPartIdx))
DTRACE_CABAC_T("\n")
-#else // if ENC_DEC_TRACE
- (void)depth;
#endif // if ENC_DEC_TRACE
X265_CHECK(trSize <= m_slice->getSPS()->getMaxTrSize(), "transform size out of range\n");
diff -r 7d11f60c5dba -r 9125cb646a1a source/Lib/TLibEncoder/TEncSbac.h
--- a/source/Lib/TLibEncoder/TEncSbac.h Fri May 16 14:31:01 2014 +0530
+++ b/source/Lib/TLibEncoder/TEncSbac.h Fri May 16 19:20:46 2014 +0900
@@ -135,7 +135,7 @@
void codeDeltaQP(TComDataCU* cu, uint32_t absPartIdx);
void codeLastSignificantXY(uint32_t posx, uint32_t posy, uint32_t log2TrSize, TextType ttype, uint32_t scanIdx);
- void codeCoeffNxN(TComDataCU* cu, coeff_t* coef, uint32_t absPartIdx, uint32_t trSize, uint32_t depth, TextType ttype);
+ void codeCoeffNxN(TComDataCU* cu, coeff_t* coef, uint32_t absPartIdx, uint32_t trSize, TextType ttype);
void codeTransformSkipFlags(TComDataCU* cu, uint32_t absPartIdx, uint32_t trSize, TextType ttype);
// -------------------------------------------------------------------------------------------------------------------
diff -r 7d11f60c5dba -r 9125cb646a1a source/Lib/TLibEncoder/TEncSearch.cpp
--- a/source/Lib/TLibEncoder/TEncSearch.cpp Fri May 16 14:31:01 2014 +0530
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp Fri May 16 19:20:46 2014 +0900
@@ -224,6 +224,9 @@
void TEncSearch::xEncCoeffQT(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, TextType ttype, const bool splitIntoSubTUs)
{
+ if (!cu->getCbf(absPartIdx, ttype, trDepth))
+ return;
+
uint32_t fullDepth = cu->getDepth(0) + trDepth;
uint32_t trMode = cu->getTransformIdx(absPartIdx);
uint32_t subdiv = (trMode > trDepth ? 1 : 0);
@@ -239,6 +242,8 @@
return;
}
+ uint32_t origTrDepth = trDepth;
+
uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize()] + 2 - fullDepth;
int chFmt = cu->getChromaFormat();
if ((ttype != TEXT_LUMA) && (trSizeLog2 == 2) && !(chFmt == CHROMA_444))
@@ -276,7 +281,20 @@
coeff += coeffOffset;
- m_entropyCoder->encodeCoeffNxN(cu, coeff, absPartIdx, width, height, fullDepth, ttype);
+ if (width == height)
+ {
+ m_entropyCoder->encodeCoeffNxN(cu, coeff, absPartIdx, width, ttype);
+ }
+ else
+ {
+ uint32_t subTUSize = width * width;
+ uint32_t partIdxesPerSubTU = cu->getPic()->getNumPartInCU() >> (((cu->getDepth(absPartIdx) + trDepth) << 1) + 1);
+
+ if (cu->getCbf(absPartIdx, ttype, origTrDepth + 1))
+ m_entropyCoder->encodeCoeffNxN(cu, coeff, absPartIdx, width, ttype);
+ if (cu->getCbf(absPartIdx + partIdxesPerSubTU, ttype, origTrDepth + 1))
+ m_entropyCoder->encodeCoeffNxN(cu, coeff + subTUSize, absPartIdx + partIdxesPerSubTU, width, ttype);
+ }
}
void TEncSearch::xEncIntraHeader(TComDataCU* cu, uint32_t trDepth, uint32_t absPartIdx, bool bLuma, bool bChroma)
@@ -3114,7 +3132,8 @@
m_entropyCoder->resetBits();
m_entropyCoder->encodeQtCbf(cu, absPartIdx, 0, trWidth, trHeight, TEXT_LUMA, trMode, true);
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx, trWidth, trHeight, depth, TEXT_LUMA);
+ if (absSum[TEXT_LUMA][0])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx, trWidth, TEXT_LUMA);
singleBitsComp[TEXT_LUMA][0] = m_entropyCoder->getNumberOfWrittenBits();
uint32_t singleBitsPrev = singleBitsComp[TEXT_LUMA][0];
@@ -3156,11 +3175,13 @@
cu->setCbfPartRange(absSum[TEXT_CHROMA_V][tuIterator.m_section] ? setCbf : 0, TEXT_CHROMA_V, tuIterator.m_absPartIdxTURelCU, tuIterator.m_absPartIdxStep);
m_entropyCoder->encodeQtCbf(cu, tuIterator.m_absPartIdxTURelCU, tuIterator.m_absPartIdxStep, widthC, heightC, TEXT_CHROMA_U, trMode, true);
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurU + subTUBufferOffset, tuIterator.m_absPartIdxTURelCU, widthC, heightC, depth, TEXT_CHROMA_U);
+ if (absSum[TEXT_CHROMA_U][tuIterator.m_section])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurU + subTUBufferOffset, tuIterator.m_absPartIdxTURelCU, widthC, TEXT_CHROMA_U);
singleBitsComp[TEXT_CHROMA_U][tuIterator.m_section] = m_entropyCoder->getNumberOfWrittenBits() - singleBitsPrev;
m_entropyCoder->encodeQtCbf(cu, tuIterator.m_absPartIdxTURelCU, tuIterator.m_absPartIdxStep, widthC, heightC, TEXT_CHROMA_V, trMode, true);
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurV + subTUBufferOffset, tuIterator.m_absPartIdxTURelCU, widthC, heightC, depth, TEXT_CHROMA_V);
+ if (absSum[TEXT_CHROMA_V][tuIterator.m_section])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurV + subTUBufferOffset, tuIterator.m_absPartIdxTURelCU, widthC, TEXT_CHROMA_V);
uint32_t newBits = m_entropyCoder->getNumberOfWrittenBits();
singleBitsComp[TEXT_CHROMA_V][tuIterator.m_section] = newBits - (singleBitsPrev + singleBitsComp[TEXT_CHROMA_U][tuIterator.m_section]);
@@ -3441,11 +3462,11 @@
trWidth, TEXT_LUMA, absPartIdx, &lastPosTransformSkip[TEXT_LUMA][0], true, curuseRDOQ);
cu->setCbfSubParts(absSumTransformSkipY ? setCbf : 0, TEXT_LUMA, absPartIdx, depth);
- if (absSumTransformSkipY != 0)
+ if (absSumTransformSkipY)
{
m_entropyCoder->resetBits();
m_entropyCoder->encodeQtCbf(cu, absPartIdx, 0, trWidth, trHeight, TEXT_LUMA, trMode, true);
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx, trWidth, trHeight, depth, TEXT_LUMA);
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx, trWidth, TEXT_LUMA);
const uint32_t skipSingleBitsY = m_entropyCoder->getNumberOfWrittenBits();
m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA, QP_BD_OFFSET, 0, chFmt);
@@ -3546,7 +3567,7 @@
if (absSumTransformSkipU)
{
m_entropyCoder->encodeQtCbf(cu, tuIterator.m_absPartIdxTURelCU, tuIterator.m_absPartIdxStep, widthC, heightC, TEXT_CHROMA_U, trMode, true);
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurU + subTUBufferOffset, tuIterator.m_absPartIdxTURelCU, widthC, heightC, depth, TEXT_CHROMA_U);
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurU + subTUBufferOffset, tuIterator.m_absPartIdxTURelCU, widthC, TEXT_CHROMA_U);
singleBitsComp[TEXT_CHROMA_U][tuIterator.m_section] = m_entropyCoder->getNumberOfWrittenBits();
curChromaQpOffset = cu->getSlice()->getPPS()->getChromaCbQpOffset() + cu->getSlice()->getSliceQpDeltaCb();
@@ -3583,7 +3604,7 @@
if (absSumTransformSkipV)
{
m_entropyCoder->encodeQtCbf(cu, tuIterator.m_absPartIdxTURelCU, tuIterator.m_absPartIdxStep, widthC, heightC, TEXT_CHROMA_V, trMode, true);
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurV + subTUBufferOffset, tuIterator.m_absPartIdxTURelCU, widthC, heightC, depth, TEXT_CHROMA_V);
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurV + subTUBufferOffset, tuIterator.m_absPartIdxTURelCU, widthC, TEXT_CHROMA_V);
singleBitsComp[TEXT_CHROMA_V][tuIterator.m_section] = m_entropyCoder->getNumberOfWrittenBits() - singleBitsComp[TEXT_CHROMA_U][tuIterator.m_section];
curChromaQpOffset = cu->getSlice()->getPPS()->getChromaCrQpOffset() + cu->getSlice()->getSliceQpDeltaCr();
@@ -3645,12 +3666,32 @@
}
m_entropyCoder->encodeQtCbf(cu, absPartIdx, 0, trWidth, trHeight, TEXT_LUMA, trMode, true);
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx, trWidth, trHeight, depth, TEXT_LUMA);
+ if (absSum[TEXT_LUMA][0])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx, trWidth, TEXT_LUMA);
if (bCodeChroma)
{
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurU, absPartIdx, trWidthC, trHeightC, depth, TEXT_CHROMA_U);
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurV, absPartIdx, trWidthC, trHeightC, depth, TEXT_CHROMA_V);
+ if (!splitIntoSubTUs)
+ {
+ if (absSum[TEXT_CHROMA_U][0])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurU, absPartIdx, trWidthC, TEXT_CHROMA_U);
+ if (absSum[TEXT_CHROMA_V][0])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurV, absPartIdx, trWidthC, TEXT_CHROMA_V);
+ }
+ else
+ {
+ uint32_t subTUSize = trWidthC * trWidthC;
+ uint32_t partIdxesPerSubTU = absPartIdxStep >> 1;
+
+ if (absSum[TEXT_CHROMA_U][0])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurU, absPartIdx, trWidthC, TEXT_CHROMA_U);
+ if (absSum[TEXT_CHROMA_U][1])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurU + subTUSize, absPartIdx + partIdxesPerSubTU, trWidthC, TEXT_CHROMA_U);
+ if (absSum[TEXT_CHROMA_V][0])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurV, absPartIdx, trWidthC, TEXT_CHROMA_V);
+ if (absSum[TEXT_CHROMA_V][1])
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurV + subTUSize, absPartIdx + partIdxesPerSubTU, trWidthC, TEXT_CHROMA_V);
+ }
}
singleDist += singleDistComp[TEXT_LUMA][0];
@@ -3815,6 +3856,7 @@
const uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize() >> depth] + 2;
uint32_t trSizeCLog2 = trSizeLog2 - m_hChromaShift;
int chFmt = cu->getChromaFormat();
+ const bool splitIntoSubTUs = (chFmt == CHROMA_422);
if (bSubdivAndCbf && trSizeLog2 <= cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() && trSizeLog2 > cu->getQuadtreeTULog2MinSizeInCU(absPartIdx))
{
@@ -3827,7 +3869,7 @@
uint32_t trWidth = 1 << trSizeLog2;
uint32_t trHeight = trWidth;
uint32_t trWidthC = 1 << trSizeCLog2;
- uint32_t trHeightC = (chFmt == CHROMA_422) ? (trWidthC << 1) : trWidthC;
+ uint32_t trHeightC = splitIntoSubTUs ? (trWidthC << 1) : trWidthC;
const uint32_t numPels = trWidthC * trHeightC;
if (numPels < (MIN_TU_SIZE * MIN_TU_SIZE))
@@ -3868,9 +3910,11 @@
coeff_t *coeffCurU = m_qtTempCoeffCb[qtlayer] + (numCoeffPerAbsPartIdxIncrement * absPartIdx >> (m_hChromaShift + m_vChromaShift));
coeff_t *coeffCurV = m_qtTempCoeffCr[qtlayer] + (numCoeffPerAbsPartIdxIncrement * absPartIdx >> (m_hChromaShift + m_vChromaShift));
bool bCodeChroma = true;
+ uint32_t trModeC = trMode;
if ((trSizeLog2 == 2) && !(chFmt == CHROMA_444))
{
trSizeCLog2++;
+ trModeC--;
uint32_t qpdiv = cu->getPic()->getNumPartInCU() >> ((depth - 1) << 1);
bCodeChroma = ((absPartIdx % qpdiv) == 0);
}
@@ -3883,19 +3927,41 @@
{
if (ttype == TEXT_LUMA && cu->getCbf(absPartIdx, TEXT_LUMA, trMode))
{
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx, trWidth, trHeight, depth, TEXT_LUMA);
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx, trWidth, TEXT_LUMA);
}
if (bCodeChroma)
{
- trWidthC = 1 << trSizeCLog2;
- trHeightC = (chFmt == CHROMA_422) ? (trWidthC << 1) : trWidthC;
- if (ttype == TEXT_CHROMA_U && cu->getCbf(absPartIdx, TEXT_CHROMA_U, trMode))
+ uint32_t trSizeC = 1 << trSizeCLog2;
+
+ if (!splitIntoSubTUs)
{
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurU, absPartIdx, trWidthC, trHeightC, depth, TEXT_CHROMA_U);
+ if (ttype == TEXT_CHROMA_U && cu->getCbf(absPartIdx, TEXT_CHROMA_U, trMode))
+ {
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurU, absPartIdx, trSizeC, TEXT_CHROMA_U);
+ }
+ if (ttype == TEXT_CHROMA_V && cu->getCbf(absPartIdx, TEXT_CHROMA_V, trMode))
+ {
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurV, absPartIdx, trSizeC, TEXT_CHROMA_V);
+ }
}
- if (ttype == TEXT_CHROMA_V && cu->getCbf(absPartIdx, TEXT_CHROMA_V, trMode))
+ else
{
- m_entropyCoder->encodeCoeffNxN(cu, coeffCurV, absPartIdx, trWidthC, trHeightC, depth, TEXT_CHROMA_V);
+ uint32_t partIdxesPerSubTU = cu->getPic()->getNumPartInCU() >> (((cu->getDepth(absPartIdx) + trModeC) << 1) + 1);
+ uint32_t subTUSize = trSizeC * trSizeC;
+ if (ttype == TEXT_CHROMA_U && cu->getCbf(absPartIdx, TEXT_CHROMA_U, trMode))
+ {
+ if (cu->getCbf(absPartIdx, ttype, trMode + 1))
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurU, absPartIdx, trSizeC, TEXT_CHROMA_U);
+ if (cu->getCbf(absPartIdx + partIdxesPerSubTU, ttype, trMode + 1))
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurU + subTUSize, absPartIdx + partIdxesPerSubTU, trSizeC, TEXT_CHROMA_U);
+ }
+ if (ttype == TEXT_CHROMA_V && cu->getCbf(absPartIdx, TEXT_CHROMA_V, trMode))
+ {
+ if (cu->getCbf(absPartIdx, ttype, trMode + 1))
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurV, absPartIdx, trSizeC, TEXT_CHROMA_V);
+ if (cu->getCbf(absPartIdx + partIdxesPerSubTU, ttype, trMode + 1))
+ m_entropyCoder->encodeCoeffNxN(cu, coeffCurV + subTUSize, absPartIdx + partIdxesPerSubTU, trSizeC, TEXT_CHROMA_V);
+ }
}
}
}
More information about the x265-devel
mailing list