diff --git a/source/Lib/CommonLib/InterPrediction.cpp b/source/Lib/CommonLib/InterPrediction.cpp index b911faf9410ac493aab564cb2981258c2130ad04..aefe92a7e65b202245c6503c2a27d2e037a42620 100644 --- a/source/Lib/CommonLib/InterPrediction.cpp +++ b/source/Lib/CommonLib/InterPrediction.cpp @@ -330,7 +330,11 @@ void InterPrediction::xSubPuMC( PredictionUnit& pu, PelUnitBuf& predBuf, const R pu.cu->affine = isAffine; } +#if JVET_O0108_DIS_DMVR_BDOF_CIIP +void InterPrediction::xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList /*= REF_PIC_LIST_X*/, PelUnitBuf* yuvDstTmp /*= NULL*/) +#else void InterPrediction::xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList /*= REF_PIC_LIST_X*/) +#endif { // compute the location of the current PU Position puPos = pu.lumaPos(); @@ -344,6 +348,9 @@ void InterPrediction::xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const R subPu.mmvdMergeFlag = pu.mmvdMergeFlag; subPu.mmvdEncOptMode = pu.mmvdEncOptMode; subPu.mergeFlag = pu.mergeFlag; +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + subPu.mhIntraFlag = pu.mhIntraFlag; +#endif subPu.mvRefine = pu.mvRefine; subPu.refIdx[0] = pu.refIdx[0]; subPu.refIdx[1] = pu.refIdx[1]; @@ -368,6 +375,14 @@ void InterPrediction::xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const R subPu = curMi; PelUnitBuf subPredBuf = predBuf.subBuf(UnitAreaRelative(pu, subPu)); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvDstTmp) + { + PelUnitBuf subPredBufTmp = yuvDstTmp->subBuf(UnitAreaRelative(pu, subPu)); + motionCompensation(subPu, subPredBuf, eRefPicList, true, true, &subPredBufTmp); + } + else +#endif motionCompensation(subPu, subPredBuf, eRefPicList); } } @@ -463,7 +478,11 @@ void InterPrediction::xPredInterUni(const PredictionUnit& pu, const RefPicList& } } +#if JVET_O0108_DIS_DMVR_BDOF_CIIP +void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred, PelUnitBuf* yuvPredTmp /*= NULL*/) +#else void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred) +#endif { const PPS &pps = *pu.cs->pps; const Slice &slice = *pu.cs->slice; @@ -496,6 +515,11 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred) } } +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (bioApplied && pu.mhIntraFlag) + bioApplied = false; +#endif + if (bioApplied && pu.cu->smvdMode) { bioApplied = false; @@ -532,7 +556,15 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred) if (pu.refIdx[0] >= 0 && pu.refIdx[1] >= 0) { if (dmvrApplied) +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + { + if (yuvPredTmp) + xPredInterUni(pu, eRefPicList, pcMbBuf, true, false, true, true); + continue; + } +#else continue; // mc will happen in processDMVR +#endif xPredInterUni ( pu, eRefPicList, pcMbBuf, true , bioApplied , true, true @@ -565,20 +597,38 @@ void InterPrediction::xPredInterBi(PredictionUnit& pu, PelUnitBuf &pcYuvPred) if( (!dmvrApplied) && (!bioApplied) && pps.getWPBiPred() && slice.getSliceType() == B_SLICE && pu.cu->GBiIdx==GBI_DEFAULT) { xWeightedPredictionBi( pu, srcPred0, srcPred1, pcYuvPred, m_maxCompIDToPred ); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvPredTmp) + yuvPredTmp->copyFrom(pcYuvPred); +#endif } else if( pps.getUseWP() && slice.getSliceType() == P_SLICE ) { xWeightedPredictionUni( pu, srcPred0, REF_PIC_LIST_0, pcYuvPred, -1, m_maxCompIDToPred ); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvPredTmp) + yuvPredTmp->copyFrom(pcYuvPred); +#endif } else { if (dmvrApplied) { +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvPredTmp) + { + yuvPredTmp->addAvg(srcPred0, srcPred1, slice.clpRngs(), false); + } +#endif xProcessDMVR(pu, pcYuvPred, slice.clpRngs(), bioApplied); } else { +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + xWeightedAverage( pu, srcPred0, srcPred1, pcYuvPred, slice.getSPS()->getBitDepths(), slice.clpRngs(), bioApplied, yuvPredTmp); +#else xWeightedAverage( pu, srcPred0, srcPred1, pcYuvPred, slice.getSPS()->getBitDepths(), slice.clpRngs(), bioApplied ); +#endif } } } @@ -1117,7 +1167,11 @@ void InterPrediction::xCalcBlkGradient(int sx, int sy, int *arraysGx2, int g_pelBufOP.calcBlkGradient(sx, sy, arraysGx2, arraysGxGy, arraysGxdI, arraysGy2, arraysGydI, sGx2, sGy2, sGxGy, sGxdI, sGydI, width, height, unitSize); } +#if JVET_O0108_DIS_DMVR_BDOF_CIIP +void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied, PelUnitBuf* yuvDstTmp /*= NULL*/) +#else void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied ) +#endif { const int iRefIdx0 = pu.refIdx[0]; const int iRefIdx1 = pu.refIdx[1]; @@ -1128,6 +1182,10 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB { CHECK(bioApplied, "GBi is disallowed with BIO"); pcYuvDst.addWeightedAvg(pcYuvSrc0, pcYuvSrc1, clpRngs, pu.cu->GBiIdx); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvDstTmp) + yuvDstTmp->copyFrom(pcYuvDst); +#endif return; } if (bioApplied) @@ -1145,10 +1203,18 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB if (bioEnabled) { applyBiOptFlow(pu, pcYuvSrc0, pcYuvSrc1, iRefIdx0, iRefIdx1, pcYuvDst, clipBitDepths); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvDstTmp) + yuvDstTmp->bufs[0].addAvg(CPelBuf(pSrcY0, src0Stride, pu.lumaSize()), CPelBuf(pSrcY1, src1Stride, pu.lumaSize()), clpRngs.comp[0]); +#endif } else { pcYuvDst.bufs[0].addAvg(CPelBuf(pSrcY0, src0Stride, pu.lumaSize()), CPelBuf(pSrcY1, src1Stride, pu.lumaSize()), clpRngs.comp[0]); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvDstTmp) + yuvDstTmp->bufs[0].copyFrom(pcYuvDst.bufs[0]); +#endif } } if (pu.cs->pps->getWPBiPred()) @@ -1169,6 +1235,18 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB { pcYuvDst.addAvg(pcYuvSrc0, pcYuvSrc1, clpRngs, bioApplied); } +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvDstTmp) + { + if (bioApplied) + { + yuvDstTmp->bufs[1].copyFrom(pcYuvDst.bufs[1]); + yuvDstTmp->bufs[2].copyFrom(pcYuvDst.bufs[2]); + } + else + yuvDstTmp->copyFrom(pcYuvDst); + } +#endif } else if( iRefIdx0 >= 0 && iRefIdx1 < 0 ) { @@ -1178,6 +1256,10 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB } else pcYuvDst.copyClip( pcYuvSrc0, clpRngs ); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvDstTmp) + yuvDstTmp->copyFrom(pcYuvDst); +#endif } else if( iRefIdx0 < 0 && iRefIdx1 >= 0 ) { @@ -1187,13 +1269,24 @@ void InterPrediction::xWeightedAverage(const PredictionUnit& pu, const CPelUnitB } else pcYuvDst.copyClip( pcYuvSrc1, clpRngs ); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (yuvDstTmp) + yuvDstTmp->copyFrom(pcYuvDst); +#endif } } void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBuf, const RefPicList &eRefPicList , const bool luma, const bool chroma +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + , PelUnitBuf* predBufWOBIO /*= NULL*/ +#endif ) { +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + CHECK(predBufWOBIO && pu.mhIntraFlag, "the case should not happen!"); +#endif + // dual tree handling for IBC as the only ref if ((!luma || !chroma) && eRefPicList == REF_PIC_LIST_0) { @@ -1217,6 +1310,9 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu if( eRefPicList != REF_PIC_LIST_X ) { +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + CHECK(predBufWOBIO != NULL, "the case should not happen!"); +#endif if( ( ( sliceType == P_SLICE && pps.getUseWP() ) || ( sliceType == B_SLICE && pps.getWPBiPred() ) ) ) { xPredInterUni ( pu, eRefPicList, predBuf, true @@ -1266,6 +1362,13 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu } } +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (bioApplied && pu.mhIntraFlag) + { + bioApplied = false; + } +#endif + if (bioApplied && pu.cu->smvdMode) { bioApplied = false; @@ -1283,11 +1386,18 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu dmvrApplied = (pu.mvRefine) && PU::checkDMVRCondition(pu); if ((pu.lumaSize().width > MAX_BDOF_APPLICATION_REGION || pu.lumaSize().height > MAX_BDOF_APPLICATION_REGION) && pu.mergeType != MRG_TYPE_SUBPU_ATMVP && (bioApplied && !dmvrApplied)) { +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + xSubPuBio(pu, predBuf, eRefPicList, predBufWOBIO); +#else xSubPuBio(pu, predBuf, eRefPicList); +#endif } else if (pu.mergeType != MRG_TYPE_DEFAULT_N && pu.mergeType != MRG_TYPE_IBC) { +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + CHECK(predBufWOBIO != NULL, "the case should not happen!"); +#endif xSubPuMC( pu, predBuf, eRefPicList ); } else if( xCheckIdenticalMotion( pu ) ) @@ -1296,10 +1406,18 @@ void InterPrediction::motionCompensation( PredictionUnit &pu, PelUnitBuf &predBu , false , true, true ); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + if (predBufWOBIO) + predBufWOBIO->copyFrom(predBuf); +#endif } else { +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + xPredInterBi(pu, predBuf, predBufWOBIO); +#else xPredInterBi( pu, predBuf ); +#endif } } return; diff --git a/source/Lib/CommonLib/InterPrediction.h b/source/Lib/CommonLib/InterPrediction.h index bf30d6e3f7195c0007f93a33b638bd9723226815..3f22258b7012b6067cde1325de6c7bf922d38e11 100644 --- a/source/Lib/CommonLib/InterPrediction.h +++ b/source/Lib/CommonLib/InterPrediction.h @@ -121,7 +121,11 @@ protected: , const bool& bioApplied , const bool luma, const bool chroma ); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + void xPredInterBi ( PredictionUnit& pu, PelUnitBuf &pcYuvPred, PelUnitBuf* yuvPredTmp = NULL ); +#else void xPredInterBi ( PredictionUnit& pu, PelUnitBuf &pcYuvPred ); +#endif void xPredInterBlk ( const ComponentID& compID, const PredictionUnit& pu, const Picture* refPic, const Mv& _mv, PelUnitBuf& dstPic, const bool& bi, const ClpRng& clpRng , const bool& bioApplied , bool isIBC @@ -136,7 +140,11 @@ protected: void xBioGradFilter (Pel* pSrc, int srcStride, int width, int height, int gradStride, Pel* gradX, Pel* gradY, int bitDepth); void xCalcBIOPar (const Pel* srcY0Temp, const Pel* srcY1Temp, const Pel* gradX0, const Pel* gradX1, const Pel* gradY0, const Pel* gradY1, int* dotProductTemp1, int* dotProductTemp2, int* dotProductTemp3, int* dotProductTemp5, int* dotProductTemp6, const int src0Stride, const int src1Stride, const int gradStride, const int widthG, const int heightG, int bitDepth); void xCalcBlkGradient (int sx, int sy, int *arraysGx2, int *arraysGxGy, int *arraysGxdI, int *arraysGy2, int *arraysGydI, int &sGx2, int &sGy2, int &sGxGy, int &sGxdI, int &sGydI, int width, int height, int unitSize); - void xWeightedAverage ( const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied ); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + void xWeightedAverage ( const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied, PelUnitBuf* yuvDstTmp = NULL ); +#else + void xWeightedAverage ( const PredictionUnit& pu, const CPelUnitBuf& pcYuvSrc0, const CPelUnitBuf& pcYuvSrc1, PelUnitBuf& pcYuvDst, const BitDepths& clipBitDepths, const ClpRngs& clpRngs, const bool& bioApplied ); +#endif void xPredAffineBlk( const ComponentID& compID, const PredictionUnit& pu, const Picture* refPic, const Mv* _mv, PelUnitBuf& dstPic, const bool& bi, const ClpRng& clpRng ); void xWeightedTriangleBlk ( const PredictionUnit &pu, const uint32_t width, const uint32_t height, const ComponentID compIdx, const bool splitDir, PelUnitBuf& predDst, PelUnitBuf& predSrc0, PelUnitBuf& predSrc1 ); @@ -144,7 +152,11 @@ protected: static bool xCheckIdenticalMotion( const PredictionUnit& pu ); void xSubPuMC(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + void xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X, PelUnitBuf* yuvDstTmp = NULL); +#else void xSubPuBio(PredictionUnit& pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X); +#endif void destroy(); @@ -162,6 +174,9 @@ public: // inter void motionCompensation (PredictionUnit &pu, PelUnitBuf& predBuf, const RefPicList &eRefPicList = REF_PIC_LIST_X , const bool luma = true, const bool chroma = true +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + , PelUnitBuf* predBufWOBIO = NULL +#endif ); void motionCompensation (PredictionUnit &pu, const RefPicList &eRefPicList = REF_PIC_LIST_X , const bool luma = true, const bool chroma = true diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 20b82d923439f451507eac6ce8835edfedf5ac55..4339638ffe63ba4a4d36249ee2e5288e621f50ae 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -116,6 +116,8 @@ #define JVET_O0592_ENC_ME_IMP 1 // JVET-O0592 encoder ME improvement +#define JVET_O0108_DIS_DMVR_BDOF_CIIP 1 // JVET_O0108 CE9-2.2: disable DMVR and BDOF for CIIP + #define FIX_DB_MAX_TRANSFORM_SIZE 1 #define MRG_SHARELIST_SHARSIZE 32 diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp index 58c3b2f15922b56125427f33751cb3a9dbf8452d..9b7b08be43a07b6128b95c762f77b2d55c7b3a81 100644 --- a/source/Lib/CommonLib/UnitTools.cpp +++ b/source/Lib/CommonLib/UnitTools.cpp @@ -1607,6 +1607,9 @@ bool PU::checkDMVRCondition(const PredictionUnit& pu) { return pu.mergeFlag && pu.mergeType == MRG_TYPE_DEFAULT_N +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + && !pu.mhIntraFlag +#endif && !pu.cu->affine && !pu.mmvdMergeFlag && !pu.cu->mmvdSkip diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index 167cc79355c8bc1a27cf313a4b8420a74395fdba..32e624a85187a894b6e8d1fa3c14547d32ea43ca 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -130,6 +130,9 @@ void EncCu::create( EncCfg* encCfg ) for (unsigned ui = 0; ui < MRG_MAX_NUM_CANDS; ui++) { m_acRealMergeBuffer[ui].create(chromaFormat, Area(0, 0, uiMaxWidth, uiMaxHeight)); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + m_acMergeTmpBuffer[ui].create(chromaFormat, Area(0, 0, uiMaxWidth, uiMaxHeight)); +#endif } const unsigned maxNumTriangleCand = encCfg->getMaxNumTriangleCand(); for (unsigned i = 0; i < maxNumTriangleCand; i++) @@ -218,6 +221,9 @@ void EncCu::destroy() for (unsigned ui = 0; ui < MRG_MAX_NUM_CANDS; ui++) { m_acRealMergeBuffer[ui].destroy(); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + m_acMergeTmpBuffer[ui].destroy(); +#endif } for( unsigned ui = 0; ui < TRIANGLE_MAX_NUM_CANDS; ui++ ) { @@ -1881,6 +1887,9 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& bool bestIsSkip = false; bool bestIsMMVDSkip = true; PelUnitBuf acMergeBuffer[MRG_MAX_NUM_CANDS]; +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + PelUnitBuf acMergeTmpBuffer[MRG_MAX_NUM_CANDS]; +#endif PelUnitBuf acMergeRealBuffer[MMVD_MRG_MAX_RD_BUF_NUM]; PelUnitBuf * acMergeTempBuffer[MMVD_MRG_MAX_RD_NUM]; PelUnitBuf * singleMergeTempBuffer; @@ -2002,7 +2011,12 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& PU::spanMotionInfo( pu, mergeCtx ); pu.mvRefine = true; distParam.cur = singleMergeTempBuffer->Y(); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + acMergeTmpBuffer[uiMergeCand] = m_acMergeTmpBuffer[uiMergeCand].getBuf(localUnitArea); + m_pcInterSearch->motionCompensation(pu, *singleMergeTempBuffer, REF_PIC_LIST_X, true, true, &(acMergeTmpBuffer[uiMergeCand])); +#else m_pcInterSearch->motionCompensation(pu, *singleMergeTempBuffer); +#endif acMergeBuffer[uiMergeCand] = m_acRealMergeBuffer[uiMergeCand].getBuf(localUnitArea); acMergeBuffer[uiMergeCand].copyFrom(*singleMergeTempBuffer); pu.mvRefine = false; @@ -2066,7 +2080,11 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& for (uint32_t mergeCnt = 0; mergeCnt < std::min(std::min(NUM_MRG_SATD_CAND, (const int)mergeCtx.numValidMergeCand), 4); mergeCnt++) { uint32_t mergeCand = MHIntraMergeCand[mergeCnt]; +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + acMergeTmpBuffer[mergeCand] = m_acMergeTmpBuffer[mergeCand].getBuf(localUnitArea); +#else acMergeBuffer[mergeCand] = m_acRealMergeBuffer[mergeCand].getBuf(localUnitArea); +#endif // estimate merge bits mergeCtx.setMergeInfo(pu, mergeCand); @@ -2081,7 +2099,11 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& m_pcIntraSearch->predIntraAng(COMPONENT_Y, pu.cs->getPredBuf(pu).Y(), pu); m_pcIntraSearch->switchBuffer(pu, COMPONENT_Y, pu.cs->getPredBuf(pu).Y(), m_pcIntraSearch->getPredictorPtr2(COMPONENT_Y, intraCnt)); } +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + pu.cs->getPredBuf(pu).copyFrom(acMergeTmpBuffer[mergeCand]); +#else pu.cs->getPredBuf(pu).copyFrom(acMergeBuffer[mergeCand]); +#endif if (pu.cs->slice->getLmcsEnabledFlag() && m_pcReshape->getCTUFlag()) { pu.cs->getPredBuf(pu).Y().rspSignal(m_pcReshape->getFwdLUT()); @@ -2304,17 +2326,29 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& { uint32_t bufIdx = 0; PelBuf tmpBuf = tempCS->getPredBuf(pu).Y(); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + tmpBuf.copyFrom(acMergeTmpBuffer[uiMergeCand].Y()); +#else tmpBuf.copyFrom(acMergeBuffer[uiMergeCand].Y()); +#endif if (pu.cs->slice->getLmcsEnabledFlag() && m_pcReshape->getCTUFlag()) { tmpBuf.rspSignal(m_pcReshape->getFwdLUT()); } m_pcIntraSearch->geneWeightedPred(COMPONENT_Y, tmpBuf, pu, m_pcIntraSearch->getPredictorPtr2(COMPONENT_Y, bufIdx)); tmpBuf = tempCS->getPredBuf(pu).Cb(); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + tmpBuf.copyFrom(acMergeTmpBuffer[uiMergeCand].Cb()); +#else tmpBuf.copyFrom(acMergeBuffer[uiMergeCand].Cb()); +#endif m_pcIntraSearch->geneWeightedPred(COMPONENT_Cb, tmpBuf, pu, m_pcIntraSearch->getPredictorPtr2(COMPONENT_Cb, bufIdx)); tmpBuf = tempCS->getPredBuf(pu).Cr(); +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + tmpBuf.copyFrom(acMergeTmpBuffer[uiMergeCand].Cr()); +#else tmpBuf.copyFrom(acMergeBuffer[uiMergeCand].Cr()); +#endif m_pcIntraSearch->geneWeightedPred(COMPONENT_Cr, tmpBuf, pu, m_pcIntraSearch->getPredictorPtr2(COMPONENT_Cr, bufIdx)); } else diff --git a/source/Lib/EncoderLib/EncCu.h b/source/Lib/EncoderLib/EncCu.h index 8cf343cd68f30dd9a6ddcbaf369441e28a4b5aa0..67ef7f05fe518c8696cd083004a1919fccc4e2c9 100644 --- a/source/Lib/EncoderLib/EncCu.h +++ b/source/Lib/EncoderLib/EncCu.h @@ -123,6 +123,9 @@ private: PelStorage m_acMergeBuffer[MMVD_MRG_MAX_RD_BUF_NUM]; PelStorage m_acRealMergeBuffer[MRG_MAX_NUM_CANDS]; +#if JVET_O0108_DIS_DMVR_BDOF_CIIP + PelStorage m_acMergeTmpBuffer[MRG_MAX_NUM_CANDS]; +#endif PelStorage m_acTriangleWeightedBuffer[TRIANGLE_MAX_NUM_CANDS]; // to store weighted prediction pixles double m_mergeBestSATDCost; MotionInfo m_SubPuMiBuf [( MAX_CU_SIZE * MAX_CU_SIZE ) >> ( MIN_CU_LOG2 << 1 )];