diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 2cbfc9b408e8efac6c2221592d259e41be8a7cdf..3ea398eff4d43124c2211bcd2abe2c95bb305c69 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,8 @@ #include <assert.h> #include <cassert> +#define JVET_N0448_N0380 1 // When MaxNumMergeCand is 1, MMVD_BASE_MV_NUM is inferred to be 1. + #define JVET_N0054_JOINT_CHROMA 1 // Joint chroma residual coding mode #define JVET_N0317_ADD_ZERO_BV 1 diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp index 7abcc61204723be513c5bb97220aae26f56306e9..c8e0e84f3e3ce0e43a2b2ba94832a22aaae0def0 100644 --- a/source/Lib/CommonLib/UnitTools.cpp +++ b/source/Lib/CommonLib/UnitTools.cpp @@ -2077,7 +2077,7 @@ void PU::getInterMMVDMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx, break; } } - +#if !JVET_N0448_N0380 if (currBaseNum < MMVD_BASE_MV_NUM) { for (k = currBaseNum; k < MMVD_BASE_MV_NUM; k++) @@ -2089,6 +2089,7 @@ void PU::getInterMMVDMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx, mrgCtx.interDirNeighbours[k] = (mrgCtx.mmvdBaseMv[k][0].refIdx >= 0) + (mrgCtx.mmvdBaseMv[k][1].refIdx >= 0) * 2; } } +#endif } bool PU::getColocatedMVP(const PredictionUnit &pu, const RefPicList &eRefPicList, const Position &_pos, Mv& rcMv, const int &refIdx ) { diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp index 59fe2ac6c96006ccb28fcd2300e990e161550d72..e34c8c6a79e05ca8b62e5bc1a75181343feb1c74 100644 --- a/source/Lib/DecoderLib/CABACReader.cpp +++ b/source/Lib/DecoderLib/CABACReader.cpp @@ -1709,7 +1709,12 @@ void CABACReader::mmvd_merge_idx(PredictionUnit& pu) mvpIdx = (var + dir0)*(MMVD_MAX_REFINE_NUM*MMVD_BASE_MV_NUM); +#if JVET_N0448_N0380 + int numCand = int(pu.cs->slice->getMaxNumMergeCand()); + int numCandminus1_base = (numCand > 1) ? MMVD_BASE_MV_NUM - 1 : 0; +#else int numCandminus1_base = MMVD_BASE_MV_NUM - 1; +#endif var0 = 0; if (numCandminus1_base > 0) { diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index 9c69aac3626edf70fbc4f6820e86fcc54f8462ae..19c5a221c6b40224b98d44e5c576d1d84e9f1cc4 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -1662,7 +1662,12 @@ void CABACWriter::mmvd_merge_idx(const PredictionUnit& pu) var1 = (mvpIdx - (var0 * MMVD_MAX_REFINE_NUM)) / 4; var2 = mvpIdx - (var0 * MMVD_MAX_REFINE_NUM) - var1 * 4; +#if JVET_N0448_N0380 + int numCand = int(pu.cs->slice->getMaxNumMergeCand()); + int numCandminus1_base = (numCand > 1) ? MMVD_BASE_MV_NUM - 1 : 0; +#else int numCandminus1_base = MMVD_BASE_MV_NUM - 1; +#endif if (numCandminus1_base > 0) { if (var0 == 0) diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index 116b84f6f097b48a519ca0f4e77cd60b2ea41239..79ece425cb9b25405f49a10a1607fc48f7a70711 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -1977,7 +1977,11 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& #if !JVET_MMVD_OFF_MACRO cu.mmvdSkip = true; int tempNum = 0; +#if JVET_N0448_N0380 + tempNum = (mergeCtx.numValidMergeCand > 1) ? MMVD_ADD_NUM : MMVD_ADD_NUM >> 1; +#else tempNum = MMVD_ADD_NUM; +#endif for (uint32_t mergeCand = mergeCtx.numValidMergeCand; mergeCand < mergeCtx.numValidMergeCand + tempNum; mergeCand++) { const int mmvdMergeCand = mergeCand - mergeCtx.numValidMergeCand; @@ -2076,7 +2080,11 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& { if (bestIsMMVDSkip) { +#if JVET_N0448_N0380 + uiNumMrgSATDCand = mergeCtx.numValidMergeCand + ((mergeCtx.numValidMergeCand > 1) ? MMVD_ADD_NUM : MMVD_ADD_NUM >> 1); +#else uiNumMrgSATDCand = mergeCtx.numValidMergeCand + MMVD_ADD_NUM; +#endif } else {