[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