Opened 4 years ago
Closed 4 years ago
#1291 closed defect (fixed)
Mismatch between spec and software in BPSEI and PTSEI
Reported by: | kazui | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | VTM-10.1 |
Component: | VTM | Version: | VTM-10.0rc1 |
Keywords: | BP SEI, PT SEI | Cc: | ksuehring, XiangLi, fbossen, jvet@… |
Description
This is a follow-up report of #1093 "Bugs in BPSEI and PTSEI".
Mismatch between the spec (Draft 10 version E) and software (VTM 10.0-rc1) still exists in BPSEI and PTSEI.
1) bp_cpb_cnt_minus1 in BPSEI
According to the spec, bp_cpb_cnt_minus1 is signalled before bp_sublayer_initial_cpb_removal_delay_present_flag. But the read operation of this SE disappears from SEIReader::xParseSEIBufferingPeriod() by enabling the macro JVET_S0181_PROPOSAL2_BUFFERING_PERIOD_CLEANUP.
It is suggested to insert the following code at line 766 in SEIread.cpp.
sei_read_uvlc( pDecodedMessageOutputStream, code, "bp_cpb_cnt_minus1" ); sei.m_bpCpbCnt = code + 1;
2) Number of signalled pt_du_common_cpb_removal_delay_increment_minus1[ i ] and pt_du_cpb_removal_delay_increment_minus1[ i ][ j ]
According to the spec, the range of the index 'i' and 'j' for those two SEs is [TemporalId, bp_max_sublayers_minus1]. But those in the software is [TemporalId, bp_max_sublayers_minus1). I think the spec is correct since it handles the case "bp_max_sublayers_minus1 = 0".
It is suggested to apply the following changes.
In SEIread.cpp, line 1028
Replace "for( int i = temporalId; i < bp.m_bpMaxSubLayers - 1; i ++ ) " with "for( int i = temporalId; i <= bp.m_bpMaxSubLayers - 1; i ++ )"
In SEIread.cpp, line 1043
Replace "for( int j = temporalId; j < bp.m_bpMaxSubLayers - 1; j ++ ) " with "for( int j = temporalId; j <= bp.m_bpMaxSubLayers - 1; j ++ ) "
In SEIwrite.cpp, line 482
Replace "for( int i = temporalId; i < bp.m_bpMaxSubLayers - 1; i ++ )" with "for( int i = temporalId; i <= bp.m_bpMaxSubLayers - 1; i ++ )"
In SEIwrite.cpp, line 493
Replace "for( int j = temporalId; j < bp.m_bpMaxSubLayers - 1; j ++ )" with "for( int j = temporalId; j <= bp.m_bpMaxSubLayers - 1; j ++ )"
3) Value of pt_sublayer_delays_present_flag[ 0 ] when bp_max_sublayers_minus1 = 0
The following inference rule is found in the semantics of pt_sublayer_delays_present_flag[ i ].
The value of pt_sublayer_delays_present_flag[ bp_max_sublayers_minus1 ] is inferred to be equal to 1. When not present, the value of pt_sublayer_delays_present_flag[ i ] for any i in the range of 0 to bp_max_sublayers_minus1 − 1, inclusive, is infered inferred to be equal to 0.
According to the syntax table, pt_sublayer_delays_present_flag[ 0 ] is not signalled when bp_max_sublayers_minus1 is equal to 0. My understanding is that pt_sublayer_delays_present_flag[ i ] is inferred to be equal to 1 when i is equal to 0 and is inferred to be equal to 0 otherwise when bp_max_sublayers_minus1 is equal to 0. This is because that DU-related SEs should be explicitly signalled even when bp_max_sublayers_minus1 is equal to 0.
With my understanding, initialization of pt_sublayer_delays_present_flag[ 0 ] when bp_max_sublayers_minus1 is equal to 0 is missing in the software.
It is suggested to insert the following codes.
In EncGOP.cpp, line 827 (or in more appropriate place)
if( maxNumSubLayers == 1 )
{
pictureTimingSEI->m_ptSubLayerDelaysPresentFlag[0] = true;
}
In SEIread.cpp, line 874
if( bp.m_bpMaxSubLayers == 1 )
{
sei.m_ptSubLayerDelaysPresentFlag[ 0 ] = true;
}
4) Initialization of m_nuhLayerId in class Slice
m_nuhLayerId is not initialized and referred in the software.
It is suggested to initialize the member variable in Slice::initSlice() by inserting the following code.
In Slice.cpp, line 208
m_nuhLayerId = 0;
Change history (2)
comment:1 Changed 4 years ago by ksuehring
- Milestone VTM-10.0 deleted
- Version set to VTM-10.0rc1
comment:2 Changed 4 years ago by XiangLi
- Milestone set to VTM-10.1
- Resolution set to fixed
- Status changed from new to closed
Fixed in https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/merge_requests/1857.