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

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)

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

Note: See TracTickets for help on using tickets.