diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index a1a29b8964b119c87b341075f9a9e0335c010945..9d1fd9298b9ace503734bfd14443dcb3290655b2 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -60,7 +60,7 @@ #define JVET_O0164_REMOVE_AMVP_SPATIAL_SCALING 1 // JVET-O0164/JVET-O0587: remove spatial AMVP candidate scaling - +#define JVET_O0162_IBC_MVP_FLAG 1 // JVET-O0162/O0331/O0480/O0574: IBC mvp flag conditioned on MaxNumMergeCand>1 #define JVET_O0055_INT_DMVR_DIS_BDOF 1 // integer-distance DMVR cost to disable BDOF and disable BDOF early termination diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp index ee1a993fca511cfdb8bedefd2721eb2aa5112734..8f37bb9f3e2caf58bf2c3b77f2bf288634e26e6b 100644 --- a/source/Lib/DecoderLib/CABACReader.cpp +++ b/source/Lib/DecoderLib/CABACReader.cpp @@ -1509,6 +1509,13 @@ void CABACReader::prediction_unit( PredictionUnit& pu, MergeCtx& mrgCtx ) pu.cu->affine = false; pu.refIdx[REF_PIC_LIST_0] = MAX_NUM_REF; mvd_coding(pu.mvd[REF_PIC_LIST_0]); +#if JVET_O0162_IBC_MVP_FLAG + if ( pu.cu->slice->getMaxNumMergeCand() == 1 ) + { + pu.mvpIdx[REF_PIC_LIST_0] = 0; + } + else +#endif mvp_flag(pu, REF_PIC_LIST_0); } else diff --git a/source/Lib/DecoderLib/DecCu.cpp b/source/Lib/DecoderLib/DecCu.cpp index 4fc913d9f2a842025af555be7ddd426bcbd78bc2..9be9b7a89f3478de733d53137643fde284470a90 100644 --- a/source/Lib/DecoderLib/DecCu.cpp +++ b/source/Lib/DecoderLib/DecCu.cpp @@ -773,6 +773,12 @@ void DecCu::xDeriveCUMV( CodingUnit &cu ) { mvd.changeIbcPrecAmvr2Internal(pu.cu->imv); } +#if JVET_O0162_IBC_MVP_FLAG + if ( pu.cu->slice->getMaxNumMergeCand() == 1 ) + { + CHECK( pu.mvpIdx[REF_PIC_LIST_0], "mvpIdx for IBC mode should be 0" ); + } +#endif pu.mv[REF_PIC_LIST_0] = amvpInfo.mvCand[pu.mvpIdx[REF_PIC_LIST_0]] + mvd; pu.mv[REF_PIC_LIST_0].mvCliptoStorageBitDepth(); } diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index 604d36461be3e626b3791babf447633eed3d5c85..7b5235216641aa5938d4c05048cd3f2aec31ecb9 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -1415,6 +1415,13 @@ void CABACWriter::prediction_unit( const PredictionUnit& pu ) Mv mvd = pu.mvd[REF_PIC_LIST_0]; mvd.changeIbcPrecInternal2Amvr(pu.cu->imv); mvd_coding(mvd, 0); // already changed to signaling precision +#if JVET_O0162_IBC_MVP_FLAG + if ( pu.cu->slice->getMaxNumMergeCand() == 1 ) + { + CHECK( pu.mvpIdx[REF_PIC_LIST_0], "mvpIdx for IBC mode should be 0" ); + } + else +#endif mvp_flag(pu, REF_PIC_LIST_0); } else diff --git a/source/Lib/EncoderLib/InterSearch.cpp b/source/Lib/EncoderLib/InterSearch.cpp index 5277f0eb7484f82575bd8cb711313590375439a2..4f876b9ac2a01a1099e4ad89e74a84d4c164497c 100644 --- a/source/Lib/EncoderLib/InterSearch.cpp +++ b/source/Lib/EncoderLib/InterSearch.cpp @@ -1431,6 +1431,14 @@ bool InterSearch::predIBCSearch(CodingUnit& cu, Partitioner& partitioner, const cMv.setZero(); Distortion cost = 0; +#if JVET_O0162_IBC_MVP_FLAG + if ( pu.cu->slice->getMaxNumMergeCand() == 1 ) + { + iBvpNum = 1; + cMvPred[1] = cMvPred[0]; + } +#endif + if (m_pcEncCfg->getIBCHashSearch()) { xxIBCHashSearch(pu, cMvPred, iBvpNum, cMv, bvpIdxBest, ibcHashMap);