[x265] encodeCoeffNxN(): call only if non-zero coeff exists
Steve Borho
steve at borho.org
Fri May 16 12:31:06 CEST 2014
On Fri, May 16, 2014 at 5:23 AM, Satoshi Nakagawa <nakagawa424 at oki.com> wrote:
> # 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
queued for testing along with "cleanup unused arg", thanks
> 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);
> + }
> }
> }
> }
> _______________________________________________
> 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