diff --git a/cfg/encoder_lowdelay_P_vtm.cfg b/cfg/encoder_lowdelay_P_vtm.cfg index 6d345e4c713025c432e061cee682f32d7c7eb320..ead2028cf56597169019ba52ccd9f701bd798d6a 100644 --- a/cfg/encoder_lowdelay_P_vtm.cfg +++ b/cfg/encoder_lowdelay_P_vtm.cfg @@ -134,8 +134,9 @@ AMaxBT : 1 # Encoder optimization tools AffineAmvrEncOpt : 0 - +MmvdDisNum : 6 ### DO NOT ADD ANYTHING BELOW THIS LINE ### ### DO NOT DELETE THE EMPTY LINE BELOW ### + diff --git a/cfg/encoder_lowdelay_vtm.cfg b/cfg/encoder_lowdelay_vtm.cfg index 07233c18980035d3eb60cdb6a464c17e2b115899..71db8a36cea81aab0b2a05236d942766f31fc7b7 100644 --- a/cfg/encoder_lowdelay_vtm.cfg +++ b/cfg/encoder_lowdelay_vtm.cfg @@ -137,8 +137,9 @@ AMaxBT : 1 # Encoder optimization tools AffineAmvrEncOpt : 0 - +MmvdDisNum : 6 ### DO NOT ADD ANYTHING BELOW THIS LINE ### ### DO NOT DELETE THE EMPTY LINE BELOW ### + diff --git a/cfg/encoder_randomaccess_vtm.cfg b/cfg/encoder_randomaccess_vtm.cfg index 389209a4cec35122dd6b916c5d4e515afc526c32..948f0055c26f9086c0f61c9509ff35b8616ef9a8 100644 --- a/cfg/encoder_randomaccess_vtm.cfg +++ b/cfg/encoder_randomaccess_vtm.cfg @@ -153,8 +153,9 @@ AMaxBT : 1 # Encoder optimization tools AffineAmvrEncOpt : 1 - +MmvdDisNum : 6 ### DO NOT ADD ANYTHING BELOW THIS LINE ### ### DO NOT DELETE THE EMPTY LINE BELOW ### + diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 9cdd07a6932cce8b0cf2446c00f5b7d20293a51a..62616945600f2e73eadaec05e35f41a087901d54 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -279,6 +279,9 @@ void EncApp::xInitLibCfg() m_cEncLib.setUseAffineAmvr ( m_AffineAmvr ); m_cEncLib.setUseAffineAmvrEncOpt ( m_AffineAmvrEncOpt ); m_cEncLib.setDMVR ( m_DMVR ); +#if JVET_N0449_MMVD_SIMP + m_cEncLib.setMmvdDisNum (m_MmvdDisNum); +#endif m_cEncLib.setIBCMode ( m_IBCMode ); m_cEncLib.setIBCLocalSearchRangeX ( m_IBCLocalSearchRangeX ); m_cEncLib.setIBCLocalSearchRangeY ( m_IBCLocalSearchRangeY ); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 5187ea2455060610392853c5a2459c437a1eebe3..89aaccaa7794190f47b0459aa1a4b01a84c8d29f 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -874,6 +874,9 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("AffineAmvr", m_AffineAmvr, false, "Eanble AMVR for affine inter mode") ("AffineAmvrEncOpt", m_AffineAmvrEncOpt, false, "Enable encoder optimization of affine AMVR") ("DMVR", m_DMVR, false, "Decoder-side Motion Vector Refinement") +#if JVET_N0449_MMVD_SIMP + ("MmvdDisNum", m_MmvdDisNum, 8, "Number of MMVD Distance Entries") +#endif ( "IBC", m_IBCMode, 0u, "IBCMode (0x1:enabled, 0x0:disabled) [default: disabled]") ( "IBCLocalSearchRangeX", m_IBCLocalSearchRangeX, 128u, "Search range of IBC local search in x direction") ( "IBCLocalSearchRangeY", m_IBCLocalSearchRangeY, 128u, "Search range of IBC local search in y direction") @@ -1973,6 +1976,9 @@ bool EncAppCfg::xCheckParameter() xConfirmPara( m_GBiFast, "GBiFast is only allowed with NEXT profile" ); xConfirmPara( m_Triangle, "Triangle is only allowed with NEXT profile" ); xConfirmPara(m_DMVR, "DMVR only allowed with NEXT profile"); +#if JVET_N0449_MMVD_SIMP + xConfirmPara(m_MmvdDisNum, "Number of distance MMVD entry setting only allowed with NEXT profile"); +#endif // ADD_NEW_TOOL : (parameter check) add a check for next tools here } else @@ -3159,6 +3165,9 @@ void EncAppCfg::xPrintParameter() m_AffineAmvrEncOpt = m_AffineAmvr ? m_AffineAmvrEncOpt : false; msg( VERBOSE, "AffineAmvrEncOpt:%d ", m_AffineAmvrEncOpt ); msg(VERBOSE, "DMVR:%d ", m_DMVR); +#if JVET_N0449_MMVD_SIMP + msg(VERBOSE, "MmvdDisNum:%d ", m_MmvdDisNum); +#endif } msg(VERBOSE, "IBC:%d ", m_IBCMode); msg( VERBOSE, "HashME:%d ", m_HashME ); diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 1debceb530f63da624cf1cbce902bb79306ef40b..94a7e46c56878dfd62e97f618658ff1762202411 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -260,7 +260,9 @@ protected: bool m_AffineAmvr; bool m_AffineAmvrEncOpt; bool m_DMVR; - +#if JVET_N0449_MMVD_SIMP + int m_MmvdDisNum; +#endif unsigned m_IBCMode; unsigned m_IBCLocalSearchRangeX; unsigned m_IBCLocalSearchRangeY; diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 80270fd95a76d7399254c23b5e4f8e1951be6b62..16ea18836a976d7fd76488a8beb690042b4640ef 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,8 @@ #include <assert.h> #include <cassert> +#define JVET_N0449_MMVD_SIMP 1 // Configurable number of mmvd distance entries used + #define JVET_N0477_LMCS_CLEANUP 1 #define JVET_N0220_LMCS_SIMPLIFICATION 1 diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index 41d8a29e4af1b8f928b33957767b91d53da9c68e..ceb94566300d50b65d8871c38281fd33223933da 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -240,6 +240,9 @@ protected: bool m_HashME; bool m_AffineAmvrEncOpt; bool m_DMVR; +#if JVET_N0449_MMVD_SIMP + int m_MmvdDisNum; +#endif unsigned m_IBCMode; unsigned m_IBCLocalSearchRangeX; unsigned m_IBCLocalSearchRangeY; @@ -762,7 +765,10 @@ public: bool getUseAffineAmvrEncOpt () const { return m_AffineAmvrEncOpt; } void setDMVR ( bool b ) { m_DMVR = b; } bool getDMVR () const { return m_DMVR; } - +#if JVET_N0449_MMVD_SIMP + void setMmvdDisNum ( int b ) { m_MmvdDisNum = b; } + int getMmvdDisNum () const { return m_MmvdDisNum; } +#endif void setIBCMode (unsigned n) { m_IBCMode = n; } unsigned getIBCMode () const { return m_IBCMode; } void setIBCLocalSearchRangeX (unsigned n) { m_IBCLocalSearchRangeX = n; } diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index 51f0e938634470972ecb2abdd9c31613eb26202e..a8dc49e9902a07db95356cf269722d684b5235eb 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -1999,6 +1999,10 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& int refineStep; baseIdx = mmvdMergeCand / MMVD_MAX_REFINE_NUM; refineStep = (mmvdMergeCand - (baseIdx * MMVD_MAX_REFINE_NUM)) / 4; +#if JVET_N0449_MMVD_SIMP + if (refineStep >= m_pcEncCfg->getMmvdDisNum()) + continue; +#endif bitsBaseIdx = baseIdx + 1; if (baseIdx == MMVD_BASE_MV_NUM - 1) {