Opened 11 months ago

Closed 2 weeks ago

#440 closed defect (fixed)

Issue on cu_skip_flag

Reported by: wangyang.cs Owned by:
Priority: blocker Milestone: VVC D10
Component: spec Version: VVC D9 vB
Keywords: cu_skip_flag, IBC CU size Cc: ksuehring, bbross, XiangLi, fbossen, jvet@…, jvet@…, wangyang.cs@…

Description

There is one issue on cu_skip_flag in current VVC draft (JVET-O2001-vE). In the draft described below, when (slice_type == I && treeType == SINGLE_TREE && sps_ibc_enabled_flag == 1 && (cbWidth > 64
cbHeight > 64), cu_skip_flag will be parsed.

7.3.8.5 Coding unit syntax
coding_unit( x0, y0, cbWidth, cbHeight, cqtDepth, treeType, modeType ) {

chType = treeType = = DUAL_TREE_CHROMA? 1 : 0
if( slice_type != I | | sps_ibc_enabled_flag | | sps_palette_enabled_flag) {

if( treeType != DUAL_TREE_CHROMA &&

!( ( ( cbWidth = = 4 && cbHeight = = 4 ) | | modeType = = MODE_TYPE_INTRA )

&& !sps_ibc_enabled_flag ) )

cu_skip_flag[ x0 ][ y0 ]


However, largest IBC luma CU size has been limited to 64x64.
The modified draft is described as follows:


7.3.8.5 Coding unit syntax
coding_unit( x0, y0, cbWidth, cbHeight, cqtDepth, treeType, modeType ) {

chType = treeType = = DUAL_TREE_CHROMA? 1 : 0
if( slice_type != I | | sps_ibc_enabled_flag | | sps_palette_enabled_flag) {

if( treeType != DUAL_TREE_CHROMA &&

!( ( ( cbWidth = = 4 && cbHeight = = 4 ) | | modeType = = MODE_TYPE_INTRA )

&& !(sps_ibc_enabled_flag && cbWidth <= 64 && cbHeight <= 64 ) ) )

cu_skip_flag[ x0 ][ y0 ]


Change history (18)

comment:1 Changed 11 months ago by wangyang.cs

  • Cc wangyang.cs@… added
  • Priority changed from major to minor

comment:2 follow-up: Changed 11 months ago by hmjang

This Ticket handles same issue on #325.
But, the proposed condition seems not handle some eceptional case.
For example, when the case is that current slice is I-Slice, current block is 128x128 and sps_ibc_enabled_flag is equal to 0. for this case cu_skip_flag is not needed to signal.

but, by the proposed condition in this ticket, cu_skip_flag is signaled.

It should be confirmed by reporter.

comment:3 in reply to: ↑ 2 Changed 11 months ago by wangyang.cs

In the case of I-slice, modeType is equal to MODE_TYPE_INTRA, cu_skip_flag is not signaled in the proposed condition.

comment:4 follow-up: Changed 11 months ago by hmjang

Thank you for the feedback.

I agree that cu_skip_flag is not need to signal when modeType is equal to MODE_TYPE_INTRA. But, I-Slice itself does not mean MODE_TYPE_INTRA. if My understanding is correct, the modeType of 128x128(CTU) block in I-Slice(Single Tree and Dual tree) might be set equal to MODE_TYPE_ALL and it is defined by modeTypeCondition and mode_constraint_flag for SCIPU case.

Hence, the cu_skip_flag could be signalled for 128x128 block which is in I-Slice by the proposed condition in this ticket.

If we keep the condition in this ticket, MODE_TYPE_ALL for I-Slice should be changed to MODE_TYPE_INTRA. It seems reasonable.

Otherwise, the condition should be described as below in order to handle all case.

if( treeType != DUAL_TREE_CHROMA &&

((slice_type != I && ( sps_ibc_enabled_flag | | !( ( cbWidth = = 4 && cbHeight = = 4 ) | | modeType = = MODE_TYPE_INTRA ))) | |
(slice_type == I && sps_ibc_enabled_flag && cbWidth <=64 && cbHeight <= 64)))

comment:5 in reply to: ↑ 4 Changed 11 months ago by wangyang.cs

I agree.

In my opinion, sps_palette_enabled_flag makes it complicated when parsing cu_skip_flag. sps_palette_enabled_flag has nothing to do with cu_skip_flag, pred_mode_flag, and pred_mode_ibc_flag.

How about putting pred_mode_plt_flag outside if( slice_type != I | | sps_ibc_enabled_flag | | sps_palette_enabled_flag)?

Thus, the case of I-slice, sps_ibc_enabled_flag is equal to 0 won't meet the condition any more.

comment:6 Changed 11 months ago by wangyang.cs

It is recommended to change the syntax table as follows:

if( slice_type != I | | sps_ibc_enabled_flag | | sps_palette_enabled_flag) {

if( treeType != DUAL_TREE_CHROMA &&

!( ( ( cbWidth = = 4 && cbHeight = = 4 ) | | modeType = = MODE_TYPE_INTRA )
&& !(sps_ibc_enabled_flag && cbWidth <=64 && cbHeight <= 64) ) )
cu_skip_flag[ x0 ][ y0 ]

if( cu_skip_flag[ x0 ][ y0 ] = = 0 && slice_type != I

&& !( cbWidth = = 4 && cbHeight = = 4 ) && modeType = = MODE_TYPE_ALL )
pred_mode_flag

if( ( ( slice_type = = I && cu_skip_flag[ x0 ][ y0 ] = =0 ) | |

( slice_type != I && ( CuPredMode[ chType ][ x0 ][ y0 ] != MODE_INTRA | |
( cbWidth = = 4 && cbHeight = = 4 && cu_skip_flag[ x0 ][ y0 ] = = 0 ) ) ) ) &&
cbWidth <= 64 && cbHeight <= 64 && modeType != MODE_TYPE_INTER &&
sps_ibc_enabled_flag && treeType != DUAL_TREE_CHROMA )
pred_mode_ibc_flag

}
if( ( ( ( slice_type = = I | | ( cbWidth = = 4 && cbHeight = = 4 ) | | sps_ibc_enabled_flag ) &&

CuPredMode[ x0 ][ y0 ] = = MODE_INTRA ) | |
( slice_type != I && !( cbWidth = = 4 && cbHeight = = 4 ) && !sps_ibc_enabled_flag
&& CuPredMode[ x0 ][ y0 ] != MODE_INTRA ) ) && sps_palette_enabled_flag &&
cbWidth <= 64 && cbHeight <= 64 && && cu_skip_flag[ x0 ][ y0 ] = = 0 &&
modeType != MODE_INTER )
pred_mode_plt_flag

comment:7 Changed 10 months ago by bbross

Ticket #325 has been marked as a duplicate of this ticket.

comment:8 Changed 10 months ago by bbross

Thanks for bringing up this issues and proposing potential solutions.
In order to address this issues, I would like to know:
a) How is it done in VTM? Is there a mismatch?
b) If I understand it correctly, the issue is that a skip flag equal to 1 would be allowed for intra CUs > 64x64 since IBC is not allowed for these CUs but allows the signalling of the skip flag, correct?

comment:9 Changed 10 months ago by wangyang.cs

Thanks for your comments.
a) Yes, there is a mismatch. In VTM, cu_skip_flag is not signaled for intra CUs > 64x64 in I slice. Spec should be corrected.
b) That's exactly what I mean. There is no need to signal cu_skip_flag for CUs > 64x64 in I slice.

comment:10 Changed 8 months ago by bbross

  • Version changed from VVC D6 vE to VVC D7 vC

comment:11 Changed 8 months ago by bbross

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

Thanks for reporting.

This will be fixed as suggested in JVET-P2001-vD with the following modifications:

change:
!(
( ( cbWidth = = 4 && cbHeight = = 4 ) | | modeType = = MODE_TYPE_INTRA )
&& !(sps_ibc_enabled_flag && cbWidth <=64 && cbHeight <= 64)
)
to
( !( cbWidth = = 4 && cbHeight = = 4 ) && modeType != MODE_TYPE_INTRA )
| | (sps_ibc_enabled_flag && cbWidth <=64 && cbHeight <= 64)

2.
I think the additional conditions for pred_mode_plt_flag are not necessary and already covered by CuPredMode == MODE_INTRA:
a)

( slice_type = = I | | ( cbWidth = = 4 && cbHeight = = 4 ) | | sps_ibc_enabled_flag ) &&
CuPredMode[ x0 ][ y0 ] = = MODE_INTRA

In case slice_type != I && !( cbWidth = = 4 && cbHeight = = 4 ) && !sps_ibc_enabled_flag
pred_mode_flag can be parsed as MODE_INTRA which should still allow to parse pred_mode_plt_flag.
b)

slice_type != I && !( cbWidth = = 4 && cbHeight = = 4 ) && !sps_ibc_enabled_flag && CuPredMode[ chType ][ x0 ][ y0 ] != MODE_INTRA

In case slice_type != I&& !( cbWidth = = 4 && cbHeight = = 4 ) && !sps_ibc_enabled_flag
CuPredMode is only not set equal to MODE_INTRA if

i.) skip_flag is equal to 1 -> no plt
ii.) pred_mode_flag is parsed as MODE_INTER -> no plt

Hence I just kept the condition CuPredMode[chType][x0][y0] == MODE_INTRA which should be sufficient.

comment:12 Changed 6 months ago by forayr

  • Resolution fixed deleted
  • Status changed from closed to reopened

I think there is still an issue in the spec.
Indeed, when treeType == SINGLE_TREE, slice_type == I_SLICE, cbWidth == 128 and cbHeight == 128,
and split_cu_flag is equal to 0, coding_unit() is called with modeType == MODE_TYPE_ALL.
If sps_ibc_enabled_flag == 1, cu_skip_flag is parsed whereas cbWidth == 128 and cbHeight == 128.

This is not the case in the VTM, and according to the comment above this should not be the case.

Maybe coding_tree() should be called with parameters modeTypeCurr = MODE_TYPE_INTRA when slice_type == I_SLICE.

comment:13 Changed 6 months ago by axink

I see the illegal case reported about signaling of cu_skip_flag when the following combination is present:
--sps_ibc_enabled_flag=1
--slice_type == I_SLICE
--cbWidth > 64 or cbHeight > 64

One method mentioned above can be used to resolve this issue:
In coding_tree() syntax, before calling coding_unit() syntax, add the following:
if ((cbWidth > 64 | | cbHeight > 64 ) && slice_type == I_SLICE )

modeTypeCurr = MODE_TYPE_INTRA

Alternatively, in coding_unit() syntax, when slice_type is equal to I_SLICE, adding block size constraint into the signaling conditions of cu_skip_flag signaling could resolve this issue. However, the existing conditions are already pretty complex. I would prefer the the above solution over changing the coding_unit() syntax.

Xiaozhong

comment:14 Changed 6 months ago by hmjang

I also see the same problem on this.
the main reason for this issue is that CUs in I-Slice, or 4x4 CU can be defined as MODE_TYPE_ALL for exceptional case in the SPEC. These blocks disallow inter prediction mode in VVC. hence it could be define as MODE_TYPE_INTRA.

as proposed in JVET-Q0354, it is suggested to define 4x4 CU and CUs in I-Slice as MODE_TYPE_INTRA.

Last edited 6 months ago by hmjang (previous) (diff)

comment:15 Changed 6 months ago by bbross

  • Version changed from VVC D7 vC to VVC D8 vB

comment:16 Changed 2 weeks ago by bbross

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

comment:17 Changed 2 weeks ago by axink

I think this ticket was resolved by the adoption of JVET-R0311.

Xiaozhong

comment:18 Changed 2 weeks ago by bbross

  • Resolution set to fixed
  • Status changed from reopened to closed
Note: See TracTickets for help on using tickets.