From 846ba56262eac2e451bb8ed671822c5bbeb178b3 Mon Sep 17 00:00:00 2001
From: Franck Galpin <franck.galpin@interdigital.com>
Date: Mon, 25 Nov 2024 09:23:16 +0100
Subject: [PATCH] correct lop backward compatibility

---
 source/Lib/CommonLib/NNFilterUnified.cpp      | 77 +++++++++++--------
 .../Lib/EncoderLib/EncAdaptiveLoopFilter.cpp  |  1 +
 2 files changed, 48 insertions(+), 30 deletions(-)

diff --git a/source/Lib/CommonLib/NNFilterUnified.cpp b/source/Lib/CommonLib/NNFilterUnified.cpp
index 9382984b3..a2e0ca782 100644
--- a/source/Lib/CommonLib/NNFilterUnified.cpp
+++ b/source/Lib/CommonLib/NNFilterUnified.cpp
@@ -422,28 +422,34 @@ static void extractOutputsDCT(const Picture &pic, sadl::Model<T> &m, PelUnitBuf
   block[1] = 0;
   block[2] = 0;
   block[3] = 0;
+  const bool early_cropping=(inferArea.Y().width/2<output.dims()[2]);
 #endif
-  
   for (int y = 0; y < height / dct_sizeh; y++)
   {
     for (int x = 0; x < width / dct_sizew; x++)
     {
       int c1 = x % 2 + (y % 2) * 2;   // take every 4th channel before pixel shuffle
 #if JVET_AJ0054_EARLY_CROPPING
-      if( y<2 || y>=((height/dct_sizeh)-2) || x < 2 || x>=((width/dct_sizew)-2))
-      {
-       continue;
-      }      
+      if (early_cropping) {
+          if( y<2 || y>=((height/dct_sizeh)-2) || x < 2 || x>=((width/dct_sizew)-2))
+          {
+              continue;
+          }
+      }
 #endif      
       if constexpr (std::is_same<TypeSadlLFUnified, float>::value)
       {
         for (int cc = c1; cc < dct_sizew * dct_sizeh * 4; cc += 4)
         {
 #if JVET_AJ0054_EARLY_CROPPING
-	  tempCoeff[cc / 4] = output(0, (y / 2)-2, (x / 2)-2, cc) * (1 << shiftOutput);
-#else	  
-          tempCoeff[cc / 4] = output(0, y / 2, x / 2, cc) * (1 << shiftOutput);
+            if (early_cropping) {
+                tempCoeff[cc / 4] = output(0, (y / 2)-2, (x / 2)-2, cc) * (1 << shiftOutput);
+            } else
 #endif
+            {
+                tempCoeff[cc / 4] = output(0, y / 2, x / 2, cc) * (1 << shiftOutput);
+
+            }
         }
       }
       else
@@ -451,10 +457,14 @@ static void extractOutputsDCT(const Picture &pic, sadl::Model<T> &m, PelUnitBuf
         for (int cc = c1; cc < dct_sizew * dct_sizeh * 4; cc += 4)
         {
 #if JVET_AJ0054_EARLY_CROPPING
-	  tempCoeff[cc / 4] = output(0, (y / 2)-2, (x / 2)-2, cc) << shiftOutput;
-#else	  
-          tempCoeff[cc / 4] = output(0, y / 2, x / 2, cc) << shiftOutput;
-#endif	  
+            if (early_cropping) {
+                tempCoeff[cc / 4] = output(0, (y / 2)-2, (x / 2)-2, cc) << shiftOutput;
+            }
+            else
+#endif
+            {
+                tempCoeff[cc / 4] = output(0, y / 2, x / 2, cc) << shiftOutput;
+            }
         }
       }
       tmp[0]   = tempCoeff[0] + tempCoeff[1];
@@ -509,22 +519,27 @@ static void extractOutputsDCT(const Picture &pic, sadl::Model<T> &m, PelUnitBuf
     for (int x = 0; x < width / 2 / dct_sizew; x++)
     {
 #if JVET_AJ0054_EARLY_CROPPING
-      if( y<2 || y>=((height/2/dct_sizeh)-2) || x < 2 || x>=((width/2/dct_sizew)-2))
-      {
-       continue;
-      }      
+        if (early_cropping) {
+            if( y<2 || y>=((height/2/dct_sizeh)-2) || x < 2 || x>=((width/2/dct_sizew)-2))
+            {
+                continue;
+            }
+        }
 #endif      
       if constexpr (std::is_same<TypeSadlLFUnified, float>::value)
       {
         for (int cc = dct_sizew * dct_sizeh * 4; cc < dct_sizew * dct_sizeh * 5; cc++)
         {
 #if JVET_AJ0054_EARLY_CROPPING
-	  tempCoeffCb[cc - dct_sizew * dct_sizeh * 4] = output(0, y-2, x-2, cc) * (1 << shiftOutput);
-	  tempCoeffCr[cc - dct_sizew * dct_sizeh * 4] = output(0, y-2, x-2, cc + dct_sizew * dct_sizeh) * (1 << shiftOutput);
-#else
-	  tempCoeffCb[cc - dct_sizew * dct_sizeh * 4] = output(0, y, x, cc) * (1 << shiftOutput);
-	  tempCoeffCr[cc - dct_sizew * dct_sizeh * 4] = output(0, y, x, cc + dct_sizew * dct_sizeh) * (1 << shiftOutput);
-#endif	
+            if (early_cropping) {
+                tempCoeffCb[cc - dct_sizew * dct_sizeh * 4] = output(0, y-2, x-2, cc) * (1 << shiftOutput);
+                tempCoeffCr[cc - dct_sizew * dct_sizeh * 4] = output(0, y-2, x-2, cc + dct_sizew * dct_sizeh) * (1 << shiftOutput);
+            } else
+#endif
+            {
+                tempCoeffCb[cc - dct_sizew * dct_sizeh * 4] = output(0, y, x, cc) * (1 << shiftOutput);
+                tempCoeffCr[cc - dct_sizew * dct_sizeh * 4] = output(0, y, x, cc + dct_sizew * dct_sizeh) * (1 << shiftOutput);
+            }
         }
       }
       else
@@ -532,12 +547,15 @@ static void extractOutputsDCT(const Picture &pic, sadl::Model<T> &m, PelUnitBuf
         for (int cc = dct_sizew * dct_sizeh * 4; cc < dct_sizew * dct_sizeh * 5; cc++)
         {
 #if JVET_AJ0054_EARLY_CROPPING
-	  tempCoeffCb[cc - dct_sizew * dct_sizeh * 4] = output(0, y-2, x-2, cc) << shiftOutput;
-	  tempCoeffCr[cc - dct_sizew * dct_sizeh * 4] = output(0, y-2, x-2, cc + dct_sizew * dct_sizeh) << shiftOutput;
-#else	  
-	  tempCoeffCb[cc - dct_sizew * dct_sizeh * 4] = output(0, y, x, cc) << shiftOutput;
-	  tempCoeffCr[cc - dct_sizew * dct_sizeh * 4] = output(0, y, x, cc + dct_sizew * dct_sizeh) << shiftOutput;
-#endif	
+            if (early_cropping) {
+                tempCoeffCb[cc - dct_sizew * dct_sizeh * 4] = output(0, y-2, x-2, cc) << shiftOutput;
+                tempCoeffCr[cc - dct_sizew * dct_sizeh * 4] = output(0, y-2, x-2, cc + dct_sizew * dct_sizeh) << shiftOutput;
+            } else
+#endif
+            {
+                tempCoeffCb[cc - dct_sizew * dct_sizeh * 4] = output(0, y, x, cc) << shiftOutput;
+                tempCoeffCr[cc - dct_sizew * dct_sizeh * 4] = output(0, y, x, cc + dct_sizew * dct_sizeh) << shiftOutput;
+            }
         }
       }
       tmpCb[0]   = tempCoeffCb[0] + tempCoeffCb[1];
@@ -548,7 +566,7 @@ static void extractOutputsDCT(const Picture &pic, sadl::Model<T> &m, PelUnitBuf
       blockCb[1] = tmpCb[2] + tmpCb[3];
       blockCb[2] = tmpCb[0] - tmpCb[1];
       blockCb[3] = tmpCb[2] - tmpCb[3];
-	    tmpCr[0]   = tempCoeffCr[0] + tempCoeffCr[1];
+      tmpCr[0]   = tempCoeffCr[0] + tempCoeffCr[1];
       tmpCr[1]   = tempCoeffCr[2] + tempCoeffCr[3];
       tmpCr[2]   = tempCoeffCr[0] - tempCoeffCr[1];
       tmpCr[3]   = tempCoeffCr[2] - tempCoeffCr[3];
@@ -708,7 +726,6 @@ void NNFilterUnified::filterBlock(Picture &pic, UnitArea inferArea, int extLeft,
     m_inputs[7](0, 0) = 1;
   }
 #endif
-
   NNInference::infer<TypeSadlLFUnified>(model, m_inputs);
 
   UnitArea inferAreaNoExt(inferArea.chromaFormat, Area(inferArea.lx() + extLeft, inferArea.ly() + extTop, inferArea.lwidth() - extLeft - extRight, inferArea.lheight() - extTop - extBottom));
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
index c67322e2c..15aae5f27 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
@@ -3700,6 +3700,7 @@ void EncAdaptiveLoopFilter::deriveCcAlfFilter( CodingStructure& cs, ComponentID
   double bestFilteredTotalCost        = MAX_DOUBLE;
   bool   bestreuseTemporalFilterCoeff = false;
   std::vector<int> apsIds             = getAvailableCcAlfApsIds(cs, compID);
+  m_bestFilterCount = 0;
 
   for (int testFilterIdx = 0; testFilterIdx < ( apsIds.size() + 1 ); testFilterIdx++ )
   {
-- 
GitLab