[x265] fix: residualQTIntrachroma() for 4:2:2

Satoshi Nakagawa nakagawa424 at oki.com
Mon May 5 16:56:17 CEST 2014


# HG changeset patch
# User Satoshi Nakagawa <nakagawa424 at oki.com>
# Date 1399301165 -32400
#      Mon May 05 23:46:05 2014 +0900
# Node ID d46ae184365e85997b0ab1a64a608a0cb7997b6d
# Parent  dcf74ea39e3157ff1e66331db56f03edd5f9b810
fix: residualQTIntrachroma() for 4:2:2

diff -r dcf74ea39e31 -r d46ae184365e source/Lib/TLibEncoder/TEncEntropy.cpp
--- a/source/Lib/TLibEncoder/TEncEntropy.cpp	Sat May 03 15:08:24 2014 -0500
+++ b/source/Lib/TLibEncoder/TEncEntropy.cpp	Mon May 05 23:46:05 2014 +0900
@@ -367,13 +367,14 @@
             m_entropyCoderIf->codeCoeffNxN(cu, (cu->getCoeffY() + offsetLuma), absPartIdx, width, depth, TEXT_LUMA);
         }
 
-        if ((log2TrafoSize == 2) && !(cu->getChromaFormat() == CHROMA_444))
+        int chFmt = cu->getChromaFormat();
+        if ((log2TrafoSize == 2) && !(chFmt == CHROMA_444))
         {
             uint32_t partNum = cu->getPic()->getNumPartInCU() >> ((depth - 1) << 1);
             if ((absPartIdx % partNum) == (partNum - 1))
             {
                 uint32_t trWidthC          = log2TrafoSize << 1;
-                const bool splitIntoSubTUs = (cu->getChromaFormat() == CHROMA_422) ? true : false;
+                const bool splitIntoSubTUs = (chFmt == CHROMA_422);
 
                 uint32_t curPartNum = cu->getPic()->getNumPartInCU() >> ((depth - 1) << 1);
 
@@ -399,7 +400,7 @@
         {
             uint32_t trWidthC  = width  >> hChromaShift;
             uint32_t trHeightC = height >> vChromaShift;
-            const bool splitIntoSubTUs = trWidthC != trHeightC;
+            const bool splitIntoSubTUs = (chFmt == CHROMA_422);
             trHeightC = splitIntoSubTUs ? trHeightC >> 1 : trHeightC;
             uint32_t curPartNum = cu->getPic()->getNumPartInCU() >> (depth << 1);
             for (uint32_t chromaId = TEXT_CHROMA; chromaId < MAX_NUM_COMPONENT; chromaId++)
@@ -439,11 +440,12 @@
     if (cu->isIntra(absPartIdx)) // If it is Intra mode, encode intra prediction mode.
     {
         encodeIntraDirModeLuma(cu, absPartIdx, true);
-        if (cu->getChromaFormat() != CHROMA_400)
+        int chFmt = cu->getChromaFormat();
+        if (chFmt != CHROMA_400)
         {
             encodeIntraDirModeChroma(cu, absPartIdx);
 
-            if ((cu->getChromaFormat() == CHROMA_444) && (cu->getPartitionSize(absPartIdx) == SIZE_NxN))
+            if ((chFmt == CHROMA_444) && (cu->getPartitionSize(absPartIdx) == SIZE_NxN))
             {
                 uint32_t partOffset = (cu->getPic()->getNumPartInCU() >> (cu->getDepth(absPartIdx) << 1)) >> 2;
                 encodeIntraDirModeChroma(cu, absPartIdx + partOffset);
diff -r dcf74ea39e31 -r d46ae184365e source/Lib/TLibEncoder/TEncSearch.cpp
--- a/source/Lib/TLibEncoder/TEncSearch.cpp	Sat May 03 15:08:24 2014 -0500
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp	Mon May 05 23:46:05 2014 +0900
@@ -168,7 +168,6 @@
     uint32_t trMode     = cu->getTransformIdx(absPartIdx);
     uint32_t subdiv     = (trMode > trDepth ? 1 : 0);
     uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize()] + 2 - fullDepth;
-    int      chFmt      = cu->getChromaFormat();
 
     if (cu->getPredictionMode(0) == MODE_INTRA && cu->getPartitionSize(0) == SIZE_NxN && trDepth == 0)
     {
@@ -197,6 +196,7 @@
 
     if (bChroma)
     {
+        int      chFmt      = cu->getChromaFormat();
         if ((trSizeLog2 > 2) && !(chFmt == CHROMA_444))
         {
             if (trDepth == 0 || cu->getCbf(absPartIdx, TEXT_CHROMA_U, trDepth - 1))
@@ -235,9 +235,6 @@
     uint32_t fullDepth  = cu->getDepth(0) + trDepth;
     uint32_t trMode     = cu->getTransformIdx(absPartIdx);
     uint32_t subdiv     = (trMode > trDepth ? 1 : 0);
-    uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize()] + 2 - fullDepth;
-    uint32_t chroma     = (ttype != TEXT_LUMA ? 1 : 0);
-    int chFmt           = cu->getChromaFormat();
 
     if (subdiv)
     {
@@ -250,6 +247,8 @@
         return;
     }
 
+    uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize()] + 2 - fullDepth;
+    int chFmt           = cu->getChromaFormat();
     if ((ttype != TEXT_LUMA) && (trSizeLog2 == 2) && !(chFmt == CHROMA_444))
     {
         assert(trDepth > 0);
@@ -263,6 +262,7 @@
     }
 
     //===== coefficients =====
+    uint32_t chroma     = (ttype != TEXT_LUMA ? 1 : 0);
     int cspx = chroma ? m_hChromaShift : 0;
     int cspy = chroma ? m_vChromaShift : 0;
     uint32_t width = cu->getCUSize(0) >> (trDepth + cspx);
@@ -409,7 +409,6 @@
     pixel*   fenc         = fencYuv->getLumaAddr(absPartIdx);
     pixel*   pred         = predYuv->getLumaAddr(absPartIdx);
     int16_t* residual     = resiYuv->getLumaAddr(absPartIdx);
-    int      chFmt        = cu->getChromaFormat();
     int      part         = partitionFromSizes(width, height);
 
     uint32_t trSizeLog2     = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize() >> fullDepth] + 2;
@@ -453,6 +452,7 @@
     int lastPos = -1;
     cu->setTrIdxSubParts(trDepth, absPartIdx, fullDepth);
 
+    int      chFmt        = cu->getChromaFormat();
     m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA, QP_BD_OFFSET, 0, chFmt);
     m_trQuant->selectLambda(TEXT_LUMA);
 
@@ -515,7 +515,7 @@
 
     TextType ttype          = (chromaId == 1) ? TEXT_CHROMA_U : TEXT_CHROMA_V;
     uint32_t width          = cu->getCUSize(absPartIdx)  >> (trDepth + m_hChromaShift);
-    uint32_t height         = cu->getCUSize(absPartIdx) >> (trDepth + m_vChromaShift);
+    uint32_t height         = width;
     uint32_t stride         = fencYuv->getCStride();
     pixel*   fenc           = (chromaId == 1) ? fencYuv->getCbAddr(absPartIdx) : fencYuv->getCrAddr(absPartIdx);
     pixel*   pred           = (chromaId == 1) ? predYuv->getCbAddr(absPartIdx) : predYuv->getCrAddr(absPartIdx);
@@ -530,7 +530,6 @@
     pixel*   reconIPred       = (chromaId == 1) ? cu->getPic()->getPicYuvRec()->getCbAddr(cu->getAddr(), zorder) : cu->getPic()->getPicYuvRec()->getCrAddr(cu->getAddr(), zorder);
     uint32_t reconIPredStride = cu->getPic()->getPicYuvRec()->getCStride();
     bool     useTransformSkipChroma = cu->getTransformSkip(absPartIdx, ttype);
-    height = (width != height) ? height >> 1 : height;
     int      part = partitionFromSizes(width, height);
 
     if (!bReusePred)
@@ -546,7 +545,6 @@
             uint32_t lumaLCUIdx  = (chFmt == CHROMA_444) ? absPartIdx : absPartIdx & (~((1 << (2 * g_addCUDepth)) - 1));
             chromaPredMode = cu->getLumaIntraDir(lumaLCUIdx);
         }
-
         chromaPredMode = (chFmt == CHROMA_422) ? g_chroma422IntraAngleMappingTable[chromaPredMode] : chromaPredMode;
         //===== get prediction signal =====
         predIntraChromaAng(chromaPred, chromaPredMode, pred, stride, width, height, chFmt);
@@ -1033,15 +1031,16 @@
     {
         uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize() >> fullDepth] + 2;
         uint32_t qtlayer    = cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
+        int      chFmt      = cu->getChromaFormat();
 
         bool bChromaSame = false;
-        if (trSizeLog2 == 2 && !(cu->getChromaFormat() == CHROMA_444))
+        if (trSizeLog2 == 2 && !(chFmt == CHROMA_444))
         {
             assert(trDepth > 0);
             trDepth--;
             uint32_t qpdiv = cu->getPic()->getNumPartInCU() >> ((cu->getDepth(0) + trDepth) << 1);
             bool bFirstQ = ((absPartIdx % qpdiv) == 0);
-            bool bSecondQ = (cu->getChromaFormat() == CHROMA_422) ? ((absPartIdx % qpdiv) == 2) : false;
+            bool bSecondQ = (chFmt == CHROMA_422) ? ((absPartIdx % qpdiv) == 2) : false;
             if ((!bFirstQ) && (!bSecondQ))
             {
                 return;
@@ -1082,15 +1081,16 @@
     {
         uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize() >> fullDepth] + 2;
         uint32_t qtlayer    = cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
+        int      chFmt      = cu->getChromaFormat();
 
         bool bChromaSame = false;
-        if (trSizeLog2 == 2 && !(cu->getChromaFormat() == CHROMA_444))
+        if (trSizeLog2 == 2 && !(chFmt == CHROMA_444))
         {
             assert(trDepth > 0);
             trDepth--;
             uint32_t qpdiv = cu->getPic()->getNumPartInCU() >> ((cu->getDepth(0) + trDepth) << 1);
             bool bFirstQ = ((absPartIdx % qpdiv) == 0);
-            bool bSecondQ = (cu->getChromaFormat() == CHROMA_422) ? ((absPartIdx % qpdiv) == 2) : false;
+            bool bSecondQ = (chFmt == CHROMA_422) ? ((absPartIdx % qpdiv) == 2) : false;
             if ((!bFirstQ) && (!bSecondQ))
             {
                 return;
@@ -1192,11 +1192,11 @@
 
     if (trMode == trDepth)
     {
+        int      chFmt     = cu->getChromaFormat();
         bool checkTransformSkip = cu->getSlice()->getPPS()->getUseTransformSkip();
         uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize() >> fullDepth] + 2;
-
         uint32_t actualTrDepth = trDepth;
-        if ((trSizeLog2 == 2) && !(cu->getChromaFormat() == CHROMA_444))
+        if ((trSizeLog2 == 2) && !(chFmt == CHROMA_444))
         {
             assert(trDepth > 0);
             actualTrDepth--;
@@ -1208,11 +1208,10 @@
             }
         }
 
-        uint32_t width  = cu->getCUSize(0)  >> (actualTrDepth + m_hChromaShift);
-        uint32_t height = cu->getCUSize(0)  >> (actualTrDepth + m_vChromaShift);
-        const bool splitIntoSubTUs = width != height;
-
-        checkTransformSkip &= (width <= 4);
+        uint32_t tuSize = cu->getCUSize(0) >> (actualTrDepth + m_hChromaShift);
+        const bool splitIntoSubTUs = (chFmt == CHROMA_422);
+
+        checkTransformSkip &= (tuSize <= 4);
 
         if (m_cfg->param->bEnableTSkipFast)
         {
@@ -1349,10 +1348,10 @@
 {
     uint32_t fullDepth = cu->getDepth(0) + trDepth;
     uint32_t trMode    = cu->getTransformIdx(absPartIdx);
-    int      chFmt     = cu->getChromaFormat();
 
     if (trMode == trDepth)
     {
+        int      chFmt     = cu->getChromaFormat();
         uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize() >> fullDepth] + 2;
         uint32_t qtlayer    = cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
 
@@ -1406,13 +1405,14 @@
 {
     uint32_t fullDepth = cu->getDepth(0) + trDepth;
     uint32_t trMode    = cu->getTransformIdx(absPartIdx);
-    int      chFmt     = cu->getChromaFormat();
 
     if (trMode == trDepth)
     {
+        int      chFmt     = cu->getChromaFormat();
         uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize() >> fullDepth] + 2;
+        uint32_t origTrDepth = trDepth;
         uint32_t actualTrDepth = trDepth;
-        if (trSizeLog2 == 2)
+        if ((trSizeLog2 == 2) && !(chFmt == CHROMA_444))
         {
             assert(trDepth > 0);
             actualTrDepth--;
@@ -1424,88 +1424,108 @@
             }
         }
 
-        cu->setTransformSkipSubParts(0, TEXT_CHROMA_U, absPartIdx, cu->getDepth(0) +  actualTrDepth);
-        cu->setTransformSkipSubParts(0, TEXT_CHROMA_V, absPartIdx, cu->getDepth(0) +  actualTrDepth);
-        uint32_t width          = cu->getCUSize(0) >> (trDepth + m_hChromaShift);
-        uint32_t height         = cu->getCUSize(0) >> (trDepth + m_vChromaShift);
-        uint32_t stride         = fencYuv->getCStride();
-
-        for (uint32_t chromaId = 0; chromaId < 2; chromaId++)
+        uint32_t width  = cu->getCUSize(0) >> (actualTrDepth + m_hChromaShift);
+        uint32_t height = width;
+        uint32_t stride = fencYuv->getCStride();
+        const bool splitIntoSubTUs = (chFmt == CHROMA_422);
+
+        for (int chromaId = TEXT_CHROMA; chromaId < MAX_NUM_COMPONENT; chromaId++)
         {
-            TextType ttype          = (chromaId > 0 ? TEXT_CHROMA_V : TEXT_CHROMA_U);
-            uint32_t chromaPredMode = cu->getChromaIntraDir(absPartIdx);
-            pixel*   fenc           = (chromaId > 0 ? fencYuv->getCrAddr(absPartIdx) : fencYuv->getCbAddr(absPartIdx));
-            pixel*   pred           = (chromaId > 0 ? predYuv->getCrAddr(absPartIdx) : predYuv->getCbAddr(absPartIdx));
-            int16_t* residual       = (chromaId > 0 ? resiYuv->getCrAddr(absPartIdx) : resiYuv->getCbAddr(absPartIdx));
-            pixel*   recon          = (chromaId > 0 ? reconYuv->getCrAddr(absPartIdx) : reconYuv->getCbAddr(absPartIdx));
-            uint32_t numCoeffPerInc = (cu->getSlice()->getSPS()->getMaxCUSize() * cu->getSlice()->getSPS()->getMaxCUSize() >> (cu->getSlice()->getSPS()->getMaxCUDepth() << 1)) >> 2;
-            coeff_t*  coeff         = (chromaId > 0 ? cu->getCoeffCr() : cu->getCoeffCb()) + numCoeffPerInc * absPartIdx;
-
-            uint32_t zorder           = cu->getZorderIdxInCU() + absPartIdx;
-            pixel*   reconIPred       = (chromaId > 0 ? cu->getPic()->getPicYuvRec()->getCrAddr(cu->getAddr(), zorder) : cu->getPic()->getPicYuvRec()->getCbAddr(cu->getAddr(), zorder));
-            uint32_t reconIPredStride = cu->getPic()->getPicYuvRec()->getCStride();
-            bool     useTransformSkipChroma = cu->getTransformSkip(absPartIdx, ttype);
-            //===== update chroma mode =====
-            if (chromaPredMode == DM_CHROMA_IDX)
+            TComTURecurse tuIterator;
+            uint32_t curPartNum = cu->getPic()->getNumPartInCU() >> ((cu->getDepth(0) +  actualTrDepth) << 1);
+            initSection(&tuIterator, splitIntoSubTUs ? VERTICAL_SPLIT : DONT_SPLIT, curPartNum, absPartIdx);
+
+            do
             {
-                chromaPredMode = cu->getLumaIntraDir(0);
+                uint32_t absTUPartIdxC = tuIterator.m_absPartIdxTURelCU;
+                cu->setTransformSkipPartRange(0, (TextType)chromaId, absTUPartIdxC, tuIterator.m_absPartIdxStep);
+
+                TextType ttype          = (chromaId == 1) ? TEXT_CHROMA_U : TEXT_CHROMA_V;
+                pixel*   fenc           = (chromaId == 1) ? fencYuv->getCbAddr(absTUPartIdxC) : fencYuv->getCrAddr(absTUPartIdxC);
+                pixel*   pred           = (chromaId == 1) ? predYuv->getCbAddr(absTUPartIdxC) : predYuv->getCrAddr(absTUPartIdxC);
+                int16_t* residual       = (chromaId == 1) ? resiYuv->getCbAddr(absTUPartIdxC) : resiYuv->getCrAddr(absTUPartIdxC);
+                pixel*   recon          = (chromaId == 1) ? reconYuv->getCbAddr(absTUPartIdxC) : reconYuv->getCrAddr(absTUPartIdxC);
+                uint32_t numCoeffPerInc = (cu->getSlice()->getSPS()->getMaxCUSize() * cu->getSlice()->getSPS()->getMaxCUSize() >> (cu->getSlice()->getSPS()->getMaxCUDepth() << 1)) >> (m_hChromaShift + m_vChromaShift);
+                coeff_t*  coeff         = (chromaId == 1 ? cu->getCoeffCb() : cu->getCoeffCr()) + numCoeffPerInc * absTUPartIdxC;
+                uint32_t zorder           = cu->getZorderIdxInCU() + absTUPartIdxC;
+                pixel*   reconIPred       = (chromaId == 1) ? cu->getPic()->getPicYuvRec()->getCbAddr(cu->getAddr(), zorder) : cu->getPic()->getPicYuvRec()->getCrAddr(cu->getAddr(), zorder);
+                uint32_t reconIPredStride = cu->getPic()->getPicYuvRec()->getCStride();
+                //bool     useTransformSkipChroma = cu->getTransformSkip(absTUPartIdxC, ttype);
+                const bool useTransformSkipChroma = false;
+
+                uint32_t chromaPredMode = cu->getChromaIntraDir(absTUPartIdxC);
+                //===== update chroma mode =====
+                if (chromaPredMode == DM_CHROMA_IDX)
+                {
+                    uint32_t lumaLCUIdx  = (chFmt == CHROMA_444) ? absTUPartIdxC : absTUPartIdxC & (~((1 << (2 * g_addCUDepth)) - 1));
+                    chromaPredMode = cu->getLumaIntraDir(lumaLCUIdx);
+                }
+                chromaPredMode = (chFmt == CHROMA_422) ? g_chroma422IntraAngleMappingTable[chromaPredMode] : chromaPredMode;
+                //===== init availability pattern =====
+                TComPattern::initAdiPatternChroma(cu, absTUPartIdxC, actualTrDepth, m_predBuf, m_predBufStride, m_predBufHeight, chromaId);
+                pixel* chromaPred = TComPattern::getAdiChromaBuf(chromaId, height, m_predBuf);
+
+                //===== get prediction signal =====
+                predIntraChromaAng(chromaPred, chromaPredMode, pred, stride, width, height, chFmt);
+
+                //===== get residual signal =====
+                assert(!((uint32_t)(size_t)fenc & (width - 1)));
+                assert(!((uint32_t)(size_t)pred & (width - 1)));
+                assert(!((uint32_t)(size_t)residual & (width - 1)));
+                int size = g_convertToBit[width];
+                primitives.calcresidual[size](fenc, pred, residual, stride);
+
+                //--- transform and quantization ---
+                uint32_t absSum = 0;
+                int lastPos = -1;
+
+                int curChromaQpOffset;
+                if (ttype == TEXT_CHROMA_U)
+                {
+                    curChromaQpOffset = cu->getSlice()->getPPS()->getChromaCbQpOffset() + cu->getSlice()->getSliceQpDeltaCb();
+                }
+                else
+                {
+                    curChromaQpOffset = cu->getSlice()->getPPS()->getChromaCrQpOffset() + cu->getSlice()->getSliceQpDeltaCr();
+                }
+                m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA, cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
+                m_trQuant->selectLambda(TEXT_CHROMA);
+
+                absSum = m_trQuant->transformNxN(cu, residual, stride, coeff, width, ttype, absTUPartIdxC, &lastPos, useTransformSkipChroma);
+
+                //--- set coded block flag ---
+                cu->setCbfPartRange((((absSum > 0) ? 1 : 0) << origTrDepth), ttype, absTUPartIdxC, tuIterator.m_absPartIdxStep);
+
+                //--- inverse transform ---
+                if (absSum)
+                {
+                    int scalingListType = 0 + ttype;
+                    assert(scalingListType < 6);
+                    m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absTUPartIdxC), REG_DCT, residual, stride, coeff, width, scalingListType, useTransformSkipChroma, lastPos);
+                }
+                else
+                {
+                    int16_t* resiTmp = residual;
+                    memset(coeff, 0, sizeof(coeff_t) * width * height);
+                    primitives.blockfill_s[size](resiTmp, stride, 0);
+                }
+
+                //===== reconstruction =====
+                assert(((intptr_t)residual & (width - 1)) == 0);
+                assert(width <= 32);
+
+                // use square primitive
+                int part = partitionFromSizes(width, width);
+                primitives.chroma[CHROMA_444].add_ps[part](recon, stride, pred, residual, stride, stride);
+                primitives.chroma[CHROMA_444].copy_pp[part](reconIPred, reconIPredStride, recon, stride);
             }
-            //===== init availability pattern =====
-            TComPattern::initAdiPatternChroma(cu, absPartIdx, trDepth, m_predBuf, m_predBufStride, m_predBufHeight, chromaId + 1);
-            pixel* chromaPred = TComPattern::getAdiChromaBuf(chromaId + 1, height, m_predBuf);
-
-            //===== get prediction signal =====
-            predIntraChromaAng(chromaPred, chromaPredMode, pred, stride, width, height, chFmt);
-
-            //===== get residual signal =====
-            assert(!((uint32_t)(size_t)fenc & (width - 1)));
-            assert(!((uint32_t)(size_t)pred & (width - 1)));
-            assert(!((uint32_t)(size_t)residual & (width - 1)));
-            int size = g_convertToBit[width];
-            primitives.calcresidual[size](fenc, pred, residual, stride);
-
-            //--- transform and quantization ---
-            uint32_t absSum = 0;
-            int lastPos = -1;
-
-            int curChromaQpOffset;
-            if (ttype == TEXT_CHROMA_U)
+            while (isNextSection(&tuIterator));
+
+            if (splitIntoSubTUs)
             {
-                curChromaQpOffset = cu->getSlice()->getPPS()->getChromaCbQpOffset() + cu->getSlice()->getSliceQpDeltaCb();
+                offsetSubTUCBFs(cu, (TextType)chromaId, trDepth, absPartIdx);
             }
-            else
-            {
-                curChromaQpOffset = cu->getSlice()->getPPS()->getChromaCrQpOffset() + cu->getSlice()->getSliceQpDeltaCr();
-            }
-            m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA, cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
-
-            m_trQuant->selectLambda(TEXT_CHROMA);
-
-            absSum = m_trQuant->transformNxN(cu, residual, stride, coeff, width, ttype, absPartIdx, &lastPos, useTransformSkipChroma);
-
-            //--- set coded block flag ---
-            cu->setCbfSubParts((absSum ? 1 : 0) << trDepth, ttype, absPartIdx, cu->getDepth(0) + trDepth);
-
-            //--- inverse transform ---
-            if (absSum)
-            {
-                int scalingListType = 0 + ttype;
-                assert(scalingListType < 6);
-                m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), REG_DCT, residual, stride, coeff, width, scalingListType, useTransformSkipChroma, lastPos);
-            }
-            else
-            {
-                int16_t* resiTmp = residual;
-                memset(coeff, 0, sizeof(coeff_t) * width * height);
-                primitives.blockfill_s[size](resiTmp, stride, 0);
-            }
-
-            //===== reconstruction =====
-            assert(((uint32_t)(size_t)residual & (width - 1)) == 0);
-            assert(width <= 32);
-            int part = partitionFromSizes(cu->getCUSize(0) >> (trDepth), cu->getCUSize(0) >> (trDepth));
-            primitives.chroma[m_cfg->param->internalCsp].add_ps[part](recon, stride, pred, residual, stride, stride);
-            primitives.chroma[m_cfg->param->internalCsp].copy_pp[part](reconIPred, reconIPredStride, recon, stride);
         }
     }
     else
@@ -3060,7 +3080,7 @@
     trWidth = trHeight  = 1 << trSizeLog2;
     trWidthC            = 1 << trSizeCLog2;
     trHeightC           = (chFmt == CHROMA_422) ? (trWidthC << 1) : trWidthC;
-    const bool splitIntoSubTUs = trWidthC != trHeightC;
+    const bool splitIntoSubTUs = (chFmt == CHROMA_422);
     uint32_t absPartIdxStep = cu->getPic()->getNumPartInCU() >> ((cu->getDepth(0) +  trModeC) << 1);
 
     // code full block
@@ -3898,12 +3918,12 @@
 void TEncSearch::xSetResidualQTData(TComDataCU* cu, uint32_t absPartIdx, uint32_t absTUPartIdx, ShortYuv* resiYuv, uint32_t depth, bool bSpatial)
 {
     assert(cu->getDepth(0) == cu->getDepth(absPartIdx));
-    int            chFmt     = cu->getChromaFormat();
     const uint32_t curTrMode = depth - cu->getDepth(0);
     const uint32_t trMode    = cu->getTransformIdx(absPartIdx);
 
     if (curTrMode == trMode)
     {
+        int            chFmt     = cu->getChromaFormat();
         const uint32_t trSizeLog2 = g_convertToBit[cu->getSlice()->getSPS()->getMaxCUSize() >> depth] + 2;
         uint32_t  trSizeCLog2     = trSizeLog2 - m_hChromaShift;
         const uint32_t qtlayer    = cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
diff -r dcf74ea39e31 -r d46ae184365e source/encoder/compress.cpp
--- a/source/encoder/compress.cpp	Sat May 03 15:08:24 2014 -0500
+++ b/source/encoder/compress.cpp	Mon May 05 23:46:05 2014 +0900
@@ -498,10 +498,7 @@
                 if (outBestCU->getSlice()->getSliceType() == P_SLICE)
                 {
                     /*compute intra cost */
-
-                    // TODO: residualQTIntrachroma is broken for 4:2:2
-                    bool bdoIntra = (m_param->internalCsp != X265_CSP_I422);
-                    // bool bdoIntra = true;
+                    bool bdoIntra = true;
 
                     if (m_param->rdLevel > 2)
                     {


More information about the x265-devel mailing list