Opened 5 years ago
Closed 5 years ago
#397 closed defect (fixed)
Mismatch with vtm on CclmEnabled derivation
Reported by: | forayr | Owned by: | |
---|---|---|---|
Priority: | minor | Milestone: | VVC D6 vE |
Component: | spec | Version: | |
Keywords: | Cc: | ksuehring, bbross, XiangLi, fbossen, jvet@… |
Description
The issue happens on a CU 64x64 split using SPLIT_TT_HOR mode, and gives 3 Cb (64x16, 64x32 and 64x16).
The specification indicate for the CclmEnabled dirivation:
- If one of the following conditions is 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. - 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.
For the 3rd Cb, we have:
- xCb = 0, yCb = 48
- xCb64 = 0, yCb64 = 0, yCb32 = 32.
- CbWidth[ 1 ][ xCb64 ][ yCb32 ] = 64
- CbHeight[ 1 ][ xCb64 ][ yCb32 ] = 32 (this is the size of the 2nd Cb)
Therefore CclmEnabled might be equal to 1 as this fulfilled the 2nd condition.
However in the vtm, this condition corresponds to
int depthFor64x64Node = slice->getSPS()->getCTUSize() == 128 ? 1 : 0; const PartSplit cuSplitTypeDepth1 = CU::getSplitAtDepth( *this, depthFor64x64Node ); const PartSplit cuSplitTypeDepth2 = CU::getSplitAtDepth( *this, depthFor64x64Node + 1 ); ... //allow CCLM if 64x32 chroma tree node uses NS and becomes a chroma CU containing 32x16 chroma blocks else if( cuSplitTypeDepth1 == CU_HORZ_SPLIT && cuSplitTypeDepth2 == CU_DONT_SPLIT ) { CHECK( !(blocks[COMPONENT_Cb].width == 32 && blocks[COMPONENT_Cb].height == 16), "chroma cu size shall be 32x16" ); allowCCLM = true; }
As cuSplitTypeDepth1 = CU_TRIH_SPLIT, the condition is not true and CclmEnabled is equal to 0.
Change history (6)
comment:1 Changed 5 years ago by zhaoyin
comment:2 Changed 5 years ago by forayr
There is also another mismatch on the condition from the specification
Otherwisse, if qtbtt_dual_tree_intra_flag is equal to 0 or CtbLog2SizeY is less than 6, CclmEnabled is set equal to 1.
The slice type is not take into account when checking qtbtt_dual_tree_intra_flag, whereas it is done when checking chType as in the vtm. With the current specification, we might check the other condition in an inter slice, and access to some data which are only filled on intra slice (CbWidth[1][][], CbHeight[1][][], ...).
I think the spec should either check the value of treeType :
Otherwise, if treeType is different from CHANNEL_TYPE_CHROMA or CtbLog2SizeY is less than 6, CclmEnabled is set equal to 1.
Or the value of slice_type :
Otherwise, if qtbtt_dual_tree_intra_flag is equal to 0 or slice_type is not equal to I or CtbLog2SizeY is less than 6, CclmEnabled is set equal to 1.
comment:3 Changed 5 years ago by bbross
- Version set to VVC D6 vD
comment:4 Changed 5 years ago by bbross
Will fix it for dE with the check on slice_type for the second mismatch.
comment:5 Changed 5 years ago by bbross
- Milestone changed from VVC D6 vD to VVC D6 vE
- Version VVC D6 vD deleted
comment:6 Changed 5 years ago by bbross
- Resolution set to fixed
- Status changed from new to closed
Fixed in DE
You are right. There is a bug on the 2nd condition, and it should be revised as follows:
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
(i.e., adding the first two checks of the 4th condition, to ensure the 32x32 chroma node is split with HBT)