diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index f21e2f394133eaecf16da901569d0a3ecab8bf2a..7281639cc775721ef09cd464b4df458591e0e9dd 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,7 @@ #include <assert.h> #include <cassert> +#define JVET_Q0169_SUBPIC_LEN_CONFORM 1 // JVET-Q0169: add bitstream conformance check on subpic length #define JVET_Q0504_PLT_NON444 1 // JVET-Q0504: enable palette mode for non 444 color format #define JVET_Q0089_SLICE_LOSSLESS_CODING_CHROMA_BDPCM 1 // JVET-Q0089: RRC slice-level switch for lossless coding and one SPS flag for luma and chroma BDPCM. diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 8555f4c008eb537e2ac8e9ac4a96db744e635e4c..cda8642a5d103f134fd1696ba9b693710a12c206 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -455,6 +455,9 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana READ_UVLC( uiCode, "pps_subpic_id_len_minus1" ); pcPPS->setSubPicIdLen( uiCode + 1 ); CHECK( uiCode > 15, "Invalid pps_subpic_id_len_minus1 signalled"); +#if JVET_Q0169_SUBPIC_LEN_CONFORM + CHECK((1 << pcPPS->getSubPicIdLen()) < pcPPS->getNumSubPics(), "pps_subpic_id_len exceeds valid range"); +#endif for( int picIdx = 0; picIdx < pcPPS->getNumSubPics( ); picIdx++ ) { READ_CODE( pcPPS->getSubPicIdLen( ), uiCode, "pps_subpic_id[i]" ); pcPPS->setSubPicId( picIdx, uiCode ); @@ -1286,6 +1289,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) { READ_UVLC( uiCode, "sps_subpic_id_len_minus1" ); pcSPS->setSubPicIdLen( uiCode + 1 ); CHECK( uiCode > 15, "Invalid sps_subpic_id_len_minus1 signalled"); +#if JVET_Q0169_SUBPIC_LEN_CONFORM + CHECK((1 << pcSPS->getSubPicIdLen()) < pcSPS->getNumSubPics(), "sps_subpic_id_len exceeds valid range"); +#endif for( int picIdx = 0; picIdx < pcSPS->getNumSubPics( ); picIdx++ ) { READ_CODE( pcSPS->getSubPicIdLen( ), uiCode, "sps_subpic_id[i]" ); pcSPS->setSubPicId( picIdx, uiCode ); @@ -2015,6 +2021,9 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag { READ_UVLC( uiCode, "ph_subpic_id_len_minus1" ); picHeader->setSubPicIdLen( uiCode + 1 ); CHECK( uiCode > 15, "Invalid ph_subpic_id_len_minus1 signalled"); +#if JVET_Q0169_SUBPIC_LEN_CONFORM + CHECK((1 << picHeader->getSubPicIdLen()) < sps->getNumSubPics(), "ph_subpic_id_len exceeds valid range"); +#endif for( int picIdx = 0; picIdx < sps->getNumSubPics( ); picIdx++ ) { READ_CODE( picHeader->getSubPicIdLen( ), uiCode, "ph_subpic_id[i]" ); picHeader->setSubPicId( picIdx, uiCode ); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 56f5f143f2deacb871e90ce5fc3f4bedfa8b6906..8a4e7b27900a0fc7fdbe05281325f66722bca270 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -282,6 +282,9 @@ void HLSWriter::codePPS( const PPS* pcPPS, const SPS* pcSPS ) WRITE_UVLC( pcPPS->getSubPicIdLen() - 1, "pps_subpic_id_len_minus1" ); +#if JVET_Q0169_SUBPIC_LEN_CONFORM + CHECK((1 << pcPPS->getSubPicIdLen()) < pcPPS->getNumSubPics(), "pps_subpic_id_len exceeds valid range"); +#endif for( int picIdx = 0; picIdx < pcPPS->getNumSubPics( ); picIdx++ ) { WRITE_CODE( pcPPS->getSubPicId(picIdx), pcPPS->getSubPicIdLen( ), "pps_subpic_id[i]" ); @@ -830,6 +833,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) if( pcSPS->getSubPicIdSignallingPresentFlag() ) { WRITE_UVLC( pcSPS->getSubPicIdLen( ) - 1, "sps_subpic_id_len_minus1" ); +#if JVET_Q0169_SUBPIC_LEN_CONFORM + CHECK((1 << pcSPS->getSubPicIdLen()) < pcSPS->getNumSubPics(), "sps_subpic_id_len exceeds valid range"); +#endif for( int picIdx = 0; picIdx < pcSPS->getNumSubPics( ); picIdx++ ) { WRITE_CODE( pcSPS->getSubPicId(picIdx), pcSPS->getSubPicIdLen( ), "sps_subpic_id[i]" ); @@ -1357,6 +1363,9 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) if( picHeader->getSubPicIdSignallingPresentFlag() ) { WRITE_UVLC( picHeader->getSubPicIdLen() - 1, "ph_subpic_id_len_minus1" ); +#if JVET_Q0169_SUBPIC_LEN_CONFORM + CHECK((1 << picHeader->getSubPicIdLen()) < sps->getNumSubPics(), "ph_subpic_id_len exceeds valid range"); +#endif for( int picIdx = 0; picIdx < sps->getNumSubPics( ); picIdx++ ) { WRITE_CODE(picHeader->getSubPicId(picIdx), picHeader->getSubPicIdLen( ), "ph_subpic_id[i]" );