# HG changeset patch
# User [email protected]
# Date 1389364599 -19800
# Fri Jan 10 20:06:39 2014 +0530
# Node ID fd3dde2aa2960b801c0927301eb836eddc2443cb
# Parent c95b1f7269df342ea0d8172af0df1d54b981281a
Modifications to address review comments to support multiple color space format
diff -r c95b1f7269df -r fd3dde2aa296 source/Lib/TLibCommon/TComDataCU.cpp
--- a/source/Lib/TLibCommon/TComDataCU.cpp Fri Jan 10 14:57:18 2014 +0530
+++ b/source/Lib/TLibCommon/TComDataCU.cpp Fri Jan 10 20:06:39 2014 +0530
@@ -628,6 +628,7 @@
uint32_t tmp2 = m_absIdxInLCU * m_pic->getMinCUWidth() *
m_pic->getMinCUHeight();
memcpy(rpcCU->getCoeffY() + tmp2, m_trCoeffY, sizeof(TCoeff) * tmp);
memcpy(rpcCU->getPCMSampleY() + tmp2, m_iPCMSampleY, sizeof(Pel) * tmp);
+
tmp = ((g_maxCUWidth >> m_hChromaShift) * (g_maxCUHeight >>
m_vChromaShift)) >> (uhDepth << 1);
tmp2 = m_absIdxInLCU * (m_pic->getMinCUWidth() >> m_hChromaShift) *
(m_pic->getMinCUHeight() >> m_vChromaShift);
memcpy(rpcCU->getCoeffCb() + tmp2, m_trCoeffCb, sizeof(TCoeff) * tmp);
@@ -2957,14 +2958,17 @@
+ (partHeight /
m_pic->getMinCUHeight()) / 2 * m_pic->getNumPartInWidth()
+ (partWidth / m_pic->getMinCUWidth())
/ 2];
}
+
uint32_t TComDataCU::getCoefScanIdx(uint32_t absPartIdx, uint32_t width, bool
bIsLuma, bool bIsIntra)
{
uint32_t scanIdx;
uint32_t dirMode;
+
if (!bIsIntra)
{
return SCAN_DIAG;
}
+
//check that MDCS can be used for this TU
uint32_t height = width; // For testing Need to change later
@@ -3017,12 +3021,11 @@
break;
default:
- //std::cerr << "ERROR: Unrecognised MDCS mode" << std::endl;
- //assert(false);
- scanIdx = 0;
- //exit(1);
+ assert(false);
+ x265_log(NULL, X265_LOG_ERROR, "Unrecognised MDCS mode\n");
break;
}
+
return scanIdx;
}
diff -r c95b1f7269df -r fd3dde2aa296 source/Lib/TLibEncoder/TEncSearch.cpp
--- a/source/Lib/TLibEncoder/TEncSearch.cpp Fri Jan 10 14:57:18 2014 +0530
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp Fri Jan 10 20:06:39 2014 +0530
@@ -526,7 +526,9 @@
uint32_t origTrDepth = trDepth;
uint32_t fullDepth = cu->getDepth(0) + trDepth;
uint32_t trSizeLog2 =
g_convertToBit[cu->getSlice()->getSPS()->getMaxCUWidth() >> fullDepth] + 2;
- if ((trSizeLog2 == 2) && !(cu->getChromaFormat() == CHROMA_444))
+ int chFmt = cu->getChromaFormat();
+
+ if ((trSizeLog2 == 2) && !(chFmt == CHROMA_444))
{
assert(trDepth > 0);
trDepth--;
@@ -537,6 +539,7 @@
return;
}
}
+
TextType ttype = (chromaId > 0 ? TEXT_CHROMA_V : TEXT_CHROMA_U);
uint32_t chromaPredMode = cu->getChromaIntraDir(absPartIdx);
uint32_t width = cu->getWidth(0) >> (trDepth + m_hChromaShift);
@@ -546,11 +549,13 @@
Pel* pred = (chromaId > 0 ? predYuv->getCrAddr(absPartIdx) :
predYuv->getCbAddr(absPartIdx));
int16_t* residual = (chromaId > 0 ? resiYuv->getCrAddr(absPartIdx) :
resiYuv->getCbAddr(absPartIdx));
Pel* recon = (chromaId > 0 ? predYuv->getCrAddr(absPartIdx) :
predYuv->getCbAddr(absPartIdx));
+
uint32_t qtlayer =
cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
uint32_t numCoeffPerInc = (cu->getSlice()->getSPS()->getMaxCUWidth() *
cu->getSlice()->getSPS()->getMaxCUHeight() >>
(cu->getSlice()->getSPS()->getMaxCUDepth() << 1)) >> (m_hChromaShift +
m_vChromaShift);
TCoeff* coeff = (chromaId > 0 ? m_qtTempCoeffCr[qtlayer] :
m_qtTempCoeffCb[qtlayer]) + numCoeffPerInc * absPartIdx;
int16_t* reconQt = (chromaId > 0 ?
m_qtTempTComYuv[qtlayer].getCrAddr(absPartIdx) :
m_qtTempTComYuv[qtlayer].getCbAddr(absPartIdx));
uint32_t reconQtStride = m_qtTempTComYuv[qtlayer].m_cwidth;
+
uint32_t zorder = cu->getZorderIdxInCU() + absPartIdx;
Pel* reconIPred = (chromaId > 0 ?
cu->getPic()->getPicYuvRec()->getCrAddr(cu->getAddr(), zorder) :
cu->getPic()->getPicYuvRec()->getCbAddr(cu->getAddr(), zorder));
uint32_t reconIPredStride = cu->getPic()->getPicYuvRec()->getCStride();
@@ -562,14 +567,18 @@
{
chromaPredMode = cu->getLumaIntraDir(absPartIdx);
}
+
//===== init availability pattern =====
if (default0Save1Load2 != 2)
{
cu->getPattern()->initPattern(cu, trDepth, absPartIdx);
+
cu->getPattern()->initAdiPatternChroma(cu, absPartIdx, trDepth,
m_predBuf, m_predBufStride, m_predBufHeight, chromaId);
Pel* chromaPred = (chromaId > 0 ? cu->getPattern()->getAdiCrBuf(width,
height, m_predBuf) : cu->getPattern()->getAdiCbBuf(width, height, m_predBuf));
+
//===== get prediction signal =====
- predIntraChromaAng(chromaPred, chromaPredMode, pred, stride, width,
height, cu->getChromaFormat());
+ predIntraChromaAng(chromaPred, chromaPredMode, pred, stride, width,
height, chFmt);
+
// save prediction
if (default0Save1Load2 == 1)
{
@@ -611,8 +620,10 @@
{
curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCrQpOffset() +
cu->getSlice()->getSliceQpDeltaCr();
}
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ 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,
height, ttype, absPartIdx, &lastPos, useTransformSkipChroma);
//--- set coded block flag ---
@@ -637,6 +648,7 @@
assert(((uint32_t)(size_t)residual & (width - 1)) == 0);
assert(width <= 32);
primitives.calcrecon[size](pred, residual, recon, reconQt, reconIPred,
stride, reconQtStride, reconIPredStride);
+
//===== update distortion =====
uint32_t dist = primitives.sse_pp[part](fenc, stride, recon, stride);
if (ttype == TEXT_CHROMA_U)
@@ -1534,13 +1546,15 @@
{
uint32_t fullDepth = cu->getDepth(0) + trDepth;
uint32_t trMode = cu->getTransformIdx(absPartIdx);
+ int chFmt = cu->getChromaFormat();
if (trMode == trDepth)
{
uint32_t trSizeLog2 =
g_convertToBit[cu->getSlice()->getSPS()->getMaxCUWidth() >> fullDepth] + 2;
uint32_t qtlayer =
cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() - trSizeLog2;
+
bool bChromaSame = false;
- if ((trSizeLog2 == 2) && !(cu->getChromaFormat() == CHROMA_444))
+ if ((trSizeLog2 == 2) && !(chFmt == CHROMA_444))
{
assert(trDepth > 0);
uint32_t qpdiv = cu->getPic()->getNumPartInCU() >>
((cu->getDepth(0) + trDepth - 1) << 1);
@@ -1566,8 +1580,9 @@
TCoeff* coeffDstV = cu->getCoeffCr() + (numCoeffIncC *
absPartIdx);
::memcpy(coeffDstU, coeffSrcU, sizeof(TCoeff) * numCoeffC);
::memcpy(coeffDstV, coeffSrcV, sizeof(TCoeff) * numCoeffC);
+
//===== copy reconstruction =====
- uint32_t trSizeCLog2 = (bChromaSame || (cu->getChromaFormat() ==
CHROMA_444)) ? trSizeLog2 : trSizeLog2 - 1;
+ uint32_t trSizeCLog2 = (bChromaSame || (chFmt == CHROMA_444)) ?
trSizeLog2 : trSizeLog2 - 1;
m_qtTempTComYuv[qtlayer].copyPartToPartChroma(reconYuv, absPartIdx, 1
<< trSizeCLog2, 1 << trSizeCLog2);
}
else
@@ -1590,6 +1605,8 @@
{
uint32_t fullDepth = cu->getDepth(0) + trDepth;
uint32_t trMode = cu->getTransformIdx(absPartIdx);
+ int chFmt = cu->getChromaFormat();
+
if (trMode == trDepth)
{
uint32_t trSizeLog2 =
g_convertToBit[cu->getSlice()->getSPS()->getMaxCUWidth() >> fullDepth] + 2;
@@ -1636,8 +1653,10 @@
cu->getPattern()->initPattern(cu, trDepth, absPartIdx);
cu->getPattern()->initAdiPatternChroma(cu, absPartIdx, trDepth,
m_predBuf, m_predBufStride, m_predBufHeight, chromaId);
Pel* chromaPred = (chromaId > 0 ?
cu->getPattern()->getAdiCrBuf(width, height, m_predBuf) :
cu->getPattern()->getAdiCbBuf(width, height, m_predBuf));
+
//===== get prediction signal =====
- predIntraChromaAng(chromaPred, chromaPredMode, pred, stride,
width, height, cu->getChromaFormat());
+ 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)));
@@ -1658,8 +1677,10 @@
{
curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCrQpOffset() +
cu->getSlice()->getSliceQpDeltaCr();
}
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ 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, height, ttype, absPartIdx, &lastPos, useTransformSkipChroma);
//--- set coded block flag ---
@@ -1713,10 +1734,11 @@
uint32_t width = cu->getWidth(0) >> 1;
uint32_t height = cu->getHeight(0) >> 1;
uint32_t stride = fencYuv->getCStride();
- Pel* fencU = fencYuv->getCbAddr(0);
- Pel* fencV = fencYuv->getCrAddr(0);
- Pel* predU = predYuv->getCbAddr(0);
- Pel* predV = predYuv->getCrAddr(0);
+ int chFmt = cu->getChromaFormat();
+ Pel* fencU = fencYuv->getCbAddr(0);
+ Pel* fencV = fencYuv->getCrAddr(0);
+ Pel* predU = predYuv->getCbAddr(0);
+ Pel* predV = predYuv->getCrAddr(0);
//===== init pattern =====
assert(width == height);
@@ -1725,6 +1747,7 @@
cu->getPattern()->initAdiPatternChroma(cu, 0, 0, m_predBuf,
m_predBufStride, m_predBufHeight, 1/*chromaId*/);
Pel* patChromaU = cu->getPattern()->getAdiCbBuf(width, height, m_predBuf);
Pel* patChromaV = cu->getPattern()->getAdiCrBuf(width, height, m_predBuf);
+
//===== get best prediction modes (using SAD) =====
uint32_t minMode = 0;
uint32_t maxMode = 4;
@@ -1734,8 +1757,9 @@
for (uint32_t mode = minMode; mode < maxMode; mode++)
{
//--- get prediction ---
- predIntraChromaAng(patChromaU, mode, predU, stride, width, height,
cu->getChromaFormat());
- predIntraChromaAng(patChromaV, mode, predV, stride, width, height,
cu->getChromaFormat());
+ predIntraChromaAng(patChromaU, mode, predU, stride, width, height,
chFmt);
+ predIntraChromaAng(patChromaV, mode, predV, stride, width, height,
chFmt);
+
//--- get SAD ---
uint32_t sad = sa8d(fencU, stride, predU, stride) + sa8d(fencV,
stride, predV, stride);
@@ -3304,8 +3328,9 @@
void TEncSearch::residualTransformQuantInter(TComDataCU* cu, uint32_t
absPartIdx, uint32_t absTUPartIdx, TShortYUV* resiYuv, const uint32_t depth,
bool curuseRDOQ)
{
assert(cu->getDepth(0) == cu->getDepth(absPartIdx));
- const uint32_t trMode = depth - cu->getDepth(0);
+ const uint32_t trMode = depth - cu->getDepth(0);
const uint32_t trSizeLog2 =
g_convertToBit[cu->getSlice()->getSPS()->getMaxCUWidth() >> depth] + 2;
+ int chFmt = cu->getChromaFormat();
bool bSplitFlag = ((cu->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter()
== 1) && cu->getPredictionMode(absPartIdx) == MODE_INTER &&
(cu->getPartitionSize(absPartIdx) != SIZE_2Nx2N));
bool bCheckFull;
@@ -3352,8 +3377,10 @@
cu->setTransformSkipSubParts(0, TEXT_CHROMA_U, absPartIdx,
cu->getDepth(0) + trModeC);
cu->setTransformSkipSubParts(0, TEXT_CHROMA_V, absPartIdx,
cu->getDepth(0) + trModeC);
}
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, cu->getChromaFormat());
+
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, chFmt);
m_trQuant->selectLambda(TEXT_LUMA);
+
absSumY = m_trQuant->transformNxN(cu,
resiYuv->getLumaAddr(absTUPartIdx), resiYuv->m_width, coeffCurY,
trWidth, trHeight, TEXT_LUMA,
absPartIdx, &lastPosY, false, curuseRDOQ);
@@ -3362,14 +3389,18 @@
if (bCodeChroma)
{
int curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCbQpOffset() +
cu->getSlice()->getSliceQpDeltaCb();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
m_trQuant->selectLambda(TEXT_CHROMA);
+
absSumU = m_trQuant->transformNxN(cu,
resiYuv->getCbAddr(absTUPartIdxC), resiYuv->m_cwidth, coeffCurU,
trWidthC, trHeightC,
TEXT_CHROMA_U, absPartIdx, &lastPosU, false, curuseRDOQ);
+
curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCrQpOffset() +
cu->getSlice()->getSliceQpDeltaCr();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
absSumV = m_trQuant->transformNxN(cu,
resiYuv->getCrAddr(absTUPartIdxC), resiYuv->m_cwidth, coeffCurV,
trWidthC, trHeightC,
TEXT_CHROMA_V, absPartIdx, &lastPosV, false, curuseRDOQ);
+
cu->setCbfSubParts(absSumU ? setCbf : 0, TEXT_CHROMA_U,
absPartIdx, cu->getDepth(0) + trModeC);
cu->setCbfSubParts(absSumV ? setCbf : 0, TEXT_CHROMA_V,
absPartIdx, cu->getDepth(0) + trModeC);
}
@@ -3377,7 +3408,9 @@
if (absSumY)
{
int16_t *curResiY = resiYuv->getLumaAddr(absTUPartIdx);
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, cu->getChromaFormat());
+
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_LUMA];
assert(scalingListType < 6);
m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx),
REG_DCT, curResiY, resiYuv->m_width, coeffCurY, trWidth, trHeight,
scalingListType, false, lastPosY); //this is for inter mode only
@@ -3394,8 +3427,10 @@
if (absSumU)
{
int16_t *pcResiCurrU = resiYuv->getCbAddr(absTUPartIdxC);
+
int curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCbQpOffset() +
cu->getSlice()->getSliceQpDeltaCb();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_CHROMA_U];
assert(scalingListType < 6);
m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), REG_DCT,
pcResiCurrU, resiYuv->m_cwidth, coeffCurU, trWidthC, trHeightC,
scalingListType, false, lastPosU);
@@ -3410,7 +3445,8 @@
{
int16_t *curResiV = resiYuv->getCrAddr(absTUPartIdxC);
int curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCrQpOffset() +
cu->getSlice()->getSliceQpDeltaCr();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_CHROMA_V];
assert(scalingListType < 6);
m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), REG_DCT,
curResiV, resiYuv->m_cwidth, coeffCurV, trWidthC, trHeightC, scalingListType,
false, lastPosV);
@@ -3482,9 +3518,11 @@
bool curuseRDOQ)
{
assert(cu->getDepth(0) == cu->getDepth(absPartIdx));
- const uint32_t trMode = depth - cu->getDepth(0);
+ const uint32_t trMode = depth - cu->getDepth(0);
const uint32_t trSizeLog2 =
g_convertToBit[cu->getSlice()->getSPS()->getMaxCUWidth() >> depth] + 2;
- uint32_t trSizeCLog2 =
g_convertToBit[(cu->getSlice()->getSPS()->getMaxCUWidth() >> m_hChromaShift) >>
depth] + 2;;
+ uint32_t trSizeCLog2 =
g_convertToBit[(cu->getSlice()->getSPS()->getMaxCUWidth() >> m_hChromaShift) >>
depth] + 2;;
+ int chFmt = cu->getChromaFormat();
+
bool bSplitFlag = ((cu->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter()
== 1) && cu->getPredictionMode(absPartIdx) == MODE_INTER &&
(cu->getPartitionSize(absPartIdx) != SIZE_2Nx2N));
bool bCheckFull;
if (bSplitFlag && depth == cu->getDepth(absPartIdx) && (trSizeLog2 >
cu->getQuadtreeTULog2MinSizeInCU(absPartIdx)))
@@ -3493,15 +3531,17 @@
bCheckFull = (trSizeLog2 <=
cu->getSlice()->getSPS()->getQuadtreeTULog2MaxSize());
const bool bCheckSplit = (trSizeLog2 >
cu->getQuadtreeTULog2MinSizeInCU(absPartIdx));
assert(bCheckFull || bCheckSplit);
+
bool bCodeChroma = true;
uint32_t trModeC = trMode;
- if ((trSizeLog2 == 2) && !(cu->getChromaFormat() == CHROMA_444))
+ if ((trSizeLog2 == 2) && !(chFmt == CHROMA_444))
{
trSizeCLog2++;
trModeC--;
uint32_t qpdiv = cu->getPic()->getNumPartInCU() >> ((depth - 1) << 1);
bCodeChroma = ((absPartIdx % qpdiv) == 0);
}
+
const uint32_t setCbf = 1 << trMode;
// code full block
uint64_t singleCost = MAX_INT64;
@@ -3520,6 +3560,7 @@
TCoeff *coeffCurY = m_qtTempCoeffY[qtlayer] +
(numCoeffPerAbsPartIdxIncrement * absPartIdx);
TCoeff *coeffCurU = m_qtTempCoeffCb[qtlayer] +
(numCoeffPerAbsPartIdxIncrement * absPartIdx >> (m_hChromaShift +
m_vChromaShift));
TCoeff *coeffCurV = m_qtTempCoeffCr[qtlayer] +
(numCoeffPerAbsPartIdxIncrement * absPartIdx >> (m_hChromaShift +
m_vChromaShift));
+
int trWidth = 0, trHeight = 0, trWidthC = 0, trHeightC = 0;
uint32_t absTUPartIdxC = absPartIdx;
@@ -3546,8 +3587,10 @@
{
m_entropyCoder->estimateBit(m_trQuant->m_estBitsSbac, trWidth,
trHeight, TEXT_LUMA);
}
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, cu->getChromaFormat());
+
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, chFmt);
m_trQuant->selectLambda(TEXT_LUMA);
+
absSumY = m_trQuant->transformNxN(cu,
resiYuv->getLumaAddr(absTUPartIdx), resiYuv->m_width, coeffCurY,
trWidth, trHeight, TEXT_LUMA,
absPartIdx, &lastPosY, false, curuseRDOQ);
@@ -3561,15 +3604,18 @@
}
//Cb transform
int curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCbQpOffset() +
cu->getSlice()->getSliceQpDeltaCb();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
m_trQuant->selectLambda(TEXT_CHROMA);
+
absSumU = m_trQuant->transformNxN(cu,
resiYuv->getCbAddr(absTUPartIdxC), resiYuv->m_cwidth, coeffCurU,
trWidthC, trHeightC,
TEXT_CHROMA_U, absPartIdx, &lastPosU, false, curuseRDOQ);
//Cr transform
curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCrQpOffset() +
cu->getSlice()->getSliceQpDeltaCr();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
absSumV = m_trQuant->transformNxN(cu,
resiYuv->getCrAddr(absTUPartIdxC), resiYuv->m_cwidth, coeffCurV,
trWidthC, trHeightC,
TEXT_CHROMA_V, absPartIdx, &lastPosV, false, curuseRDOQ);
+
cu->setCbfSubParts(absSumU ? setCbf : 0, TEXT_CHROMA_U,
absPartIdx, cu->getDepth(0) + trModeC);
cu->setCbfSubParts(absSumV ? setCbf : 0, TEXT_CHROMA_V,
absPartIdx, cu->getDepth(0) + trModeC);
}
@@ -3607,7 +3653,9 @@
if (absSumY)
{
int16_t *curResiY =
m_qtTempTComYuv[qtlayer].getLumaAddr(absTUPartIdx);
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, cu->getChromaFormat());
+
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_LUMA];
assert(scalingListType < 6);
assert(m_qtTempTComYuv[qtlayer].m_width == MAX_CU_SIZE);
@@ -3676,15 +3724,19 @@
if (absSumU)
{
int16_t *pcResiCurrU =
m_qtTempTComYuv[qtlayer].getCbAddr(absTUPartIdxC);
+
int curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCbQpOffset() +
cu->getSlice()->getSliceQpDeltaCb();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_CHROMA_U];
assert(scalingListType < 6);
m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), REG_DCT,
pcResiCurrU, m_qtTempTComYuv[qtlayer].m_cwidth, coeffCurU, trWidthC, trHeightC,
scalingListType, false, lastPosU);
+
uint32_t dist =
primitives.sse_ss[partSizeC](resiYuv->getCbAddr(absTUPartIdxC),
resiYuv->m_cwidth,
m_qtTempTComYuv[qtlayer].getCbAddr(absTUPartIdxC),
m_qtTempTComYuv[qtlayer].m_cwidth);
const uint32_t nonZeroDistU =
m_rdCost->scaleChromaDistCb(dist);
+
if (cu->isLosslessCoded(0))
{
distU = nonZeroDistU;
@@ -3726,9 +3778,11 @@
{
int16_t *ptr =
m_qtTempTComYuv[qtlayer].getCbAddr(absTUPartIdxC);
const uint32_t stride = m_qtTempTComYuv[qtlayer].m_cwidth;
+
assert(trWidthC == trHeightC);
primitives.blockfill_s[(int)g_convertToBit[trWidthC]](ptr,
stride, 0);
}
+
distV =
m_rdCost->scaleChromaDistCr(primitives.sse_sp[partSizeC](resiYuv->getCrAddr(absTUPartIdxC),
resiYuv->m_cwidth, m_tempPel, trWidthC));
if (outZeroDist)
{
@@ -3738,14 +3792,17 @@
{
int16_t *curResiV =
m_qtTempTComYuv[qtlayer].getCrAddr(absTUPartIdxC);
int curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCrQpOffset() +
cu->getSlice()->getSliceQpDeltaCr();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_CHROMA_V];
assert(scalingListType < 6);
m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), REG_DCT,
curResiV, m_qtTempTComYuv[qtlayer].m_cwidth, coeffCurV, trWidthC, trHeightC,
scalingListType, false, lastPosV);
+
uint32_t dist =
primitives.sse_ss[partSizeC](resiYuv->getCrAddr(absTUPartIdxC),
resiYuv->m_cwidth,
m_qtTempTComYuv[qtlayer].getCrAddr(absTUPartIdxC),
m_qtTempTComYuv[qtlayer].m_cwidth);
const uint32_t nonZeroDistV =
m_rdCost->scaleChromaDistCr(dist);
+
if (cu->isLosslessCoded(0))
{
distV = nonZeroDistV;
@@ -3787,6 +3844,7 @@
{
int16_t *ptr =
m_qtTempTComYuv[qtlayer].getCrAddr(absTUPartIdxC);
const uint32_t stride = m_qtTempTComYuv[qtlayer].m_cwidth;
+
assert(trWidthC == trHeightC);
primitives.blockfill_s[(int)g_convertToBit[trWidthC]](ptr,
stride, 0);
}
@@ -3824,7 +3882,9 @@
{
m_entropyCoder->estimateBit(m_trQuant->m_estBitsSbac, trWidth,
trHeight, TEXT_LUMA);
}
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, cu->getChromaFormat());
+
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, chFmt);
+
m_trQuant->selectLambda(TEXT_LUMA);
absSumTransformSkipY = m_trQuant->transformNxN(cu,
resiYuv->getLumaAddr(absTUPartIdx), resiYuv->m_width, coeffCurY,
trWidth, trHeight,
TEXT_LUMA, absPartIdx, &lastPosTransformSkipY, true, curuseRDOQ);
@@ -3836,7 +3896,9 @@
m_entropyCoder->encodeQtCbf(cu, absPartIdx, TEXT_LUMA, trMode);
m_entropyCoder->encodeCoeffNxN(cu, coeffCurY, absPartIdx,
trWidth, trHeight, depth, TEXT_LUMA);
const uint32_t skipSingleBitsY =
m_entropyCoder->getNumberOfWrittenBits();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, cu->getChromaFormat());
+
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_LUMA,
cu->getSlice()->getSPS()->getQpBDOffsetY(), 0, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_LUMA];
assert(scalingListType < 6);
assert(m_qtTempTComYuv[qtlayer].m_width == MAX_CU_SIZE);
@@ -3875,9 +3937,11 @@
int lastPosTransformSkipU = -1, lastPosTransformSkipV = -1;
uint64_t singleCostU = MAX_INT64;
uint64_t singleCostV = MAX_INT64;
+
int16_t *curResiU =
m_qtTempTComYuv[qtlayer].getCbAddr(absTUPartIdxC);
int16_t *curResiV =
m_qtTempTComYuv[qtlayer].getCrAddr(absTUPartIdxC);
uint32_t stride = m_qtTempTComYuv[qtlayer].m_cwidth;
+
TCoeff bestCoeffU[32 * 32], bestCoeffV[32 * 32];
memcpy(bestCoeffU, coeffCurU, sizeof(TCoeff) * numSamplesChroma);
memcpy(bestCoeffV, coeffCurV, sizeof(TCoeff) * numSamplesChroma);
@@ -3888,6 +3952,7 @@
memcpy(&bestResiU[i * trWidthC], curResiU + i * stride,
sizeof(int16_t) * trWidthC);
memcpy(&bestResiV[i * trWidthC], curResiV + i * stride,
sizeof(int16_t) * trWidthC);
}
+
m_rdGoOnSbacCoder->load(m_rdSbacCoders[depth][CI_QT_TRAFO_ROOT]);
cu->setTransformSkipSubParts(1, TEXT_CHROMA_U, absPartIdx,
cu->getDepth(0) + trModeC);
@@ -3897,15 +3962,18 @@
{
m_entropyCoder->estimateBit(m_trQuant->m_estBitsSbac,
trWidthC, trHeightC, TEXT_CHROMA);
}
+
int curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCbQpOffset() +
cu->getSlice()->getSliceQpDeltaCb();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
m_trQuant->selectLambda(TEXT_CHROMA);
+
absSumTransformSkipU = m_trQuant->transformNxN(cu,
resiYuv->getCbAddr(absTUPartIdxC), resiYuv->m_cwidth, coeffCurU,
trWidthC,
trHeightC, TEXT_CHROMA_U, absPartIdx, &lastPosTransformSkipU, true, curuseRDOQ);
curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCrQpOffset() +
cu->getSlice()->getSliceQpDeltaCr();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
absSumTransformSkipV = m_trQuant->transformNxN(cu,
resiYuv->getCrAddr(absTUPartIdxC), resiYuv->m_cwidth, coeffCurV,
trWidthC,
trHeightC, TEXT_CHROMA_V, absPartIdx, &lastPosTransformSkipV, true, curuseRDOQ);
+
cu->setCbfSubParts(absSumTransformSkipU ? setCbf : 0,
TEXT_CHROMA_U, absPartIdx, cu->getDepth(0) + trModeC);
cu->setCbfSubParts(absSumTransformSkipV ? setCbf : 0,
TEXT_CHROMA_V, absPartIdx, cu->getDepth(0) + trModeC);
@@ -3918,11 +3986,14 @@
m_entropyCoder->encodeQtCbf(cu, absPartIdx, TEXT_CHROMA_U,
trMode);
m_entropyCoder->encodeCoeffNxN(cu, coeffCurU, absPartIdx,
trWidthC, trHeightC, depth, TEXT_CHROMA_U);
singleBitsU = m_entropyCoder->getNumberOfWrittenBits();
+
curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCbQpOffset() +
cu->getSlice()->getSliceQpDeltaCb();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_CHROMA_U];
assert(scalingListType < 6);
m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), REG_DCT,
curResiU, m_qtTempTComYuv[qtlayer].m_cwidth, coeffCurU, trWidthC, trHeightC,
scalingListType, true, lastPosTransformSkipU);
+
uint32_t dist =
primitives.sse_ss[partSizeC](resiYuv->getCbAddr(absTUPartIdxC),
resiYuv->m_cwidth,
m_qtTempTComYuv[qtlayer].getCbAddr(absTUPartIdxC),
m_qtTempTComYuv[qtlayer].m_cwidth);
@@ -3952,11 +4023,14 @@
m_entropyCoder->encodeQtCbf(cu, absPartIdx, TEXT_CHROMA_V,
trMode);
m_entropyCoder->encodeCoeffNxN(cu, coeffCurV, absPartIdx,
trWidthC, trHeightC, depth, TEXT_CHROMA_V);
singleBitsV = m_entropyCoder->getNumberOfWrittenBits() -
singleBitsU;
+
curChromaQpOffset =
cu->getSlice()->getPPS()->getChromaCrQpOffset() +
cu->getSlice()->getSliceQpDeltaCr();
- m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset,
cu->getChromaFormat());
+ m_trQuant->setQPforQuant(cu->getQP(0), TEXT_CHROMA,
cu->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset, chFmt);
+
int scalingListType = 3 + g_eTTable[(int)TEXT_CHROMA_V];
assert(scalingListType < 6);
m_trQuant->invtransformNxN(cu->getCUTransquantBypass(absPartIdx), REG_DCT,
curResiV, m_qtTempTComYuv[qtlayer].m_cwidth, coeffCurV, trWidthC, trHeightC,
scalingListType, true, lastPosTransformSkipV);
+
uint32_t dist =
primitives.sse_ss[partSizeC](resiYuv->getCrAddr(absTUPartIdxC),
resiYuv->m_cwidth,
m_qtTempTComYuv[qtlayer].getCrAddr(absTUPartIdxC),
m_qtTempTComYuv[qtlayer].m_cwidth);
diff -r c95b1f7269df -r fd3dde2aa296 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp Fri Jan 10 14:57:18 2014 +0530
+++ b/source/encoder/frameencoder.cpp Fri Jan 10 20:06:39 2014 +0530
@@ -311,8 +311,9 @@
void FrameEncoder::setLambda(int qp, int row)
{
- TComSlice* slice = m_pic->getSlice();
- TComPicYuv *fenc = slice->getPic()->getPicYuvOrg();
+ TComSlice* slice = m_pic->getSlice();
+ TComPicYuv* fenc = slice->getPic()->getPicYuvOrg();
+ int chFmt = slice->getSPS()->getChromaFormatIdc();
double lambda = 0;
@@ -330,11 +331,13 @@
// instead we weight the distortion of chroma.
int chromaQPOffset = slice->getPPS()->getChromaCbQpOffset() +
slice->getSliceQpDeltaCb();
int qpc = Clip3(0, 70, qp + chromaQPOffset);
- double cbWeight = pow(2.0, (qp -
g_chromaScale[slice->getSPS()->getChromaFormatIdc()][qpc])); // takes into
account of the chroma qp mapping and chroma qp Offset
+ double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes
into account of the chroma qp mapping and chroma qp Offset
+
chromaQPOffset = slice->getPPS()->getChromaCrQpOffset() +
slice->getSliceQpDeltaCr();
qpc = Clip3(0, 70, qp + chromaQPOffset);
- double crWeight = pow(2.0, (qp -
g_chromaScale[slice->getSPS()->getChromaFormatIdc()][qpc])); // takes into
account of the chroma qp mapping and chroma qp Offset
+ double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes
into account of the chroma qp mapping and chroma qp Offset
double chromaLambda = lambda / crWeight;
+
m_rows[row].m_search.setQPLambda(qp, lambda, chromaLambda);
m_rows[row].m_search.m_me.setSourcePlane(fenc->getLumaAddr(),
fenc->getStride());
m_rows[row].m_rdCost.setLambda(lambda);
@@ -345,9 +348,11 @@
void FrameEncoder::compressFrame()
{
PPAScopeEvent(FrameEncoder_compressFrame);
- int64_t startCompressTime = x265_mdate();
- TEncEntropy* entropyCoder = getEntropyCoder(0);
- TComSlice* slice = m_pic->getSlice();
+ int64_t startCompressTime = x265_mdate();
+ TEncEntropy* entropyCoder = getEntropyCoder(0);
+ TComSlice* slice = m_pic->getSlice();
+ int chFmt = slice->getSPS()->getChromaFormatIdc();
+
m_nalCount = 0;
int qp = slice->getSliceQp();
@@ -367,11 +372,12 @@
int qpc;
int chromaQPOffset = slice->getPPS()->getChromaCbQpOffset() +
slice->getSliceQpDeltaCb();
qpc = Clip3(0, 70, qp + chromaQPOffset);
- double cbWeight = pow(2.0, (qp -
g_chromaScale[slice->getSPS()->getChromaFormatIdc()][qpc])); // takes into
account of the chroma qp mapping and chroma qp Offset
- chromaQPOffset = slice->getPPS()->getChromaCrQpOffset() +
slice->getSliceQpDeltaCr();
+ double cbWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes
into account of the chroma qp mapping and chroma qp Offset
+ chromaQPOffset = slice->getPPS()->getChromaCrQpOffset() +
slice->getSliceQpDeltaCr();
qpc = Clip3(0, 70, qp + chromaQPOffset);
- double crWeight = pow(2.0, (qp -
g_chromaScale[slice->getSPS()->getChromaFormatIdc()][qpc])); // takes into
account of the chroma qp mapping and chroma qp Offset
+ double crWeight = pow(2.0, (qp - g_chromaScale[chFmt][qpc])); // takes
into account of the chroma qp mapping and chroma qp Offset
double chromaLambda = lambda / crWeight;
+
// NOTE: set SAO lambda every Frame
m_frameFilter.m_sao.lumaLambda = lambda;
m_frameFilter.m_sao.chromaLambda = chromaLambda;
_______________________________________________
x265-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/x265-devel