From e1eeec744ecbb965999e756b2644859bf522ed1c Mon Sep 17 00:00:00 2001
From: Vadim Seregin <vseregin@qti.qualcomm.com>
Date: Fri, 11 Aug 2023 20:58:10 +0000
Subject: [PATCH] Fix: add initialization for BIF overhead parsing and copy

---
 source/Lib/CommonLib/Picture.h        |  4 +++-
 source/Lib/DecoderLib/CABACReader.cpp | 26 +++++++++++++++-----------
 source/Lib/DecoderLib/DecLib.cpp      |  4 ++++
 source/Lib/EncoderLib/CABACWriter.cpp | 14 +++++++-------
 4 files changed, 29 insertions(+), 19 deletions(-)

diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h
index 61f072cb2..0f5acca2f 100644
--- a/source/Lib/CommonLib/Picture.h
+++ b/source/Lib/CommonLib/Picture.h
@@ -341,13 +341,15 @@ public:
   void            copySAO(const Picture& src, int dstid)    { std::copy(src.m_sao[0].begin(), src.m_sao[0].end(), m_sao[dstid].begin()); }
 
 #if JVET_V0094_BILATERAL_FILTER
-  BifParams&       getBifParam( const ComponentID compID ) { return m_bifParams[compID]; }
+  BifParams&       getBifParam( const ComponentID compID )  { return m_bifParams[compID]; }
   void resizeBIF( const ComponentID compID, unsigned numEntries )
   {
     m_bifParams[compID].numBlocks = numEntries;
     m_bifParams[compID].ctuOn.resize(numEntries);
     std::fill(m_bifParams[compID].ctuOn.begin(), m_bifParams[compID].ctuOn.end(), 0);
   };
+
+  void              copyBIF( const Picture& src )            { m_bifParams[COMPONENT_Y] = src.m_bifParams[COMPONENT_Y]; m_bifParams[COMPONENT_Cb] = src.m_bifParams[COMPONENT_Cb]; m_bifParams[COMPONENT_Cr] = src.m_bifParams[COMPONENT_Cr]; }
 #endif
 #if ENABLE_QPA
   std::vector<double>     m_uEnerHpCtu;                         ///< CTU-wise L2 or squared L1 norm of high-passed luma input
diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp
index eb92e6f91..09c3b5540 100644
--- a/source/Lib/DecoderLib/CABACReader.cpp
+++ b/source/Lib/DecoderLib/CABACReader.cpp
@@ -584,9 +584,11 @@ void CABACReader::bif( const ComponentID compID, CodingStructure& cs, unsigned c
   }
 #endif
 
+  RExt__DECODER_DEBUG_BIT_STATISTICS_CREATE_SET2( STATS__CABAC_BITS__BIF, compID );
+
   BifParams& bifParams = cs.picture->getBifParam( compID );
 
-  if (ctuRsAddr == 0)
+  if( ctuRsAddr == 0 )
   {
     int width = cs.picture->lwidth();
     int height = cs.picture->lheight();
@@ -598,30 +600,32 @@ void CABACReader::bif( const ComponentID compID, CodingStructure& cs, unsigned c
     bifParams.numBlocks = widthInBlocks * heightInBlocks;
     bifParams.ctuOn.resize( bifParams.numBlocks );
     std::fill(bifParams.ctuOn.begin(), bifParams.ctuOn.end(), 0);
-  }
-  RExt__DECODER_DEBUG_BIT_STATISTICS_CREATE_SET2(STATS__CABAC_BITS__BIF, compID);
-  if (ctuRsAddr == 0)
-  {
+
     bifParams.allCtuOn = m_BinDecoder.decodeBinEP();
+
     if( bifParams.allCtuOn == 0 )
     {
       bifParams.frmOn = m_BinDecoder.decodeBinEP();
     }
+    else
+    {
+      bifParams.frmOn = 0;
+    }
   }
-  int i = ctuRsAddr;
-  if (bifParams.allCtuOn)
+
+  if( bifParams.allCtuOn )
   {
-    bifParams.ctuOn[i] = 1;
+    bifParams.ctuOn[ctuRsAddr] = 1;
   }
   else
   {
-    if (bifParams.frmOn )
+    if( bifParams.frmOn )
     {
-      bifParams.ctuOn[i] = m_BinDecoder.decodeBin(Ctx::BifCtrlFlags[compID]());
+      bifParams.ctuOn[ctuRsAddr] = m_BinDecoder.decodeBin( Ctx::BifCtrlFlags[compID]() );
     }
     else
     {
-      bifParams.ctuOn[i] = 0;
+      bifParams.ctuOn[ctuRsAddr] = 0;
     }
   }
 }
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index 7ed28e46b..0c4074592 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -209,6 +209,10 @@ bool tryDecodePicture( Picture* pcEncPic, const int expectedPoc, const std::stri
 #endif
                 {
                   pcEncPic->copySAO( *pic, 0 );
+
+#if JVET_V0094_BILATERAL_FILTER
+                  pcEncPic->copyBIF( *pic );
+#endif
                 }
 
 #if JVET_W0066_CCSAO
diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp
index 4bcd74dee..ea5051347 100644
--- a/source/Lib/EncoderLib/CABACWriter.cpp
+++ b/source/Lib/EncoderLib/CABACWriter.cpp
@@ -178,18 +178,18 @@ void CABACWriter::bif( const ComponentID compID, const Slice& slice, const BifPa
   }
 #endif
 
-  if (ctuRsAddr == 0)
+  if( ctuRsAddr == 0 )
   {
-    m_BinEncoder.encodeBinEP(bifParams.allCtuOn);
-    if (bifParams.allCtuOn == 0)
+    m_BinEncoder.encodeBinEP( bifParams.allCtuOn );
+    if( bifParams.allCtuOn == 0 )
     {
-      m_BinEncoder.encodeBinEP(bifParams.frmOn);
+      m_BinEncoder.encodeBinEP( bifParams.frmOn );
     }
   }
-  if(bifParams.allCtuOn == 0 && bifParams.frmOn )
+
+  if( bifParams.allCtuOn == 0 && bifParams.frmOn )
   {
-    int i = ctuRsAddr;
-    m_BinEncoder.encodeBin( bifParams.ctuOn[i], Ctx::BifCtrlFlags[compID]() );
+    m_BinEncoder.encodeBin( bifParams.ctuOn[ctuRsAddr], Ctx::BifCtrlFlags[compID]() );
   }
 }
 #endif
-- 
GitLab