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