[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