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