From 2ddf518155747e8ef1d4dab8729a9af020b1d3d1 Mon Sep 17 00:00:00 2001
From: Frank Bossen <fbossen@gmail.com>
Date: Wed, 20 Feb 2019 12:40:34 -0500
Subject: [PATCH] Add macro to disable MMVD

Code was salvaged from !306
---
 source/Lib/CommonLib/TypeDef.h        |  2 ++
 source/Lib/DecoderLib/CABACReader.cpp |  9 ++++++++-
 source/Lib/EncoderLib/CABACWriter.cpp | 10 ++++++++--
 source/Lib/EncoderLib/EncCu.cpp       |  6 ++++--
 4 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index d611c5ad3..d51677ed1 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -56,6 +56,8 @@
 
 #define JVET_M0428_ENC_DB_OPT                             1 // Encoder optimization with deblocking filter
 
+#define JVET_MMVD_OFF_MACRO                               0
+
 #define JVET_M0055_DEBUG_CTU                              1 // DebugCTU encoder debug option
 
 #define JVET_M0297_32PT_MTS_ZERO_OUT                      1 // 32 point MTS based on skipping high frequency coefficients
diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp
index db7838562..1727e7ccd 100644
--- a/source/Lib/DecoderLib/CABACReader.cpp
+++ b/source/Lib/DecoderLib/CABACReader.cpp
@@ -993,9 +993,13 @@ void CABACReader::cu_skip_flag( CodingUnit& cu )
   if( skip )
 #endif
   {
+#if JVET_MMVD_OFF_MACRO
+    cu.mmvdSkip = false;
+#else
     unsigned mmvdSkip = m_BinDecoder.decodeBin(Ctx::MmvdFlag(0));
     cu.mmvdSkip = mmvdSkip;
     DTRACE(g_trace_ctx, D_SYNTAX, "mmvd_cu_skip_flag() ctx=%d mmvd_skip=%d\n", 0, mmvdSkip ? 1 : 0);
+#endif
     cu.skip     = true;
     cu.rootCbf  = false;
     cu.predMode = MODE_INTER;
@@ -1823,12 +1827,15 @@ void CABACReader::merge_flag( PredictionUnit& pu )
     return;
   }
 #endif
-
+#if JVET_MMVD_OFF_MACRO
+  pu.mmvdMergeFlag = false;
+#else
   if (pu.mergeFlag)
   {
     pu.mmvdMergeFlag = (m_BinDecoder.decodeBin(Ctx::MmvdFlag(0)));
     DTRACE(g_trace_ctx, D_SYNTAX, "mmvd_merge_flag() mmvd_merge=%d pos=(%d,%d) size=%dx%d\n", pu.mmvdMergeFlag ? 1 : 0, pu.lumaPos().x, pu.lumaPos().y, pu.lumaSize().width, pu.lumaSize().height);
   }
+#endif
 }
 
 
diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp
index a9b4f7aef..ab3d37ea5 100644
--- a/source/Lib/EncoderLib/CABACWriter.cpp
+++ b/source/Lib/EncoderLib/CABACWriter.cpp
@@ -792,25 +792,30 @@ void CABACWriter::cu_skip_flag( const CodingUnit& cu )
     unsigned ctxidx = DeriveCtx::CtxIBCFlag(cu);
     m_BinEncoder.encodeBin(CU::isIBC(cu) ? 1 : 0, Ctx::IBCFlag(ctxidx));
     DTRACE(g_trace_ctx, D_SYNTAX, "ibc() ctx=%d cu.predMode=%d\n", ctxidx, cu.predMode);
-
+#if !JVET_MMVD_OFF_MACRO
     if (CU::isInter(cu))
     {
       m_BinEncoder.encodeBin(cu.mmvdSkip, Ctx::MmvdFlag(0));
       DTRACE(g_trace_ctx, D_SYNTAX, "mmvd_cu_skip_flag() ctx=%d mmvd_skip=%d\n", 0, cu.mmvdSkip ? 1 : 0);
     }
+#endif
   }
+#if !JVET_MMVD_OFF_MACRO
   if (cu.skip && !cu.cs->slice->getSPS()->getIBCFlag())
   {
     m_BinEncoder.encodeBin(cu.mmvdSkip, Ctx::MmvdFlag(0));
     DTRACE(g_trace_ctx, D_SYNTAX, "mmvd_cu_skip_flag() ctx=%d mmvd_skip=%d\n", 0, cu.mmvdSkip ? 1 : 0);
   }
+#endif
 #else
+#if !JVET_MMVD_OFF_MACRO
   if (cu.skip)
   {
     m_BinEncoder.encodeBin(cu.mmvdSkip, Ctx::MmvdFlag(0));
     DTRACE(g_trace_ctx, D_SYNTAX, "mmvd_cu_skip_flag() ctx=%d mmvd_skip=%d\n", 0, cu.mmvdSkip ? 1 : 0);
   }
 #endif
+#endif
 }
 
 
@@ -1657,12 +1662,13 @@ void CABACWriter::merge_flag( const PredictionUnit& pu )
     return;
   }
 #endif
-
+#if !JVET_MMVD_OFF_MACRO
   if (pu.mergeFlag)
   {
     m_BinEncoder.encodeBin(pu.mmvdMergeFlag, Ctx::MmvdFlag(0));
     DTRACE(g_trace_ctx, D_SYNTAX, "mmvd_merge_flag() mmvd_merge=%d pos=(%d,%d) size=%dx%d\n", pu.mmvdMergeFlag ? 1 : 0, pu.lumaPos().x, pu.lumaPos().y, pu.lumaSize().width, pu.lumaSize().height);
   }
+#endif
 }
 
 void CABACWriter::imv_mode( const CodingUnit& cu )
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index 6f461e435..ccdd85eaa 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -2234,7 +2234,9 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
         {
           uiBitsCand--;
         }
+#if !JVET_MMVD_OFF_MACRO
         uiBitsCand++; // for mmvd_flag
+#endif
         double cost     = (double)uiSad + (double)uiBitsCand * sqrtLambdaForFirstPass;
         insertPos = -1;
         updateDoubleCandList(uiMergeCand, cost, RdModeList, candCostList, RdModeList2, (uint32_t)NUM_LUMA_MODE, uiNumMrgSATDCand, &insertPos);
@@ -2380,7 +2382,7 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
         pu.mhIntraFlag = false;
         m_CABACEstimator->getCtx() = ctxStart;
       }
-
+#if !JVET_MMVD_OFF_MACRO
       cu.mmvdSkip = true;
       int tempNum = 0;
       tempNum = MMVD_ADD_NUM;
@@ -2464,7 +2466,7 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *&
           swap(singleMergeTempBuffer, acMergeTempBuffer[insertPos]);
         }
       }
-
+#endif
       // Try to limit number of candidates using SATD-costs
       for( uint32_t i = 1; i < uiNumMrgSATDCand; i++ )
       {
-- 
GitLab