[x265] fix rd=0,1
Satoshi Nakagawa
nakagawa424 at oki.com
Wed Oct 29 17:38:04 CET 2014
# HG changeset patch
# User Satoshi Nakagawa <nakagawa424 at oki.com>
# Date 1414600429 -32400
# Thu Oct 30 01:33:49 2014 +0900
# Branch stable
# Node ID 2a5e13c6ee9351095e9a7aade3c52e8b4092b7f8
# Parent da5ba239bf59a48d9b586c54bf2d0a5320043044
fix rd=0,1
diff -r da5ba239bf59 -r 2a5e13c6ee93 source/common/predict.cpp
--- a/source/common/predict.cpp Wed Oct 29 09:13:25 2014 +0530
+++ b/source/common/predict.cpp Thu Oct 30 01:33:49 2014 +0900
@@ -144,12 +144,17 @@
primitives.intra_pred[dirMode][sizeIdx](dst, stride, left, above, dirMode, 0);
}
-void Predict::prepMotionCompensation(const CUData& cu, const CUGeom& cuGeom, int partIdx)
+void Predict::initMotionCompensation(const CUData& cu, const CUGeom& cuGeom, int partIdx)
{
m_predSlice = cu.m_slice;
cu.getPartIndexAndSize(partIdx, m_puAbsPartIdx, m_puWidth, m_puHeight);
m_ctuAddr = cu.m_cuAddr;
m_cuAbsPartIdx = cuGeom.encodeIdx;
+}
+
+void Predict::prepMotionCompensation(const CUData& cu, const CUGeom& cuGeom, int partIdx)
+{
+ initMotionCompensation(cu, cuGeom, partIdx);
m_refIdx0 = cu.m_refIdx[0][m_puAbsPartIdx];
m_clippedMv[0] = cu.m_mv[0][m_puAbsPartIdx];
diff -r da5ba239bf59 -r 2a5e13c6ee93 source/common/predict.h
--- a/source/common/predict.h Wed Oct 29 09:13:25 2014 +0530
+++ b/source/common/predict.h Thu Oct 30 01:33:49 2014 +0900
@@ -117,6 +117,7 @@
public:
/* prepMotionCompensation needs to be called to prepare MC with CU-relevant data */
+ void initMotionCompensation(const CUData& cu, const CUGeom& cuGeom, int partIdx);
void prepMotionCompensation(const CUData& cu, const CUGeom& cuGeom, int partIdx);
void motionCompensation(Yuv& predYuv, bool bLuma, bool bChroma);
diff -r da5ba239bf59 -r 2a5e13c6ee93 source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp Wed Oct 29 09:13:25 2014 +0530
+++ b/source/encoder/analysis.cpp Thu Oct 30 01:33:49 2014 +0900
@@ -882,7 +882,7 @@
if (m_bTryLossless)
tryLossless(cuGeom);
- if (mightSplit && m_param->rdLevel > 1)
+ if (mightSplit)
addSplitFlagCost(*md.bestMode, cuGeom.depth);
}
@@ -934,7 +934,7 @@
if (mightNotSplit)
addSplitFlagCost(*splitPred, cuGeom.depth);
else if (m_param->rdLevel <= 1)
- splitPred->sa8dCost = m_rdCost.calcRdSADCost(splitPred->distortion, splitPred->totalBits);
+ splitPred->sa8dCost = m_rdCost.calcRdSADCost(splitPred->distortion, splitPred->sa8dBits);
else
updateModeCost(*splitPred);
@@ -1539,6 +1539,7 @@
intraMode.totalBits = bbits;
intraMode.distortion = bsad;
intraMode.sa8dCost = bcost;
+ intraMode.sa8dBits = bbits;
}
void Analysis::encodeIntraInInter(Mode& intraMode, const CUGeom& cuGeom)
@@ -1601,8 +1602,6 @@
uint32_t absPartIdx = cuGeom.encodeIdx;
int sizeIdx = cuGeom.log2CUSize - 2;
- /* at RD 0, the prediction pixels are accumulated into the top depth predYuv */
- Yuv& predYuv = m_modeDepth[0].bestMode->predYuv;
Yuv& fencYuv = m_modeDepth[0].fencYuv;
/* reuse the bestMode data structures at the current depth */
@@ -1615,18 +1614,13 @@
if (cu.m_predMode[0] == MODE_INTRA)
{
- uint32_t initTrDepth = cu.m_partSize[0] == SIZE_2Nx2N ? 0 : 1;
-
uint32_t tuDepthRange[2];
cu.getIntraTUQtDepthRange(tuDepthRange, 0);
+ uint32_t initTrDepth = cu.m_partSize[0] == SIZE_NxN;
residualTransformQuantIntra(*bestMode, cuGeom, initTrDepth, 0, tuDepthRange);
getBestIntraModeChroma(*bestMode, cuGeom);
residualQTIntraChroma(*bestMode, cuGeom, 0, 0);
-
- /* copy the reconstructed part to the recon pic for later intra
- * predictions */
- reconYuv.copyToPicYuv(*m_frame->m_reconPicYuv, cu.m_cuAddr, absPartIdx);
}
else
{
@@ -1636,16 +1630,22 @@
ShortYuv& resiYuv = m_rqt[cuGeom.depth].tmpResiYuv;
+ /* at RD 0, the prediction pixels are accumulated into the top depth predYuv */
+ Yuv& predYuv = m_modeDepth[0].bestMode->predYuv;
+ pixel* predY = predYuv.getLumaAddr(absPartIdx);
+ pixel* predU = predYuv.getCbAddr(absPartIdx);
+ pixel* predV = predYuv.getCrAddr(absPartIdx);
+
primitives.luma_sub_ps[sizeIdx](resiYuv.m_buf[0], resiYuv.m_size,
- fencYuv.getLumaAddr(absPartIdx), predYuv.getLumaAddr(absPartIdx),
+ fencYuv.getLumaAddr(absPartIdx), predY,
fencYuv.m_size, predYuv.m_size);
primitives.chroma[m_csp].sub_ps[sizeIdx](resiYuv.m_buf[1], resiYuv.m_csize,
- fencYuv.getCbAddr(absPartIdx), predYuv.getCbAddr(absPartIdx),
+ fencYuv.getCbAddr(absPartIdx), predU,
fencYuv.m_csize, predYuv.m_csize);
primitives.chroma[m_csp].sub_ps[sizeIdx](resiYuv.m_buf[2], resiYuv.m_csize,
- fencYuv.getCrAddr(absPartIdx), predYuv.getCrAddr(absPartIdx),
+ fencYuv.getCrAddr(absPartIdx), predV,
fencYuv.m_csize, predYuv.m_csize);
uint32_t tuDepthRange[2];
@@ -1655,23 +1655,36 @@
if (cu.m_mergeFlag[0] && cu.m_partSize[0] == SIZE_2Nx2N && !cu.getQtRootCbf(0))
cu.setSkipFlagSubParts(true);
- else if (cu.getQtRootCbf(0))
+
+ PicYuv& reconPicYuv = *m_frame->m_reconPicYuv;
+ if (cu.getQtRootCbf(0)) // TODO: split to each component
{
/* residualTransformQuantInter() wrote transformed residual back into
* resiYuv. Generate the recon pixels by adding it to the prediction */
primitives.luma_add_ps[sizeIdx](reconYuv.m_buf[0], reconYuv.m_size,
- predYuv.getLumaAddr(absPartIdx), resiYuv.m_buf[0], predYuv.m_size, resiYuv.m_size);
-
+ predY, resiYuv.m_buf[0], predYuv.m_size, resiYuv.m_size);
primitives.chroma[m_csp].add_ps[sizeIdx](reconYuv.m_buf[1], reconYuv.m_csize,
- predYuv.getCbAddr(absPartIdx), resiYuv.m_buf[1], predYuv.m_csize, resiYuv.m_csize);
+ predU, resiYuv.m_buf[1], predYuv.m_csize, resiYuv.m_csize);
primitives.chroma[m_csp].add_ps[sizeIdx](reconYuv.m_buf[2], reconYuv.m_csize,
- predYuv.getCrAddr(absPartIdx), resiYuv.m_buf[2], predYuv.m_csize, resiYuv.m_csize);
+ predV, resiYuv.m_buf[2], predYuv.m_csize, resiYuv.m_csize);
/* copy the reconstructed part to the recon pic for later intra
* predictions */
reconYuv.copyToPicYuv(*m_frame->m_reconPicYuv, cu.m_cuAddr, absPartIdx);
}
+ else
+ {
+ /* copy the prediction pixels to the recon pic for later intra
+ * predictions */
+
+ primitives.luma_copy_pp[sizeIdx](reconPicYuv.getLumaAddr(cu.m_cuAddr, absPartIdx), reconPicYuv.m_stride,
+ predY, predYuv.m_size);
+ primitives.chroma[m_csp].copy_pp[sizeIdx](reconPicYuv.getCbAddr(cu.m_cuAddr, absPartIdx), reconPicYuv.m_strideC,
+ predU, predYuv.m_csize);
+ primitives.chroma[m_csp].copy_pp[sizeIdx](reconPicYuv.getCrAddr(cu.m_cuAddr, absPartIdx), reconPicYuv.m_strideC,
+ predV, predYuv.m_csize);
+ }
}
checkDQP(cu, cuGeom);
diff -r da5ba239bf59 -r 2a5e13c6ee93 source/encoder/search.cpp
--- a/source/encoder/search.cpp Wed Oct 29 09:13:25 2014 +0530
+++ b/source/encoder/search.cpp Thu Oct 30 01:33:49 2014 +0900
@@ -643,7 +643,7 @@
initAdiPattern(cu, cuGeom, absPartIdx, trDepth, lumaPredMode);
predIntraLumaAng(lumaPredMode, pred, stride, log2TrSize);
- X265_CHECK(!cu.m_transformSkip[TEXT_LUMA][0], "unexpected tskip flag in residualTransformQuantIntra\n");
+ X265_CHECK(!cu.m_transformSkip[TEXT_LUMA][absPartIdx], "unexpected tskip flag in residualTransformQuantIntra\n");
cu.setTUDepthSubParts(trDepth, absPartIdx, fullDepth);
primitives.calcresidual[sizeIdx](fenc, pred, residual, stride);
@@ -1101,7 +1101,7 @@
pixel* fenc = const_cast<pixel*>(mode.fencYuv->getChromaAddr(chromaId, absPartIdxC));
pixel* pred = mode.predYuv.getChromaAddr(chromaId, absPartIdxC);
int16_t* residual = resiYuv.getChromaAddr(chromaId, absPartIdxC);
- pixel* recon = mode.reconYuv.getChromaAddr(chromaId, absPartIdxC);
+ pixel* recon = mode.reconYuv.getChromaAddr(chromaId, absPartIdxC); // TODO: needed?
uint32_t coeffOffsetC = absPartIdxC << (LOG2_UNIT_SIZE * 2 - (m_hChromaShift + m_vChromaShift));
coeff_t* coeff = cu.m_trCoeff[ttype] + coeffOffsetC;
pixel* picReconC = m_frame->m_reconPicYuv->getChromaAddr(chromaId, cu.m_cuAddr, cuGeom.encodeIdx + absPartIdxC);
@@ -1728,7 +1728,7 @@
for (int puIdx = 0; puIdx < numPart; puIdx++)
{
/* sets m_puAbsPartIdx, m_puWidth, m_puHeight */
- prepMotionCompensation(cu, cuGeom, puIdx);
+ initMotionCompensation(cu, cuGeom, puIdx);
pixel* pu = fencPic->getLumaAddr(cu.m_cuAddr, cuGeom.encodeIdx + m_puAbsPartIdx);
m_me.setSourcePU(pu - fencPic->m_picOrg[0], m_puWidth, m_puHeight);
@@ -2327,6 +2327,7 @@
residualTransformQuantIntra(mode, cuGeom, initTrDepth, 0, tuDepthRange);
getBestIntraModeChroma(mode, cuGeom);
residualQTIntraChroma(mode, cuGeom, 0, 0);
+ mode.reconYuv.copyFromPicYuv(*m_frame->m_reconPicYuv, cu.m_cuAddr, cuGeom.encodeIdx); // TODO:
}
}
More information about the x265-devel
mailing list