From 21f83d59174709918248a81f1a5e28e4e1cbf93d Mon Sep 17 00:00:00 2001
From: Frank Bossen <fbossen@gmail.com>
Date: Thu, 27 Oct 2022 00:25:46 +0200
Subject: [PATCH] Clean up handling of ALF data in Picture object

---
 source/Lib/CommonLib/Picture.cpp   | 40 ++++++++++++++++++++++++
 source/Lib/CommonLib/Picture.h     | 49 ++++++++----------------------
 source/Lib/DecoderLib/DecLib.cpp   | 18 +----------
 source/Lib/DecoderLib/DecSlice.cpp |  4 +--
 source/Lib/EncoderLib/EncGOP.cpp   |  4 +--
 5 files changed, 56 insertions(+), 59 deletions(-)

diff --git a/source/Lib/CommonLib/Picture.cpp b/source/Lib/CommonLib/Picture.cpp
index 9298d03723..8171445702 100644
--- a/source/Lib/CommonLib/Picture.cpp
+++ b/source/Lib/CommonLib/Picture.cpp
@@ -1616,3 +1616,43 @@ void Picture::xOutputPreFilteredPic(Picture* pcPic, PicList* pcListPic, int blen
 }
 #endif
 
+void Picture::copyAlfData(const Picture &p)
+{
+  CHECK(p.m_alfCtbFilterIndex.size() != m_alfCtbFilterIndex.size(), "Size mismatch");
+
+  std::copy(p.m_alfCtbFilterIndex.begin(), p.m_alfCtbFilterIndex.end(), m_alfCtbFilterIndex.begin());
+
+  for (int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++)
+  {
+    CHECK(p.m_alfCtuEnableFlag[compIdx].size() != m_alfCtuEnableFlag[compIdx].size(), "Size mismatch");
+
+    std::copy(p.m_alfCtuEnableFlag[compIdx].begin(), p.m_alfCtuEnableFlag[compIdx].end(),
+              m_alfCtuEnableFlag[compIdx].begin());
+  }
+
+  for (int compIdx = COMPONENT_Cb; compIdx < MAX_NUM_COMPONENT; compIdx++)
+  {
+    CHECK(p.m_alfCtuAlternative[compIdx].size() != m_alfCtuAlternative[compIdx].size(), "Size mismatch");
+
+    std::copy(p.m_alfCtuAlternative[compIdx].begin(), p.m_alfCtuAlternative[compIdx].end(),
+              m_alfCtuAlternative[compIdx].begin());
+  }
+}
+
+void Picture::resizeAlfData(const int numEntries)
+{
+  for (int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++)
+  {
+    m_alfCtuEnableFlag[compIdx].resize(numEntries);
+    std::fill(m_alfCtuEnableFlag[compIdx].begin(), m_alfCtuEnableFlag[compIdx].end(), 0);
+  }
+
+  m_alfCtbFilterIndex.resize(numEntries);
+  std::fill(m_alfCtbFilterIndex.begin(), m_alfCtbFilterIndex.end(), 0);
+
+  for (int compIdx = 1; compIdx < MAX_NUM_COMPONENT; compIdx++)
+  {
+    m_alfCtuAlternative[compIdx].resize(numEntries);
+    std::fill(m_alfCtuAlternative[compIdx].begin(), m_alfCtuAlternative[compIdx].end(), 0);
+  }
+}
diff --git a/source/Lib/CommonLib/Picture.h b/source/Lib/CommonLib/Picture.h
index 8838998222..6d6d9045e6 100644
--- a/source/Lib/CommonLib/Picture.h
+++ b/source/Lib/CommonLib/Picture.h
@@ -278,6 +278,12 @@ private:
   UnitArea m_ctuArea;
 #endif
 
+  std::vector<uint8_t> m_alfCtuEnableFlag[MAX_NUM_COMPONENT];
+  std::vector<short>   m_alfCtbFilterIndex;
+  std::vector<uint8_t> m_alfCtuAlternative[MAX_NUM_COMPONENT];
+
+  std::vector<SAOBlkParam> m_sao[2];
+
 public:
   SAOBlkParam    *getSAO(int id = 0)                        { return &m_sao[id][0]; };
   void            resizeSAO(unsigned numEntries, int dstid) { m_sao[dstid].resize(numEntries); }
@@ -286,46 +292,17 @@ public:
 #if ENABLE_QPA
   std::vector<double>     m_uEnerHpCtu;                         ///< CTU-wise L2 or squared L1 norm of high-passed luma input
   std::vector<Pel>        m_iOffsetCtu;                         ///< CTU-wise DC offset (later QP index offset) of luma input
- #if ENABLE_QPA_SUB_CTU
+#if ENABLE_QPA_SUB_CTU
   std::vector<int8_t>     m_subCtuQP;                           ///< sub-CTU-wise adapted QPs for delta-QP depth of 1 or more
- #endif
+#endif
 #endif
 
-  std::vector<SAOBlkParam> m_sao[2];
+  void copyAlfData(const Picture &p);
+  void resizeAlfData(int numEntries);
 
-  std::vector<uint8_t> m_alfCtuEnableFlag[MAX_NUM_COMPONENT];
-  uint8_t* getAlfCtuEnableFlag( int compIdx ) { return m_alfCtuEnableFlag[compIdx].data(); }
-  std::vector<uint8_t>* getAlfCtuEnableFlag() { return m_alfCtuEnableFlag; }
-  void resizeAlfCtuEnableFlag( int numEntries )
-  {
-    for( int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++ )
-    {
-      m_alfCtuEnableFlag[compIdx].resize( numEntries );
-      std::fill( m_alfCtuEnableFlag[compIdx].begin(), m_alfCtuEnableFlag[compIdx].end(), 0 );
-    }
-  }
-  std::vector<short> m_alfCtbFilterIndex;
-  short* getAlfCtbFilterIndex() { return m_alfCtbFilterIndex.data(); }
-  std::vector<short>& getAlfCtbFilterIndexVec() { return m_alfCtbFilterIndex; }
-  void resizeAlfCtbFilterIndex(int numEntries)
-  {
-    m_alfCtbFilterIndex.resize(numEntries);
-    for (int i = 0; i < numEntries; i++)
-    {
-      m_alfCtbFilterIndex[i] = 0;
-    }
-  }
-  std::vector<uint8_t> m_alfCtuAlternative[MAX_NUM_COMPONENT];
-  std::vector<uint8_t>& getAlfCtuAlternative( int compIdx ) { return m_alfCtuAlternative[compIdx]; }
-  uint8_t* getAlfCtuAlternativeData( int compIdx ) { return m_alfCtuAlternative[compIdx].data(); }
-  void resizeAlfCtuAlternative( int numEntries )
-  {
-    for( int compIdx = 1; compIdx < MAX_NUM_COMPONENT; compIdx++ )
-    {
-      m_alfCtuAlternative[compIdx].resize( numEntries );
-      std::fill( m_alfCtuAlternative[compIdx].begin(), m_alfCtuAlternative[compIdx].end(), 0 );
-    }
-  }
+  uint8_t *getAlfCtuEnableFlag(int compIdx) { return m_alfCtuEnableFlag[compIdx].data(); }
+  short   *getAlfCtbFilterIndex() { return m_alfCtbFilterIndex.data(); }
+  uint8_t *getAlfCtuAlternativeData(int compIdx) { return m_alfCtuAlternative[compIdx].data(); }
 };
 
 int calcAndPrintHashStatus(const CPelUnitBuf& pic, const class SEIDecodedPictureHash* pictureHashSEI, const BitDepths &bitDepths, const MsgLevel msgl);
diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp
index c443d2f811..7f53c8165c 100644
--- a/source/Lib/DecoderLib/DecLib.cpp
+++ b/source/Lib/DecoderLib/DecLib.cpp
@@ -199,23 +199,7 @@ bool tryDecodePicture( Picture* pcEncPic, const int expectedPoc, const std::stri
 
                   if (pic->cs->sps->getALFEnabledFlag())
                   {
-                    std::copy(pic->getAlfCtbFilterIndexVec().begin(), pic->getAlfCtbFilterIndexVec().end(),
-                              pcEncPic->getAlfCtbFilterIndexVec().begin());
-                    for (int compIdx = 0; compIdx < MAX_NUM_COMPONENT; compIdx++)
-                    {
-                      std::copy(pic->getAlfCtuEnableFlag()[compIdx].begin(), pic->getAlfCtuEnableFlag()[compIdx].end(),
-                                pcEncPic->getAlfCtuEnableFlag()[compIdx].begin());
-                    }
-                    pcEncPic->resizeAlfCtbFilterIndex(pic->cs->pcv->sizeInCtus);
-                    memcpy(pcEncPic->getAlfCtbFilterIndex(), pic->getAlfCtbFilterIndex(),
-                           sizeof(short) * pic->cs->pcv->sizeInCtus);
-
-                    std::copy(pic->getAlfCtuAlternative(COMPONENT_Cb).begin(),
-                              pic->getAlfCtuAlternative(COMPONENT_Cb).end(),
-                              pcEncPic->getAlfCtuAlternative(COMPONENT_Cb).begin());
-                    std::copy(pic->getAlfCtuAlternative(COMPONENT_Cr).begin(),
-                              pic->getAlfCtuAlternative(COMPONENT_Cr).end(),
-                              pcEncPic->getAlfCtuAlternative(COMPONENT_Cr).begin());
+                    pcEncPic->copyAlfData(*pic);
 
                     for (int i = 0; i < pic->slices.size(); i++)
                     {
diff --git a/source/Lib/DecoderLib/DecSlice.cpp b/source/Lib/DecoderLib/DecSlice.cpp
index a14d5c9197..753f6dcdab 100644
--- a/source/Lib/DecoderLib/DecSlice.cpp
+++ b/source/Lib/DecoderLib/DecSlice.cpp
@@ -98,9 +98,7 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb
 
   if (slice->getFirstCtuRsAddrInSlice() == 0)
   {
-    cs.picture->resizeAlfCtuEnableFlag( cs.pcv->sizeInCtus );
-    cs.picture->resizeAlfCtbFilterIndex(cs.pcv->sizeInCtus);
-    cs.picture->resizeAlfCtuAlternative( cs.pcv->sizeInCtus );
+    cs.picture->resizeAlfData(cs.pcv->sizeInCtus);
   }
 
   const unsigned numSubstreams = slice->getNumberOfSubstreamSizes() + 1;
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index a12333733d..eaa857cca7 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -3108,9 +3108,7 @@ void EncGOP::compressGOP(int pocLast, int numPicRcvd, PicList &rcListPic, std::l
     // it is used for signalling during CTU mode decision, i.e. before ALF processing
     if( pcSlice->getSPS()->getALFEnabledFlag() )
     {
-      pcPic->resizeAlfCtuEnableFlag( numberOfCtusInFrame );
-      pcPic->resizeAlfCtuAlternative( numberOfCtusInFrame );
-      pcPic->resizeAlfCtbFilterIndex(numberOfCtusInFrame);
+      pcPic->resizeAlfData(numberOfCtusInFrame);
     }
 
     bool decPic = false;
-- 
GitLab