diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index adc3856d0756725e768bf4a3b6cbcf0fa0f8cd53..07ad17202ad7a731ea42cefacc32301ee97c7ae3 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -56,6 +56,10 @@ #define JVET_R0341_GCI 1 // JVET-R0341: on constraint flag for local chroma QP control +#define JVET_S0047_MINUS1_FOR_VB_POS 1 // JVET-S0047: Add "_minus1" to sps_virtual_boundary_pos_x, sps_virtual_boundary_pos_y, ph_virtual_boundary_pos_x and ph_virtual_boundary_pos_y + +#define JVET_S0211_UEV_FOR_NUM_VB 1 // JVET-S0211: Signal sps_num_ver_virtual_boundaries, sps_num_hor_virtual_boundaries, ph_num_ver_virtual_boundaries, and ph_num_hor_virtual_boundaries using ue(v) + #define JVET_S0203 1 // JVET-S0203 (aspects 1 & 2): change the signalling of sublayer_level_idc[ i ] and ptl_sublayer_level_present_flag[ i ] to be in descending order #define JVET_R0227_ASPECT3 1 // JVET-R0227 aspect 3: Rename gci_no_qp_delta_constraint_flag to gci_no_cu_qp_delta_constraint_flag diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 6a307868470a68d4c1e036f27b8f6b53d224f849..f56963b09bef7a1ab045aaadfcb2790deaf7a550 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -2208,27 +2208,57 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_FLAG( uiCode, "sps_loop_filter_across_virtual_boundaries_present_flag" ); pcSPS->setVirtualBoundariesPresentFlag( uiCode != 0 ); if( pcSPS->getVirtualBoundariesPresentFlag() ) { +#if JVET_S0211_UEV_FOR_NUM_VB + READ_UVLC(uiCode, "sps_num_ver_virtual_boundaries"); pcSPS->setNumVerVirtualBoundaries( uiCode ); +#else READ_CODE( 2, uiCode, "sps_num_ver_virtual_boundaries"); pcSPS->setNumVerVirtualBoundaries( uiCode ); +#endif #if JVET_S0221_NUM_VB_CHECK if (pcSPS->getMaxPicWidthInLumaSamples() <= 8) { CHECK(pcSPS->getNumVerVirtualBoundaries() != 0, "SPS: When picture width is less than or equal to 8, the number of vertical virtual boundaries shall be equal to 0"); } +#if JVET_S0211_UEV_FOR_NUM_VB + else + { + CHECK(pcSPS->getNumVerVirtualBoundaries() > 3, "SPS: The number of vertical virtual boundaries shall be in the range of 0 to 3"); + } +#endif #endif for( unsigned i = 0; i < pcSPS->getNumVerVirtualBoundaries(); i++ ) { +#if JVET_S0047_MINUS1_FOR_VB_POS + READ_UVLC(uiCode, "sps_virtual_boundary_pos_x_minus1[i]"); pcSPS->setVirtualBoundariesPosX((uiCode + 1) << 3, i); + CHECK(uiCode > (((pcSPS->getMaxPicWidthInLumaSamples() + 7) >> 3) - 2), "The value of sps_virtual_boundary_pos_x_minus1[ i ] shall be in the range of 0 to Ceil( sps_pic_width_max_in_luma_samples / 8 ) - 2, inclusive."); +#else READ_UVLC(uiCode, "sps_virtual_boundaries_pos_x"); pcSPS->setVirtualBoundariesPosX(uiCode << 3, i); +#endif } +#if JVET_S0211_UEV_FOR_NUM_VB + READ_UVLC(uiCode, "sps_num_hor_virtual_boundaries"); pcSPS->setNumHorVirtualBoundaries( uiCode ); +#else READ_CODE( 2, uiCode, "sps_num_hor_virtual_boundaries"); pcSPS->setNumHorVirtualBoundaries( uiCode ); +#endif #if JVET_S0221_NUM_VB_CHECK if (pcSPS->getMaxPicHeightInLumaSamples() <= 8) { - CHECK(pcSPS->getNumHorVirtualBoundaries() != 0, "SPS: When picture width is less than or equal to 8, the number of vertical virtual boundaries shall be equal to 0"); + CHECK(pcSPS->getNumHorVirtualBoundaries() != 0, "SPS: When picture height is less than or equal to 8, the number of horizontal virtual boundaries shall be equal to 0"); + } +#if JVET_S0211_UEV_FOR_NUM_VB + else + { + CHECK(pcSPS->getNumHorVirtualBoundaries() > 3, "SPS: The number of horizontal virtual boundaries shall be in the range of 0 to 3"); } +#endif #endif for( unsigned i = 0; i < pcSPS->getNumHorVirtualBoundaries(); i++ ) { +#if JVET_S0047_MINUS1_FOR_VB_POS + READ_UVLC(uiCode, "sps_virtual_boundary_pos_y_minus1[i]"); pcSPS->setVirtualBoundariesPosY((uiCode + 1) << 3, i); + CHECK(uiCode > (((pcSPS->getMaxPicHeightInLumaSamples() + 7) >> 3) - 2), "The value of sps_virtual_boundary_pos_y_minus1[ i ] shall be in the range of 0 to Ceil( sps_pic_height_max_in_luma_samples / 8 ) - 2, inclusive."); +#else READ_UVLC(uiCode, "sps_virtual_boundaries_pos_y"); pcSPS->setVirtualBoundariesPosY(uiCode << 3, i); +#endif } } else @@ -2995,27 +3025,57 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag #endif if( picHeader->getVirtualBoundariesPresentFlag() ) { +#if JVET_S0211_UEV_FOR_NUM_VB + READ_UVLC(uiCode, "ph_num_ver_virtual_boundaries"); picHeader->setNumVerVirtualBoundaries( uiCode ); +#else READ_CODE( 2, uiCode, "ph_num_ver_virtual_boundaries"); picHeader->setNumVerVirtualBoundaries( uiCode ); +#endif #if JVET_S0221_NUM_VB_CHECK if (pps->getPicWidthInLumaSamples() <= 8) { CHECK(picHeader->getNumVerVirtualBoundaries() != 0, "PH: When picture width is less than or equal to 8, the number of vertical virtual boundaries shall be equal to 0"); } +#if JVET_S0211_UEV_FOR_NUM_VB + else + { + CHECK(picHeader->getNumVerVirtualBoundaries() > 3, "PH: The number of vertical virtual boundaries shall be in the range of 0 to 3"); + } +#endif #endif for( unsigned i = 0; i < picHeader->getNumVerVirtualBoundaries(); i++ ) { +#if JVET_S0047_MINUS1_FOR_VB_POS + READ_UVLC(uiCode, "ph_virtual_boundary_pos_x_minus1[i]"); picHeader->setVirtualBoundariesPosX((uiCode + 1) << 3, i); + CHECK(uiCode > (((pps->getPicWidthInLumaSamples() + 7) >> 3) - 2), "The value of ph_virtual_boundary_pos_x_minus1[ i ] shall be in the range of 0 to Ceil( pps_pic_width_in_luma_samples / 8 ) - 2, inclusive."); +#else READ_UVLC(uiCode, "ph_virtual_boundaries_pos_x"); picHeader->setVirtualBoundariesPosX(uiCode << 3, i); +#endif } +#if JVET_S0211_UEV_FOR_NUM_VB + READ_UVLC(uiCode, "ph_num_hor_virtual_boundaries"); picHeader->setNumHorVirtualBoundaries( uiCode ); +#else READ_CODE( 2, uiCode, "ph_num_hor_virtual_boundaries"); picHeader->setNumHorVirtualBoundaries( uiCode ); +#endif #if JVET_S0221_NUM_VB_CHECK if (pps->getPicHeightInLumaSamples() <= 8) { CHECK(picHeader->getNumHorVirtualBoundaries() != 0, "PH: When picture width is less than or equal to 8, the number of horizontal virtual boundaries shall be equal to 0"); } +#if JVET_S0211_UEV_FOR_NUM_VB + else + { + CHECK(picHeader->getNumHorVirtualBoundaries() > 3, "PH: The number of horizontal virtual boundaries shall be in the range of 0 to 3"); + } +#endif #endif for( unsigned i = 0; i < picHeader->getNumHorVirtualBoundaries(); i++ ) { +#if JVET_S0047_MINUS1_FOR_VB_POS + READ_UVLC(uiCode, "ph_virtual_boundary_pos_y_minus1[i]"); picHeader->setVirtualBoundariesPosY((uiCode + 1) << 3, i); + CHECK(uiCode > (((pps->getPicHeightInLumaSamples() + 7) >> 3) - 2), "The value of ph_virtual_boundary_pos_y_minus1[ i ] shall be in the range of 0 to Ceil( pps_pic_height_in_luma_samples / 8 ) - 2, inclusive."); +#else READ_UVLC(uiCode, "ph_virtual_boundaries_pos_y"); picHeader->setVirtualBoundariesPosY(uiCode << 3, i); +#endif } } else diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 09ccbb3e8f45aebeff6c80979db9ced8488ab25a..ffcbe6f38faf75144e362f0db0cdbee3f2fd324b 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -1324,27 +1324,57 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_FLAG( pcSPS->getVirtualBoundariesPresentFlag(), "sps_loop_filter_across_virtual_boundaries_present_flag" ); if( pcSPS->getVirtualBoundariesPresentFlag() ) { +#if JVET_S0211_UEV_FOR_NUM_VB + WRITE_UVLC( pcSPS->getNumVerVirtualBoundaries(), "sps_num_ver_virtual_boundaries"); +#else WRITE_CODE( pcSPS->getNumVerVirtualBoundaries(), 2, "sps_num_ver_virtual_boundaries"); +#endif #if JVET_S0221_NUM_VB_CHECK if (pcSPS->getMaxPicWidthInLumaSamples() <= 8) { CHECK(pcSPS->getNumVerVirtualBoundaries() != 0, "SPS: When picture width is less than or equal to 8, the number of vertical virtual boundaries shall be equal to 0"); } +#if JVET_S0211_UEV_FOR_NUM_VB + else + { + CHECK(pcSPS->getNumVerVirtualBoundaries() > 3, "SPS: The number of vertical virtual boundaries shall be in the range of 0 to 3"); + } +#endif #endif for( unsigned i = 0; i < pcSPS->getNumVerVirtualBoundaries(); i++ ) { +#if JVET_S0047_MINUS1_FOR_VB_POS + WRITE_UVLC((pcSPS->getVirtualBoundariesPosX(i)>>3) - 1, "sps_virtual_boundary_pos_x_minus1[i]"); + CHECK(((pcSPS->getVirtualBoundariesPosX(i)>>3) - 1) > (((pcSPS->getMaxPicWidthInLumaSamples() + 7) >> 3) - 2), "The value of sps_virtual_boundary_pos_x_minus1[ i ] shall be in the range of 0 to Ceil( sps_pic_width_max_in_luma_samples / 8 ) - 2, inclusive."); +#else WRITE_UVLC((pcSPS->getVirtualBoundariesPosX(i)>>3), "sps_virtual_boundaries_pos_x"); +#endif } +#if JVET_S0211_UEV_FOR_NUM_VB + WRITE_UVLC(pcSPS->getNumHorVirtualBoundaries(), "sps_num_hor_virtual_boundaries"); +#else WRITE_CODE(pcSPS->getNumHorVirtualBoundaries(), 2, "sps_num_hor_virtual_boundaries"); +#endif #if JVET_S0221_NUM_VB_CHECK if (pcSPS->getMaxPicHeightInLumaSamples() <= 8) { CHECK(pcSPS->getNumHorVirtualBoundaries() != 0, "SPS: When picture height is less than or equal to 8, the number of horizontal virtual boundaries shall be equal to 0"); } +#if JVET_S0211_UEV_FOR_NUM_VB + else + { + CHECK(pcSPS->getNumHorVirtualBoundaries() > 3, "SPS: The number of horizontal virtual boundaries shall be in the range of 0 to 3"); + } +#endif #endif for( unsigned i = 0; i < pcSPS->getNumHorVirtualBoundaries(); i++ ) { +#if JVET_S0047_MINUS1_FOR_VB_POS + WRITE_UVLC((pcSPS->getVirtualBoundariesPosY(i)>>3) - 1, "sps_virtual_boundary_pos_y_minus1[i]"); + CHECK(((pcSPS->getVirtualBoundariesPosY(i)>>3) - 1) > (((pcSPS->getMaxPicHeightInLumaSamples() + 7) >> 3) - 2), "The value of sps_virtual_boundary_pos_y_minus1[ i ] shall be in the range of 0 to Ceil( sps_pic_height_max_in_luma_samples / 8 ) - 2, inclusive."); +#else WRITE_UVLC((pcSPS->getVirtualBoundariesPosY(i)>>3), "sps_virtual_boundaries_pos_y"); +#endif } } } @@ -1821,27 +1851,57 @@ WRITE_FLAG(picHeader->getGdrOrIrapPicFlag(), "ph_gdr_or_irap_pic_flag"); WRITE_FLAG( picHeader->getVirtualBoundariesPresentFlag(), "ph_virtual_boundaries_present_flag" ); if( picHeader->getVirtualBoundariesPresentFlag() ) { +#if JVET_S0211_UEV_FOR_NUM_VB + WRITE_UVLC(picHeader->getNumVerVirtualBoundaries(), "ph_num_ver_virtual_boundaries"); +#else WRITE_CODE(picHeader->getNumVerVirtualBoundaries(), 2, "ph_num_ver_virtual_boundaries"); +#endif #if JVET_S0221_NUM_VB_CHECK if (pps->getPicWidthInLumaSamples() <= 8) { CHECK(picHeader->getNumVerVirtualBoundaries() != 0, "PH: When picture width is less than or equal to 8, the number of vertical virtual boundaries shall be equal to 0"); } +#if JVET_S0211_UEV_FOR_NUM_VB + else + { + CHECK(picHeader->getNumVerVirtualBoundaries() > 3, "PH: The number of vertical virtual boundaries shall be in the range of 0 to 3"); + } +#endif #endif for( unsigned i = 0; i < picHeader->getNumVerVirtualBoundaries(); i++ ) { +#if JVET_S0047_MINUS1_FOR_VB_POS + WRITE_UVLC((picHeader->getVirtualBoundariesPosX(i) >> 3) - 1, "ph_virtual_boundary_pos_x_minus1[i]"); + CHECK(((picHeader->getVirtualBoundariesPosX(i)>>3) - 1) > (((pps->getPicWidthInLumaSamples() + 7) >> 3) - 2), "The value of ph_virtual_boundary_pos_x_minus1[ i ] shall be in the range of 0 to Ceil( pps_pic_width_in_luma_samples / 8 ) - 2, inclusive."); +#else WRITE_UVLC(picHeader->getVirtualBoundariesPosX(i) >> 3, "ph_virtual_boundaries_pos_x"); +#endif } +#if JVET_S0211_UEV_FOR_NUM_VB + WRITE_UVLC(picHeader->getNumHorVirtualBoundaries(), "ph_num_hor_virtual_boundaries"); +#else WRITE_CODE(picHeader->getNumHorVirtualBoundaries(), 2, "ph_num_hor_virtual_boundaries"); +#endif #if JVET_S0221_NUM_VB_CHECK if (pps->getPicHeightInLumaSamples() <= 8) { CHECK(picHeader->getNumHorVirtualBoundaries() != 0, "PH: When picture width is less than or equal to 8, the number of horizontal virtual boundaries shall be equal to 0"); } +#if JVET_S0211_UEV_FOR_NUM_VB + else + { + CHECK(picHeader->getNumHorVirtualBoundaries() > 3, "PH: The number of horizontal virtual boundaries shall be in the range of 0 to 3"); + } +#endif #endif for( unsigned i = 0; i < picHeader->getNumHorVirtualBoundaries(); i++ ) { +#if JVET_S0047_MINUS1_FOR_VB_POS + WRITE_UVLC((picHeader->getVirtualBoundariesPosY(i)>>3) - 1, "ph_virtual_boundary_pos_y_minus1[i]"); + CHECK(((picHeader->getVirtualBoundariesPosY(i)>>3) - 1) > (((pps->getPicHeightInLumaSamples() + 7) >> 3) - 2), "The value of ph_virtual_boundary_pos_y_minus1[ i ] shall be in the range of 0 to Ceil( pps_pic_height_in_luma_samples / 8 ) - 2, inclusive."); +#else WRITE_UVLC(picHeader->getVirtualBoundariesPosY(i)>>3, "ph_virtual_boundaries_pos_y"); +#endif } } else