Opened 13 months ago

Closed 8 months ago

#845 closed defect (fixed)

Issue on modeTypeCondition derivation

Reported by: forayr Owned by:
Priority: blocker Milestone: VVC D10
Component: spec Version: VVC D9 vB
Keywords: Cc: ksuehring, bbross, XiangLi, fbossen, jvet@…

Description

As MttSplitMode[][][] is derived only when split_qt_flag == 0, modeTypeCondition should check its value only when split_qt_flag == 0.
Without this change, there is a mismatch between the spec and the VTM behaviour.

The specification should become:

The variable modeTypeCondition is derived as follows:
• If one or more of the following conditions are true, modeTypeCondition is set equal to 0:
    • slice_type is equal to I and qtbtt_dual_tree_intra_flag is equal to 1.
    • modeTypeCurr is not equal to MODE_TYPE_ALL.
    • chroma_format_idc is equal to 0.
    • chroma_format_idc is equal to 3.
• Otherwise, if one of the following conditions is true, modeTypeCondition is set equal to 1:
    • cbWidth * cbHeight is equal to 64 and split_qt_flag is equal to 1.
-   • cbWidth * cbHeight is equal to 64 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_TT_HOR or SPLIT_TT_VER.
-   • cbWidth * cbHeight is equal to 32 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_BT_HOR or SPLIT_BT_VER.
+   • cbWidth * cbHeight is equal to 64 and split_qt_flag == 0 && MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_TT_HOR or SPLIT_TT_VER.
+   • cbWidth * cbHeight is equal to 32 and split_qt_flag == 0 && MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_BT_HOR or SPLIT_BT_VER.

Change history (7)

comment:1 Changed 13 months ago by forayr

  • Milestone VVC D7 vC deleted
  • Version set to VVC D8 vB

comment:2 Changed 8 months ago by bbross

  • Milestone set to VVC D10
  • Version changed from VVC D8 vB to VVC D9 vB

Thanks for bringing that up.

After checking this, I have the following comments/questions:
1.
Regarding
MttSplitMode[][][] is derived only when split_qt_flag == 0
Actually it is derived based on mtt_split_cu_vertical_flag and mtt_split_cu_binary_flag, both are inferred if not present (e.g. when split_qt_flag == 1).
Hence it is derived but I cannot really see whether the derived values in that case makes sense in the context of deriving modeTypeCondition.
2.
There is a second "Otherwise" part in the derivation of modeTypeCondition that evaluates MttSplitMode[][][]. How is that impacted?
3.
What is the value of modeTypeCondition supposed to be in case of split_qt_flag==1?
Maybe it makes sense to add a condition on split_qt_flag and set modeTypeCondition accordingly?

comment:3 Changed 8 months ago by forayr

  1. Right, there is an inference on these value, but the modeTypeCondition derived using this infered value might not match the vtm
  2. I just check and there is an issue in my proposed fix. The described issue is present only for 2 last conditions on the last otherwise. One fix might be:
    The variable modeTypeCondition is derived as follows:
    • If one or more of the following conditions are true, modeTypeCondition is set equal to 0:
        • slice_type is equal to I and qtbtt_dual_tree_intra_flag is equal to 1.
        • modeTypeCurr is not equal to MODE_TYPE_ALL.
        • chroma_format_idc is equal to 0.
        • chroma_format_idc is equal to 3.
    • Otherwise, if one of the following conditions is true, modeTypeCondition is set equal to 1:
        • cbWidth * cbHeight is equal to 64 and split_qt_flag is equal to 1.
        • cbWidth * cbHeight is equal to 64 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_TT_HOR or SPLIT_TT_VER.
        • cbWidth * cbHeight is equal to 32 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_BT_HOR or SPLIT_BT_VER.
    • Otherwise, if one of the following conditions is true, modeTypeCondition is set equal to 1 + (sh_slice_type  !=  I ?1:0):
        • cbWidth*cbHeight is equal to 64 and MttSplitMode[x0][y0][mttDepth] is equal to SPLIT_BT_HOR orSPLIT_BT_VER and sps_chroma_format_idc is equal to 1.
        • cbWidth*cbHeight is equal to 128 and MttSplitMode[x0][y0][mttDepth] is equal to SPLIT_TT_HOR orSPLIT_TT_VER and sps_chroma_format_idc is equal to 1.
    -   • cbWidth is equal to 8 and MttSplitMode[x0][y0][mttDepth] is equal to SPLIT_BT_VER.
    -   • cbWidth is equal to 16 and MttSplitMode[x0][y0][mttDepth] is equal to SPLIT_TT_VER.
    +   • cbWidth is equal to 8 and split_qt_flag == 0 and MttSplitMode[x0][y0][mttDepth] is equal to SPLIT_BT_VER.
    +   • cbWidth is equal to 16 and split_qt_flag == 0 and MttSplitMode[x0][y0][mttDepth] is equal to SPLIT_TT_VER.
    • Otherwise, modeTypeCondition is set equal to 0.
    

comment:4 Changed 8 months ago by bbross

  • Priority changed from minor to blocker

comment:5 Changed 8 months ago by bbross

Agreed solution after offline discussion (thanks to Jianle, Frank and Peter for looking into this):

The variable modeTypeCondition is derived as follows:
– If one or more of the following conditions are true, modeTypeCondition is set equal to 0:

– slice_type is equal to I and qtbtt_dual_tree_intra_flag is equal to 1.
– modeTypeCurr is not equal to MODE_TYPE_ALL.
– chroma_format_idc is equal to 0.
– chroma_format_idc is equal to 3.

– Otherwise, if one of the following conditions is true, modeTypeCondition is set equal to 1:

– cbWidth * cbHeight is equal to 64 and split_qt_flag is equal to 1.
– cbWidth * cbHeight is equal to 64, split_qt_flag is equal to 0, and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_TT_HOR or SPLIT_TT_VER.
– cbWidth * cbHeight is equal to 32 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_BT_HOR or SPLIT_BT_VER.

– Otherwise, if one or more of the following conditions is true, modeTypeCondition is set equal to 1 + ( sh_slice_type != I ? 1 : 0 ):

– cbWidth * cbHeight is equal to 64, split_qt_flag is equal to 0 , and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_BT_HOR or SPLIT_BT_VER and sps_chroma_format_idc is equal to 1.
– cbWidth * cbHeight is equal to 128 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_TT_HOR or SPLIT_TT_VER and sps_chroma_format_idc is equal to 1.
– cbWidth is equal to 8, split_qt_flag is equal to 0 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_BT_VER.
– cbWidth is equal to 16, split_qt_flag is equal to 0 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_TT_VER.

comment:6 Changed 8 months ago by bbross

Additional comment after discussion with Frank and Brian:

Due to the following condition:
– cbWidth * cbHeight is equal to 64 and split_qt_flag is equal to 1.
Adding "split_qt_flag equal to 0" in the the following conditions is redundant since for the values of cbWidth and cbHeight and split_qt_flag equal to 1, the condition above would kick in:
– cbWidth * cbHeight is equal to 64, split_qt_flag is equal to 0 , and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_BT_HOR or SPLIT_BT_VER and sps_chroma_format_idc is equal to 1.
– cbWidth is equal to 8, split_qt_flag is equal to 0 and MttSplitMode[ x0 ][ y0 ][ mttDepth ] is equal to SPLIT_BT_VER.

comment:7 Changed 8 months ago by bbross

  • Resolution set to fixed
  • Status changed from new to closed

This is fixed in JVET-S2001-v9 with messed up indent that will be fixed in vA.

Note: See TracTickets for help on using tickets.