From eee5b5dbda7bfc8d5edefd2c0f2ca24c8126f1fa Mon Sep 17 00:00:00 2001
From: Kenneth Andersson <kenneth.r.andersson@ericsson.com>
Date: Thu, 2 Mar 2023 14:56:03 +0100
Subject: [PATCH] Fix: Related to HashME and sequential coding

---
 source/App/EncoderApp/EncApp.cpp |  5 ++++-
 source/Lib/EncoderLib/EncCfg.h   | 12 ++++++++++++
 source/Lib/EncoderLib/EncGOP.cpp | 24 ++++++++++++++++++++++--
 3 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp
index b2be5304f..737e30fe6 100644
--- a/source/App/EncoderApp/EncApp.cpp
+++ b/source/App/EncoderApp/EncApp.cpp
@@ -771,7 +771,10 @@ void EncApp::xInitLibCfg( int layerIdx )
   m_cEncLib.setUseCiip                                        ( m_ciip );
   m_cEncLib.setUseGeo                                            ( m_Geo );
   m_cEncLib.setUseHashME                                         ( m_HashME );
-
+  m_cEncLib.setUseHashMECfgEnable                                (m_HashME);
+  m_cEncLib.setUseHashMEPOCChecked                               (false);
+  m_cEncLib.setUseHashMEPOCToCheck                               (0);
+  m_cEncLib.setUseHashMENextPOCToCheck                           (0);
   m_cEncLib.setAllowDisFracMMVD                                  ( m_allowDisFracMMVD );
   m_cEncLib.setUseAffineAmvr                                     ( m_AffineAmvr );
   m_cEncLib.setUseAffineAmvrEncOpt                               ( m_AffineAmvrEncOpt );
diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h
index f8d01e75c..3b669f4f5 100644
--- a/source/Lib/EncoderLib/EncCfg.h
+++ b/source/Lib/EncoderLib/EncCfg.h
@@ -362,6 +362,10 @@ protected:
   bool      m_allowDisFracMMVD;
   bool      m_AffineAmvr;
   bool      m_HashME;
+  bool      m_HashMECfgEnable;
+  int       m_HashMEPOC;
+  bool      m_HashMEPOCchecked;
+  int       m_HashMEPOC2;
   bool      m_AffineAmvrEncOpt;
   bool      m_AffineAmvp;
   bool      m_DMVR;
@@ -1472,6 +1476,14 @@ public:
   bool      getAllowDisFracMMVD             ()         const { return m_allowDisFracMMVD; }
   void      setUseHashME                    ( bool b )       { m_HashME = b; }
   bool      getUseHashME                    ()         const { return m_HashME; }
+  void      setUseHashMECfgEnable           (bool b) { m_HashMECfgEnable = b; }
+  bool      getUseHashMECfgEnable           ()         const { return m_HashMECfgEnable; }
+  void      setUseHashMEPOCToCheck          (int thePOCtoCheck) { m_HashMEPOC = thePOCtoCheck; }
+  int       getUseHashMEPOCToCheck          () { return m_HashMEPOC; }
+  void      setUseHashMEPOCChecked          (bool thePOCChecked) { m_HashMEPOCchecked = thePOCChecked; }
+  bool      getUseHashMEPOCChecked          () { return m_HashMEPOCchecked; }
+  void      setUseHashMENextPOCToCheck      (int thePOCtoCheck) { m_HashMEPOC2 = thePOCtoCheck; }
+  int       getUseHashMENextPOCToCheck      () { return m_HashMEPOC2; }
   void      setUseAffineAmvr                ( bool b )       { m_AffineAmvr = b;    }
   bool      getUseAffineAmvr                ()         const { return m_AffineAmvr; }
   void      setUseAffineAmvrEncOpt          ( bool b )       { m_AffineAmvrEncOpt = b;    }
diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp
index a52fb7a00..2afb8abc0 100644
--- a/source/Lib/EncoderLib/EncGOP.cpp
+++ b/source/Lib/EncoderLib/EncGOP.cpp
@@ -1947,10 +1947,12 @@ void EncGOP::xPicInitHashME( Picture *pic, const PPS *pps, PicList &rcListPic )
 
     if (refPic->poc != pic->poc && refPic->referenced)
     {
-      if (!refPic->getHashMap()->isInitial())
+      bool validPOC = ((refPic->getPOC() == m_pcCfg->getUseHashMEPOCToCheck()) && !m_pcCfg->getUseHashMEPOCChecked() && (pic->poc >= m_pcCfg->getUseHashMEPOCToCheck()));
+      if (!refPic->getHashMap()->isInitial() || validPOC)
       {
-        if (refPic->getPOC() == 0)
+        if (validPOC)
         {
+          m_pcCfg->setUseHashMEPOCChecked(true);
           Pel* picSrc = refPic->getOrigBuf().get(COMPONENT_Y).buf;
           ptrdiff_t stridePic = refPic->getOrigBuf().get(COMPONENT_Y).stride;
           int picWidth = refPic->lwidth();
@@ -2793,6 +2795,24 @@ void EncGOP::compressGOP(int pocLast, int numPicRcvd, PicList &rcListPic, std::l
       CU::checkConformanceILRP(pcSlice);
     }
 
+    if (m_pcCfg->getUseHashMEPOCChecked())
+    {
+      if (pcPic->getPOC() > m_pcCfg->getUseHashMENextPOCToCheck())
+      {
+        if (m_pcCfg->getUseHashMEPOCToCheck() != m_pcCfg->getUseHashMENextPOCToCheck())
+        {
+          // now can we move the new intra poc in slot 2 to the active slot
+          m_pcCfg->setUseHashMEPOCToCheck(m_pcCfg->getUseHashMENextPOCToCheck());
+          m_pcCfg->setUseHashMEPOCChecked(false);
+          m_pcCfg->setUseHashME(m_pcCfg->getUseHashMECfgEnable()); // initialize hashME for next intra picture
+        }
+      }
+    }
+    if (pcSlice->isIntra())
+    {
+      // in-case the previous intra not has been checked we need to put the new intra poc in another slot
+      m_pcCfg->setUseHashMENextPOCToCheck(pcSlice->getPOC());
+    }
     xPicInitHashME( pcPic, pcSlice->getPPS(), rcListPic );
 
     if (m_pcCfg->getUseAMaxBT())
-- 
GitLab