Opened 5 years ago
Closed 4 years 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
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 5 years ago by wangyang.cs
- Cc wangyang.cs@… added
- Priority changed from major to minor
comment:2 follow-up: ↓ 3 Changed 5 years ago by hmjang
comment:3 in reply to: ↑ 2 Changed 5 years 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: ↓ 5 Changed 5 years 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 5 years 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 5 years 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 5 years ago by bbross
Ticket #325 has been marked as a duplicate of this ticket.
comment:8 Changed 5 years 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 5 years 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 5 years ago by bbross
- Version changed from VVC D6 vE to VVC D7 vC
comment:11 Changed 5 years 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 5 years 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 5 years 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 5 years 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-Q0351, it is suggested to define 4x4 CU and CUs in I-Slice as MODE_TYPE_INTRA.
comment:15 Changed 5 years ago by bbross
- Version changed from VVC D7 vC to VVC D8 vB
comment:16 Changed 4 years 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 4 years ago by axink
I think this ticket was resolved by the adoption of JVET-R0311.
Xiaozhong
comment:18 Changed 4 years ago by bbross
- Resolution set to fixed
- Status changed from reopened to closed
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.