Opened 4 years ago
Closed 4 years ago
#887 closed defect (fixed)
SW/Spec mismatch on CclmEnable
Reported by: | hobingzhang | Owned by: | |
---|---|---|---|
Priority: | minor | Milestone: | |
Component: | spec | Version: | |
Keywords: | CclmEnable | Cc: | ksuehring, bbross, XiangLi, fbossen, jvet@…, jvet@… |
Description
In the current spec Q-2001vC, the luma conditions (When CclmEnabled is equal to 1 ) are constrainedly checked when cclmEnable equal to 1 finally.
8.4.4 cross-component chroma intra prediction mode checking process If sps_cclm_enabled_flag is equal to 0, CclmEnabled is set equal to 0. Otherwise, if one or more of the following conditions are true, CclmEnabled is set equal to 1: qtbtt_dual_tree_intra_flag is equal to 0. slice_type is not equal to I. CtbLog2SizeY is less than 6. Otherwise the following applies: If one or more of the following conditions are true, the variable CclmEnabled is set equal to 1: CbWidth[ 1 ][ xCb64 ][ yCb64 ] is equal to 64 and CbHeight[ 1 ][ xCb64 ][ yCb64 ] is equal to 64. CqtDepth[ 1 ][ xCb64 ][ yCb64 ] is equal to CtbLog2SizeY − 6, MttSplitMode[ xCb64 ][ yCb64 ][ 0 ] is equal to SPLIT_BT_HOR, CbWidth[ 1 ][ xCb64 ][ yCb32 ] is equal to 64 and CbHeight[ 1 ][ xCb64 ][ yCb32 ] is equal to 32. CqtDepth[ 1 ][ xCb64 ][ yCb64 ] is greater than CtbLog2SizeY − 6. CqtDepth[ 1 ][ xCb64 ][ yCb64 ] is equal to CtbLog2SizeY − 6, MttSplitMode[ xCb64 ][ yCb64 ][ 0 ] is equal to SPLIT_BT_HOR, and MttSplitMode[ xCb64 ][ yCb32 ][ 1 ] is equal to SPLIT_BT_VER. Otherwise, the variable CclmEnabled is set equal to 0. When CclmEnabled is equal to 1 and one of the following conditions is true, CclmEnabled is set equal to 0: CbWidth[ 0 ][ xCb64 ][ yCb64 ] and CbHeight[ 0 ][ xCb64 ][ yCb64 ] are both equal to 64, and intra_subpartitions_mode_flag[ xCb64 ][ yCb64 ] is equal to 1. CbWidth[ 0 ][ xCb64 ][ yCb64 ] or CbHeight[ 0 ][ xCb64 ][ yCb64 ] is less than 64, and CqtDepth[ 0 ][ xCb64 ][ yCb64 ] is equal to CtbLog2SizeY − 6.
Meanwhile, the luma condition is checked in software when CclmEnable equal to 1 only for dual tree, CTU size 64 and 128 case.
const bool CodingUnit::checkCCLMAllowed() const { ... else //dual tree, CTU size 64 or 128 { ... //further check luma conditions if( allowCCLM ) { const CodingUnit* colLumaCu = cs->picture->cs->getCU( lumaRefPos, CHANNEL_TYPE_LUMA ); if( colLumaCu->lwidth() < 64 || colLumaCu->lheight() < 64 ) //further split at 64x64 luma node { const PartSplit cuSplitTypeDepth1Luma = CU::getSplitAtDepth( *colLumaCu, depthFor64x64Node ); CHECK( !(cuSplitTypeDepth1Luma >= CU_QUAD_SPLIT && cuSplitTypeDepth1Luma <= CU_TRIV_SPLIT), "split mode shall be BT, TT or QT" ); if( cuSplitTypeDepth1Luma != CU_QUAD_SPLIT ) { allowCCLM = false; } } else if( colLumaCu->lwidth() == 64 && colLumaCu->lheight() == 64 && colLumaCu->ispMode ) //not split at 64x64 luma node and use ISP mode { allowCCLM = false; } } } return allowCCLM; }
It seems that the indention is missing on luma condition part in spec. The luma condition should be under "Otherwise the following applies".
Suggestion: Aligning spec with software.
Change history (4)
comment:1 Changed 4 years ago by chiaming
comment:2 Changed 4 years ago by zhaoyin
I think Chia-Ming's suggestion for spec fix in comment 1 is correct. Sorry for the late reply.
The indentation of the last paragraph (i.e., the luma condition marked by the strikethrough in comment 1) is wrong, as mentioned in #706 (however the issue has been closed). Because if one or more of the following conditions are true (which means not in the dual tree I slice with CTU size >= 64 case), CclmEnabled is set equal to 1, and no need to further check the luma conditions.
– qtbtt_dual_tree_intra_flag is equal to 0.
– slice_type is not equal to I.
– CtbLog2SizeY is less than 6.
Both ways of the suggested fix in #706 work. The second way seems to make the spec more concise.
comment:3 Changed 4 years ago by jangwon.choi
Current VVC spec and software (VVC draft 9 and VTM9.0) still have the mismatch problem raised in this ticket.
Considering the original intention of CCLM enable conditions, I believe that the solution of Chia-Ming's suggestion seems reasonable.
Or, if someone want to solve this mismatch problem with the minimal spec change, it can be modified as:
– Otherwise the following applies:
– The variables xCb64, yCb64, yCb32 are derived as follows:
xCb64 = ( xCb >> 6) << 6 (238)
yCb64 = ( yCb >> 6 ) << 6 (239)
yCb32 = ( yCb >> 5 ) << 5 (240)
– If one or more of the following conditions are true, the variable CclmEnabled is set equal to 1:
– CbWidth[ 1 ][ xCb64 ][ yCb64 ] is equal to 64 and CbHeight[ 1 ][ xCb64 ][ yCb64 ] is equal to 64.
– CqtDepth[ 1 ][ xCb64 ][ yCb64 ] is equal to CtbLog2SizeY − 6, MttSplitMode[ xCb64 ][ yCb64 ][ 0 ] is equal to SPLIT_BT_HOR, CbWidth[ 1 ][ xCb64 ][ yCb32 ] is equal to 64 and CbHeight[ 1 ][ xCb64 ][ yCb32 ] is equal to 32.
– CqtDepth[ 1 ][ xCb64 ][ yCb64 ] is greater than CtbLog2SizeY − 6.
– CqtDepth[ 1 ][ xCb64 ][ yCb64 ] is equal to CtbLog2SizeY − 6, MttSplitMode[ xCb64 ][ yCb64 ][ 0 ] is equal to SPLIT_BT_HOR, and MttSplitMode[ xCb64 ][ yCb32 ][ 1 ] is equal to SPLIT_BT_VER.
– Otherwise, the variable CclmEnabled is set equal to 0.
– When CclmEnabled is equal to 1 and one of the following conditions is true, CclmEnabled is set equal to 0:
– CbWidth[ 0 ][ xCb64 ][ yCb64 ] and CbHeight[ 0 ][ xCb64 ][ yCb64 ] are both equal to 64, and intra_subpartitions_mode_flag[ xCb64 ][ yCb64 ] is equal to 1.
– CbWidth[ 0 ][ xCb64 ][ yCb64 ] or CbHeight[ 0 ][ xCb64 ][ yCb64 ] is less than 64, and CqtDepth[ 0 ][ xCb64 ][ yCb64 ] is equal to CtbLog2SizeY − 6.
comment:4 Changed 4 years ago by bbross
- Resolution set to fixed
- Status changed from new to closed
Thanks for reporting and confirming!
This will be fixed as suggested by Jangwon in the first version of D10.
The same issue had been reported in #706, but was not fixed into spec.
Suggest to fix the issue by using the (2) method in #706. For example:
8.4.4 cross-component chroma intra prediction mode checking process
...
– Otherwise the following applies:
When CclmEnabled is equal to 1 and one of the following conditions is true, CclmEnabled is set equal to 0:– CbWidth[ 0 ][ xCb64 ][ yCb64 ] and CbHeight[ 0 ][ xCb64 ][ yCb64 ] are both equal to 64, and intra_subpartitions_mode_flag[ xCb64 ][ yCb64 ] is equal to 1.
– CbWidth[ 0 ][ xCb64 ][ yCb64 ] or CbHeight[ 0 ][ xCb64 ][ yCb64 ] is less than 64, and CqtDepth[ 0 ][ xCb64 ][ yCb64 ] is equal to CtbLog2SizeY − 6.