From 3a7d15222e42d30f3954493a3ec2ea361ce9b00d Mon Sep 17 00:00:00 2001
From: Frank Bossen <fbossen@gmail.com>
Date: Wed, 13 Sep 2023 22:46:28 -0400
Subject: [PATCH] Add CU::canUseIbc function

---
 source/Lib/CommonLib/UnitTools.h      | 2 ++
 source/Lib/DecoderLib/CABACReader.cpp | 8 ++++----
 source/Lib/EncoderLib/CABACWriter.cpp | 8 ++++----
 source/Lib/EncoderLib/EncCu.cpp       | 9 ++++-----
 source/Lib/EncoderLib/EncModeCtrl.cpp | 3 +--
 5 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/source/Lib/CommonLib/UnitTools.h b/source/Lib/CommonLib/UnitTools.h
index 322b5456c..d50fb326a 100644
--- a/source/Lib/CommonLib/UnitTools.h
+++ b/source/Lib/CommonLib/UnitTools.h
@@ -113,6 +113,8 @@ namespace CU
   uint32_t  getISPSplitDim            ( const int width, const int height, const PartSplit ispType );
   bool      allLumaCBFsAreZero        ( const CodingUnit& cu );
 
+  inline bool canUseIbc(const UnitArea& a) { return a.lwidth() <= IBC_MAX_CU_SIZE && a.lheight() <= IBC_MAX_CU_SIZE; }
+
   PUTraverser traversePUs             (      CodingUnit& cu);
   TUTraverser traverseTUs             (      CodingUnit& cu);
   cPUTraverser traversePUs            (const CodingUnit& cu);
diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp
index 9dd2aa861..5ea3698be 100644
--- a/source/Lib/DecoderLib/CABACReader.cpp
+++ b/source/Lib/DecoderLib/CABACReader.cpp
@@ -944,7 +944,7 @@ void CABACReader::cu_skip_flag( CodingUnit& cu )
     cu.rootCbf = false;
     cu.predMode = MODE_INTRA;
     cu.mmvdSkip = false;
-    if (cu.lwidth() <= IBC_MAX_CU_SIZE && cu.lheight() <= IBC_MAX_CU_SIZE)   // disable IBC mode larger than 64x64
+    if (CU::canUseIbc(cu))
     {
       unsigned ctxId = DeriveCtx::CtxSkipFlag(cu);
       unsigned skip  = m_binDecoder.decodeBin(Ctx::SkipFlag(ctxId));
@@ -975,7 +975,7 @@ void CABACReader::cu_skip_flag( CodingUnit& cu )
   if (skip && cu.cs->slice->getSPS()->getIBCFlag())
   {
     // disable IBC mode larger than 64x64 and disable IBC when only allowing inter mode
-    if (cu.lwidth() <= IBC_MAX_CU_SIZE && cu.lheight() <= IBC_MAX_CU_SIZE && !cu.isConsInter())
+    if (CU::canUseIbc(cu) && !cu.isConsInter())
     {
       if ( cu.lwidth() == 4 && cu.lheight() == 4 )
       {
@@ -1113,7 +1113,7 @@ void CABACReader::pred_mode( CodingUnit& cu )
     if ( cu.cs->slice->isIntra() || ( cu.lwidth() == 4 && cu.lheight() == 4 ) || cu.isConsIntra() )
     {
       cu.predMode = MODE_INTRA;
-      if (cu.lwidth() <= IBC_MAX_CU_SIZE && cu.lheight() <= IBC_MAX_CU_SIZE)   // disable IBC mode larger than 64x64
+      if (CU::canUseIbc(cu))   // disable IBC mode larger than 64x64
       {
         unsigned ctxidx = DeriveCtx::CtxIBCFlag(cu);
         if (m_binDecoder.decodeBin(Ctx::IBCFlag(ctxidx)))
@@ -1145,7 +1145,7 @@ void CABACReader::pred_mode( CodingUnit& cu )
       else
       {
         cu.predMode = MODE_INTER;
-        if (cu.lwidth() <= IBC_MAX_CU_SIZE && cu.lheight() <= IBC_MAX_CU_SIZE)   // disable IBC mode larger than 64x64
+        if (CU::canUseIbc(cu))   // disable IBC mode larger than 64x64
         {
           unsigned ctxidx = DeriveCtx::CtxIBCFlag(cu);
           if (m_binDecoder.decodeBin(Ctx::IBCFlag(ctxidx)))
diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp
index e720e61b8..2c2663771 100644
--- a/source/Lib/EncoderLib/CABACWriter.cpp
+++ b/source/Lib/EncoderLib/CABACWriter.cpp
@@ -714,7 +714,7 @@ void CABACWriter::cu_skip_flag( const CodingUnit& cu )
 
   if ((cu.slice->isIntra() || cu.isConsIntra()) && cu.cs->slice->getSPS()->getIBCFlag())
   {
-    if (cu.lwidth() <= IBC_MAX_CU_SIZE && cu.lheight() <= IBC_MAX_CU_SIZE)   // disable IBC mode larger than 64x64
+    if (CU::canUseIbc(cu))   // disable IBC mode larger than 64x64
     {
       m_binEncoder.encodeBin((cu.skip), Ctx::SkipFlag(ctxId));
       DTRACE(g_trace_ctx, D_SYNTAX, "cu_skip_flag() ctx=%d skip=%d\n", ctxId, cu.skip ? 1 : 0);
@@ -735,7 +735,7 @@ void CABACWriter::cu_skip_flag( const CodingUnit& cu )
   if (cu.skip && cu.cs->slice->getSPS()->getIBCFlag())
   {
     // disable IBC mode larger than 64x64 and disable IBC when only allowing inter mode
-    if (cu.lwidth() <= IBC_MAX_CU_SIZE && cu.lheight() <= IBC_MAX_CU_SIZE && !cu.isConsInter())
+    if (CU::canUseIbc(cu) && !cu.isConsInter())
     {
       if ( cu.lwidth() == 4 && cu.lheight() == 4 )
       {
@@ -760,7 +760,7 @@ void CABACWriter::pred_mode( const CodingUnit& cu )
 
     if ( cu.cs->slice->isIntra() || ( cu.lwidth() == 4 && cu.lheight() == 4 ) || cu.isConsIntra() )
     {
-      if (cu.lwidth() <= IBC_MAX_CU_SIZE && cu.lheight() <= IBC_MAX_CU_SIZE)
+      if (CU::canUseIbc(cu))
       {
         unsigned ctxidx = DeriveCtx::CtxIBCFlag(cu);
         m_binEncoder.encodeBin(CU::isIBC(cu), Ctx::IBCFlag(ctxidx));
@@ -786,7 +786,7 @@ void CABACWriter::pred_mode( const CodingUnit& cu )
       }
       else
       {
-        if (cu.lwidth() <= IBC_MAX_CU_SIZE && cu.lheight() <= IBC_MAX_CU_SIZE)   // disable IBC mode larger than 64x64
+        if (CU::canUseIbc(cu))   // disable IBC mode larger than 64x64
         {
           unsigned ctxidx = DeriveCtx::CtxIBCFlag(cu);
           m_binEncoder.encodeBin(CU::isIBC(cu), Ctx::IBCFlag(ctxidx));
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index 9e4c4d51d..c703d1654 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -2466,10 +2466,9 @@ void EncCu::xCheckRDCostIBCModeMerge2Nx2N(CodingStructure *&tempCS, CodingStruct
 {
   CHECK(partitioner.chType == ChannelType::CHROMA, "chroma IBC is derived");
 
-  // don't use IBC for large CUs
-  if (tempCS->area.lwidth() > IBC_MAX_CU_SIZE || tempCS->area.lheight() > IBC_MAX_CU_SIZE)
+  if (!CU::canUseIbc(tempCS->area))
   {
-    return;
+    return;   // don't use IBC for large CUs
   }
 
   const SPS &sps = *tempCS->sps;
@@ -3373,9 +3372,9 @@ bool EncCu::prepareGpmComboList(const MergeCtx& mergeCtx, const UnitArea& localU
 
 void EncCu::xCheckRDCostIBCMode(CodingStructure *&tempCS, CodingStructure *&bestCS, Partitioner &partitioner, const EncTestMode& encTestMode)
 {
-  if (tempCS->area.lwidth() > IBC_MAX_CU_SIZE || tempCS->area.lheight() > IBC_MAX_CU_SIZE)
+  if (!CU::canUseIbc(tempCS->area))
   {
-    // disable IBC mode larger than 64x64
+    // skip IBC mode for blocks larger than 64x64
     return;
   }
 
diff --git a/source/Lib/EncoderLib/EncModeCtrl.cpp b/source/Lib/EncoderLib/EncModeCtrl.cpp
index a43bdd7d3..fd1b407df 100644
--- a/source/Lib/EncoderLib/EncModeCtrl.cpp
+++ b/source/Lib/EncoderLib/EncModeCtrl.cpp
@@ -1633,8 +1633,7 @@ bool EncModeCtrlMTnoRQT::tryMode( const EncTestMode& encTestmode, const CodingSt
   else if (encTestmode.type == ETM_IBC || encTestmode.type == ETM_IBC_MERGE)
   {
     // IBC MODES
-    return sps.getIBCFlag() && partitioner.currArea().lumaSize().width <= IBC_MAX_CU_SIZE
-           && partitioner.currArea().lumaSize().height <= IBC_MAX_CU_SIZE;
+    return sps.getIBCFlag() && CU::canUseIbc(partitioner.currArea());
   }
   else if( isModeInter( encTestmode ) )
   {
-- 
GitLab