diff --git a/source/Lib/CommonLib/CodingStructure.cpp b/source/Lib/CommonLib/CodingStructure.cpp index 4d33034d59a138cb37ab21246622f3acbf6b44bd..cdd826d76c95822b277d94ee9d469bcf4ab68ab9 100644 --- a/source/Lib/CommonLib/CodingStructure.cpp +++ b/source/Lib/CommonLib/CodingStructure.cpp @@ -190,9 +190,25 @@ void CodingStructure::setDecomp(const UnitArea &_area, const bool _isCoded /*= t const int CodingStructure::signalModeCons( const PartSplit split, Partitioner &partitioner, const ModeType modeTypeParent ) const { - if( CS::isDualITree( *this ) || modeTypeParent != MODE_TYPE_ALL || partitioner.currArea().chromaFormat == CHROMA_444 ) +#if JVET_P0406_YUV_FMT_GENERALIZATION_LDT + if (CS::isDualITree(*this) || modeTypeParent != MODE_TYPE_ALL || partitioner.currArea().chromaFormat == CHROMA_444 || partitioner.currArea().chromaFormat == CHROMA_400 ) +#else + if (CS::isDualITree(*this) || modeTypeParent != MODE_TYPE_ALL || partitioner.currArea().chromaFormat == CHROMA_444 ) +#endif return LDT_MODE_TYPE_INHERIT; - +#if JVET_P0406_YUV_FMT_GENERALIZATION_LDT + int minLumaArea = partitioner.currArea().lumaSize().area(); + if (split == CU_QUAD_SPLIT || split == CU_TRIH_SPLIT || split == CU_TRIV_SPLIT) // the area is split into 3 or 4 parts + { + minLumaArea = minLumaArea >> 2; + } + else if (split == CU_VERT_SPLIT || split == CU_HORZ_SPLIT) // the area is split into 2 parts + { + minLumaArea = minLumaArea >> 1; + } + int minChromaBlock = minLumaArea >> (getChannelTypeScaleX(CHANNEL_TYPE_CHROMA, partitioner.currArea().chromaFormat) + getChannelTypeScaleY(CHANNEL_TYPE_CHROMA, partitioner.currArea().chromaFormat)); + return minChromaBlock >= 16 ? LDT_MODE_TYPE_INHERIT : ((minLumaArea < 32) || slice->isIntra()) ? LDT_MODE_TYPE_INFER : LDT_MODE_TYPE_SIGNAL; +#else int width = partitioner.currArea().lwidth(); int height = partitioner.currArea().lheight(); @@ -214,6 +230,7 @@ const int CodingStructure::signalModeCons( const PartSplit split, Partitioner &p { return LDT_MODE_TYPE_INHERIT; } +#endif } void CodingStructure::clearCuPuTuIdxMap( const UnitArea &_area, uint32_t numCu, uint32_t numPu, uint32_t numTu, uint32_t* pOffset ) diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 76b56798687c40f695eea4b255a5ee8853cfbbf7..2351ba30dd3a2375e8cea2b05e2a97ae54353d2e 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -58,6 +58,8 @@ #define JVET_P0325_CHANGE_MERGE_CANDIDATE_ORDER 1 // JVET-P0325: reorder the spatial merge candidates +#define JVET_P0406_YUV_FMT_GENERALIZATION_LDT 1 // JVET-P0406: Generalization of local dual tree (LDT) for different YUV formats + #define JVET_P0578_MINIMUM_CU_SIZE_CONSTRAINT 1 // JVET-P0578: minimum CU size constraint #define JVET_P0091_REMOVE_BDOF_OFFSET_SHIFT 1 // JVET-P0091: Align sample offset calculation of BDOF and PROF