From c52b8783daca1c9c71ce07e08a93f8fccce53dcd Mon Sep 17 00:00:00 2001
From: Chun-Chi Chen <chunchic@qti.qualcomm.com>
Date: Mon, 11 Jul 2022 05:23:34 +0000
Subject: [PATCH] Fix: Compilation error when TM_MRG=0 or TM_AMVP=0 and
 redundant computation when --AltGPMSplitModeCode=0

---
 source/Lib/CommonLib/UnitTools.cpp | 12 +++++++++++-
 source/Lib/CommonLib/UnitTools.h   |  4 +++-
 source/Lib/DecoderLib/DecCu.cpp    |  8 +++++++-
 source/Lib/EncoderLib/EncCu.cpp    | 11 ++++++++---
 4 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp
index 0d0562054..7a296cad1 100644
--- a/source/Lib/CommonLib/UnitTools.cpp
+++ b/source/Lib/CommonLib/UnitTools.cpp
@@ -2674,7 +2674,7 @@ uint32_t PU::getBDMVRMvdThreshold(const PredictionUnit &pu)
 }
 #endif
 
-#if TM_MRG
+#if TM_MRG || TM_AMVP
 uint32_t PU::getTMMvdThreshold(const PredictionUnit &pu)
 {
   uint32_t numPixels = pu.lwidth() * pu.lheight();
@@ -2691,7 +2691,9 @@ uint32_t PU::getTMMvdThreshold(const PredictionUnit &pu)
     return 4 << MV_FRACTIONAL_BITS_INTERNAL;
   }
 }
+#endif
 
+#if TM_MRG
 int PU::reorderInterMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx, int numCand, uint32_t mvdSimilarityThresh)
 {
   Slice& slice = *pu.cu->slice;
@@ -4999,7 +5001,9 @@ void PU::getTmvpMergeCand(const PredictionUnit &pu, MergeCtx& mrgCtx)
   const CodingStructure &cs = *pu.cs;
   const Slice &slice = *pu.cs->slice;
 
+#if TM_MRG
   const uint32_t mvdSimilarityThresh = 1;
+#endif
   const uint32_t maxNumMergeCand = NUM_TMVP_CANDS;
   for (uint32_t ui = 0; ui < maxNumMergeCand; ++ui)
   {
@@ -5266,7 +5270,9 @@ void PU::getNonAdjacentMergeCand(const PredictionUnit &pu, MergeCtx& mrgCtx)
   const CodingStructure &cs = *pu.cs;
   const Slice &slice = *pu.cs->slice;
 
+#if TM_MRG
   const uint32_t mvdSimilarityThresh = getBDMVRMvdThreshold(pu);
+#endif
   const uint32_t maxNumMergeCand = NUM_NON_ADJ_CANDS;
 
   for (uint32_t ui = 0; ui < maxNumMergeCand; ++ui)
@@ -6043,13 +6049,17 @@ void PU::fillIBCMvpCand(PredictionUnit &pu, AMVPInfo &amvpInfo)
 #if JVET_Z0084_IBC_TM && TM_AMVP
   pInfo->maxSimilarityThreshold = (pu.cs->sps->getUseDMVDMode() && pcInter) ? PU::getTMMvdThreshold(pu) : 1;
 
+#if TM_MRG
   pu.tmMergeFlag = true;
+#endif
 #if JVET_Z0075_IBC_HMVP_ENLARGE
   PU::getIBCMergeCandidates(pu, mergeCtx, pu.cs->sps->getMaxNumIBCMergeCand());
 #else
   PU::getIBCMergeCandidates(pu, mergeCtx);
 #endif
+#if TM_MRG
   pu.tmMergeFlag = false;
+#endif
 
   int candIdx = 0;
   while ((pInfo->numCand < AMVP_MAX_NUM_CANDS_MEM) && (candIdx < mergeCtx.numValidMergeCand))
diff --git a/source/Lib/CommonLib/UnitTools.h b/source/Lib/CommonLib/UnitTools.h
index aff0bd881..9c318d7a9 100644
--- a/source/Lib/CommonLib/UnitTools.h
+++ b/source/Lib/CommonLib/UnitTools.h
@@ -173,8 +173,10 @@ namespace PU
 #if MULTI_PASS_DMVR || JVET_W0097_GPM_MMVD_TM
   uint32_t getBDMVRMvdThreshold       (const PredictionUnit &pu);
 #endif
-#if TM_MRG
+#if TM_MRG || TM_AMVP
   uint32_t getTMMvdThreshold          (const PredictionUnit &pu);
+#endif
+#if TM_MRG
   int      reorderInterMergeCandidates(const PredictionUnit &pu, MergeCtx& mrgCtx, int numCand, uint32_t mvdSimilarityThresh );
 #endif
   void getInterMergeCandidates        (const PredictionUnit &pu, MergeCtx& mrgCtx,
diff --git a/source/Lib/DecoderLib/DecCu.cpp b/source/Lib/DecoderLib/DecCu.cpp
index b1ff32542..6abca8448 100644
--- a/source/Lib/DecoderLib/DecCu.cpp
+++ b/source/Lib/DecoderLib/DecCu.cpp
@@ -1976,7 +1976,11 @@ void DecCu::xDeriveCUMV( CodingUnit &cu )
               if (tplAvail)
               {
 #if JVET_Z0102_NO_ARMC_FOR_ZERO_CAND
-                m_pcInterPred->adjustMergeCandidates(pu, mrgCtx, pu.tmMergeFlag ? pu.cs->sps->getMaxNumTMMergeCand() : pu.cs->sps->getMaxNumMergeCand());
+                m_pcInterPred->adjustMergeCandidates(pu, mrgCtx, 
+#if TM_MRG
+                                                     pu.tmMergeFlag ? pu.cs->sps->getMaxNumTMMergeCand() : 
+#endif
+                                                     pu.cs->sps->getMaxNumMergeCand());
 #else
                 m_pcInterPred->adjustMergeCandidatesInOneCandidateGroup(pu, mrgCtx, pu.mergeIdx + 1, pu.mergeIdx);
 #endif
@@ -2096,7 +2100,9 @@ void DecCu::xDeriveCUMV( CodingUnit &cu )
       if (!cu.cs->pcv->isEncoder)
 #endif
       {
+#if TM_AMVP
         m_pcInterPred->clearTplAmvpBuffer();
+#endif
         if (pu.cu->affine)
         {
           for (uint32_t uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++)
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index 992b7a9c1..ea38a141b 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -4922,10 +4922,13 @@ void EncCu::xCheckRDCostMergeGeoComb2Nx2N(CodingStructure *&tempCS, CodingStruct
     geoModeCost[idx] = (double)fracBits * sqrtLambdaFracBits;
   }
 #if JVET_Z0056_GPM_SPLIT_MODE_REORDERING
-  for (int idx = 0; idx < GEO_NUM_SIG_PARTMODE; idx++)
+  if (sps.getUseAltGPMSplitModeCode())
   {
-    uint64_t fracBits = m_CABACEstimator->geo_mode_est(ctxStart, idx, 1);
-    geoSigModeCost[idx] = (double)fracBits * sqrtLambdaFracBits;
+    for (int idx = 0; idx < GEO_NUM_SIG_PARTMODE; idx++)
+    {
+      uint64_t fracBits = m_CABACEstimator->geo_mode_est(ctxStart, idx, 1);
+      geoSigModeCost[idx] = (double)fracBits * sqrtLambdaFracBits;
+    }
   }
 #endif
   for (int idx = 0; idx < maxNumMergeCandidates; idx++)
@@ -5325,8 +5328,10 @@ void EncCu::xCheckRDCostMergeGeoComb2Nx2N(CodingStructure *&tempCS, CodingStruct
 #endif
     );
   }
+#if TM_MRG
   const int tmMmvdBufIdx0 = GPM_EXT_MMVD_MAX_REFINE_NUM + 1;
   const int tmMmvdBufIdx1 = GPM_EXT_MMVD_MAX_REFINE_NUM + 1;
+#endif
 #endif
 
   for (int splitDir = 0; splitDir < GEO_NUM_PARTITION_MODE; splitDir++)
-- 
GitLab