diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index 4a969e2a1024cae1a923e3d78121aca5e7a3cbc9..59b714654e0bef6b4cdbbea36526a358ed517def 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -2543,32 +2543,31 @@ void EncCu::xCheckRDCostIBCModeMerge2Nx2N(CodingStructure *&tempCS, CodingStruct cu.qp = encTestMode.qp; cu.mmvdSkip = false; cu.geoFlag = false; - DistParam distParam; - const bool bUseHadamard = !cu.slice->getDisableSATDForRD(); + PredictionUnit &pu = tempCS->addPU(cu, partitioner.chType); // tempCS->addPU(cu); pu.mmvdMergeFlag = false; pu.regularMergeFlag = false; - Picture * refPic = pu.cu->slice->getPic(); - const CPelBuf refBuf = refPic->getRecoBuf(pu.blocks[COMPONENT_Y]); - const Pel * piRefSrch = refBuf.buf; + + const bool useHadamard = !cu.slice->getDisableSATDForRD(); + const Picture* refPic = pu.cu->slice->getPic(); + const CPelBuf refBuf = refPic->getRecoBuf(pu.blocks[COMPONENT_Y]); + + CPelBuf origLuma = tempCS->getOrgBuf().Y(); if (tempCS->slice->getLmcsEnabledFlag() && m_pcReshape->getCTUFlag()) { const CompArea &area = cu.blocks[COMPONENT_Y]; const CompArea tmpArea(COMPONENT_Y, area.chromaFormat, Position(0, 0), area.size()); PelBuf tmpLuma = m_tmpStorageCtu->getBuf(tmpArea); - tmpLuma.copyFrom(tempCS->getOrgBuf().Y()); + tmpLuma.copyFrom(origLuma); tmpLuma.rspSignal(m_pcReshape->getFwdLUT()); - m_pcRdCost->setDistParam(distParam, tmpLuma, refBuf, sps.getBitDepth(ChannelType::LUMA), COMPONENT_Y, - bUseHadamard); + origLuma = tmpLuma; } - else - { - m_pcRdCost->setDistParam(distParam, tempCS->getOrgBuf().Y(), refBuf, sps.getBitDepth(ChannelType::LUMA), - COMPONENT_Y, bUseHadamard); - } - ptrdiff_t refStride = refBuf.stride; - const UnitArea localUnitArea(tempCS->area.chromaFormat, - Area(0, 0, tempCS->area.Y().width, tempCS->area.Y().height)); + + DistParam distParam; + m_pcRdCost->setDistParam(distParam, origLuma, refBuf, sps.getBitDepth(ChannelType::LUMA), COMPONENT_Y, useHadamard); + + const UnitArea localUnitArea(tempCS->area.chromaFormat, Area(0, 0, tempCS->area.lwidth(), tempCS->area.lheight())); + for (int mergeCand = 0; mergeCand < mergeCtx.numValidMergeCand; mergeCand++) { mergeCtx.setMergeInfo(pu, mergeCand); // set bv info in merge mode @@ -2589,7 +2588,7 @@ void EncCu::xCheckRDCostIBCModeMerge2Nx2N(CodingStructure *&tempCS, CodingStruct } PU::spanMotionInfo(pu, mergeCtx); - distParam.cur.buf = piRefSrch + refStride * yPred + xPred; + distParam.cur.buf = refBuf.bufAt(xPred, yPred); const Distortion sad = distParam.distFunc(distParam); const int bitsCand = std::min<int>(mergeCand + 1, tempCS->sps->getMaxNumMergeCand() - 1);