diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index d69b5bead674195696af14bbf072052611ac5cb7..6417fb0896eb46ef01e78befd8d312a24fb3dee6 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -1608,6 +1608,9 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) CHECK( m_subPicIdLen > 16, "sibpic ID length must not exceed 16 bits" ); } } +#if JVET_Q0043_RPR_and_Subpics + CHECK( m_rprEnabled, "RPR and subpictures cannot be enabled together" ); +#endif } if( m_picPartitionFlag ) { diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 8522c5eb1f1a337bafa4a4f095e1b12558242d1a..9cb0525275fef70979228878066be42440dc94af 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -2002,6 +2002,10 @@ private: ReferencePictureList m_localRPL1; //!< RPL for L1 when present in picture header int m_rpl0Idx; //!< index of used RPL in the SPS or -1 for local RPL in the picture header int m_rpl1Idx; //!< index of used RPL in the SPS or -1 for local RPL in the picture header +#if JVET_Q0819_PH_CHANGES + bool m_picInterSliceAllowedFlag; //!< inter slice allowed flag in PH + bool m_picIntraSliceAllowedFlag; //!< intra slice allowed flag in PH +#endif bool m_splitConsOverrideFlag; //!< partitioning constraint override flag uint32_t m_cuQpDeltaSubdivIntra; //!< CU QP delta maximum subdivision for intra slices uint32_t m_cuQpDeltaSubdivInter; //!< CU QP delta maximum subdivision for inter slices @@ -2123,6 +2127,12 @@ public: void setRPL1idx(int rplIdx) { m_rpl1Idx = rplIdx; } int getRPL0idx() const { return m_rpl0Idx; } int getRPL1idx() const { return m_rpl1Idx; } +#if JVET_Q0819_PH_CHANGES + void setPicInterSliceAllowedFlag(bool b) { m_picInterSliceAllowedFlag = b; } + bool getPicInterSliceAllowedFlag() const { return m_picInterSliceAllowedFlag; } + void setPicIntraSliceAllowedFlag(bool b) { m_picIntraSliceAllowedFlag = b; } + bool getPicIntraSliceAllowedFlag() const { return m_picIntraSliceAllowedFlag; } +#endif void setSplitConsOverrideFlag( bool b ) { m_splitConsOverrideFlag = b; } bool getSplitConsOverrideFlag() const { return m_splitConsOverrideFlag; } void setCuQpDeltaSubdivIntra( uint32_t u ) { m_cuQpDeltaSubdivIntra = u; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index c1e7b5ca2054d68496bee4d9d807119485c3f099..fbbc93b35696ea6ad82e7b8d57e9a6cec242f835 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -52,6 +52,8 @@ #define JVET_Q0179_SCALING_WINDOW_SIZE_CONSTRAINT 1 // JVET-Q0179: Scaling window size constraint for constraining worst case memory bandwidth +#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. @@ -60,6 +62,8 @@ #define JVET_Q0438_MONOCHROME_BUGFIXES 1 // JVET-Q0438: Monochrome bug fixes +#define JVET_Q0043_RPR_and_Subpics 1 // JVET-Q0043: Disallow for both RPR and subpics to be used together + #define JVET_Q0110_Q0785_CHROMA_BDPCM_420 1 // JVET-Q0110/Q0785: Enable chroma BDPCM for 420, separate contexts for chroma BDPCM and bug-fixes. #define JVET_Q0512_ENC_CHROMA_TS_ACT 1 // JVET-Q0512: encoder-side improvement on enabling chroma transform-skip for ACT diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 253f8dda0fe8f61ccb9047c3aa08fc5663c731fd..8462a14be103d7a2ee3ee739bb4dfc03e42dc7ab 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -1242,13 +1242,25 @@ void DecLib::xActivateParameterSets( const int layerId ) CHECK( ( pps->getPicWidthInLumaSamples() % ( std::max( 8, int( sps->getMaxCUWidth() >> ( sps->getMaxCodingDepth() - 1 ) ) ) ) ) != 0, "Coded frame width must be a multiple of Max(8, the minimum unit size)" ); CHECK( ( pps->getPicHeightInLumaSamples() % ( std::max( 8, int( sps->getMaxCUHeight() >> ( sps->getMaxCodingDepth() - 1 ) ) ) ) ) != 0, "Coded frame height must be a multiple of Max(8, the minimum unit size)" ); +#if JVET_Q0043_RPR_and_Subpics + if( !sps->getRprEnabledFlag() ) + { + CHECK( pps->getPicWidthInLumaSamples() != sps->getMaxPicWidthInLumaSamples(), "When res_change_in_clvs_allowed_flag equal to 0, the value of pic_width_in_luma_samples shall be equal to pic_width_max_in_luma_samples." ); + CHECK( pps->getPicHeightInLumaSamples() != sps->getMaxPicHeightInLumaSamples(), "When res_change_in_clvs_allowed_flag equal to 0, the value of pic_height_in_luma_samples shall be equal to pic_height_max_in_luma_samples." ); + } + if( sps->getRprEnabledFlag() ) + { + CHECK( sps->getSubPicPresentFlag() != 0, "When res_change_in_clvs_allowed_flag is equal to 1, the value of subpic_info_present_flag shall be equal to 0." ); + } + CHECK( !sps->getRprEnabledFlag() && pps->getScalingWindow().getWindowEnabledFlag(), "When res_change_in_clvs_allowed_flag is equal to 0, the value of scaling_window_flag shall be equal to 0." ); +#else if( !sps->getRprEnabledFlag() ) // subpics_present_flag is equal to 1 condition shall be added { CHECK( pps->getPicWidthInLumaSamples() != sps->getMaxPicWidthInLumaSamples(), "When subpics_present_flag is equal to 1 or ref_pic_resampling_enabled_flag equal to 0, the value of pic_width_in_luma_samples shall be equal to pic_width_max_in_luma_samples." ); CHECK( pps->getPicHeightInLumaSamples() != sps->getMaxPicHeightInLumaSamples(), "When subpics_present_flag is equal to 1 or ref_pic_resampling_enabled_flag equal to 0, the value of pic_height_in_luma_samples shall be equal to pic_height_max_in_luma_samples." ); } - CHECK( !sps->getRprEnabledFlag() && pps->getScalingWindow().getWindowEnabledFlag(), "When ref_pic_resampling_enabled_flag is equal to 0, the value of scaling_window_flag shall be equal to 0." ); +#endif if( sps->getCTUSize() + 2 * ( 1 << sps->getLog2MinCodingBlockSize() ) > pps->getPicWidthInLumaSamples() ) { diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 8555f4c008eb537e2ac8e9ac4a96db744e635e4c..24a459b82a7f1d02c33287c9cbfbf03be0c8bfd8 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 ); @@ -1181,7 +1184,11 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) pcSPS->setSeparateColourPlaneFlag( uiCode != 0 ); } +#if JVET_Q0043_RPR_and_Subpics + READ_FLAG( uiCode, "res_change_in_clvs_allowed_flag" ); pcSPS->setRprEnabledFlag( uiCode ); +#else READ_FLAG( uiCode, "ref_pic_resampling_enabled_flag" ); pcSPS->setRprEnabledFlag( uiCode ); +#endif READ_UVLC( uiCode, "pic_width_max_in_luma_samples" ); pcSPS->setMaxPicWidthInLumaSamples( uiCode ); READ_UVLC( uiCode, "pic_height_max_in_luma_samples" ); pcSPS->setMaxPicHeightInLumaSamples( uiCode ); @@ -1193,7 +1200,11 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) pcSPS->setLog2DiffMaxMinCodingBlockSize(uiCode+3); pcSPS->setMaxCUWidth(pcSPS->getCTUSize()); pcSPS->setMaxCUHeight(pcSPS->getCTUSize()); +#if JVET_Q0043_RPR_and_Subpics + READ_FLAG( uiCode, "subpic_info_present_flag" ); pcSPS->setSubPicPresentFlag(uiCode); +#else READ_FLAG( uiCode, "subpics_present_flag" ); pcSPS->setSubPicPresentFlag(uiCode); +#endif if (pcSPS->getSubPicPresentFlag()) { @@ -1286,6 +1297,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 ); @@ -1946,6 +1960,18 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag xTracePictureHeader(); #endif +#if JVET_Q0819_PH_CHANGES + READ_FLAG(uiCode, "pic_inter_slice_allowed_flag"); picHeader->setPicInterSliceAllowedFlag(uiCode != 0); + if (picHeader->getPicInterSliceAllowedFlag()) + { + READ_FLAG(uiCode, "pic_intra_slice_allowed_flag"); picHeader->setPicIntraSliceAllowedFlag(uiCode != 0); + } + else + { + picHeader->setPicIntraSliceAllowedFlag(true); + } + CHECK(picHeader->getPicInterSliceAllowedFlag() == 0 && picHeader->getPicIntraSliceAllowedFlag() == 0, "Invalid picture without intra or inter slice"); +#endif READ_FLAG(uiCode, "non_reference_picture_flag"); picHeader->setNonReferencePictureFlag( uiCode != 0 ); READ_FLAG(uiCode, "gdr_pic_flag"); picHeader->setGdrPicFlag( uiCode != 0 ); READ_FLAG(uiCode, "no_output_of_prior_pics_flag"); picHeader->setNoOutputOfPriorPicsFlag( uiCode != 0 ); @@ -2015,6 +2041,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 ); @@ -2186,14 +2215,31 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag if (sps->getSplitConsOverrideEnabledFlag()) { READ_FLAG(uiCode, "partition_constraints_override_flag"); picHeader->setSplitConsOverrideFlag( uiCode != 0 ); +#if JVET_Q0819_PH_CHANGES + } + else + { + picHeader->setSplitConsOverrideFlag(0); + } + // Q0781, two-flags + unsigned minQT[3] = { 0, 0, 0 }; + unsigned maxBTD[3] = { 0, 0, 0 }; + unsigned maxBTSize[3] = { 0, 0, 0 }; + unsigned maxTTSize[3] = { 0, 0, 0 }; + unsigned ctbLog2SizeY = floorLog2(sps->getCTUSize()); + + if (picHeader->getPicIntraSliceAllowedFlag()) + { +#endif if (picHeader->getSplitConsOverrideFlag()) { +#if !JVET_Q0819_PH_CHANGES unsigned minQT[3] = { 0, 0, 0 }; unsigned maxBTD[3] = { 0, 0, 0 }; unsigned maxBTSize[3] = { 0, 0, 0 }; unsigned maxTTSize[3] = { 0, 0, 0 }; unsigned ctbLog2SizeY = floorLog2(sps->getCTUSize()); - +#endif READ_UVLC(uiCode, "pic_log2_diff_min_qt_min_cb_intra_slice_luma"); unsigned minQtLog2SizeIntraY = uiCode + sps->getLog2MinCodingBlockSize(); minQT[0] = 1 << minQtLog2SizeIntraY; @@ -2213,12 +2259,8 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag READ_UVLC(uiCode, "pic_log2_diff_max_tt_min_qt_intra_slice_luma"); maxTTSize[0] <<= uiCode; CHECK(uiCode > ctbLog2SizeY - minQtLog2SizeIntraY, "Invalid code"); } -#if JVET_Q0819_PH_CHANGES - READ_UVLC(uiCode, "pic_log2_diff_min_qt_min_cb_inter_slice"); - unsigned minQtLog2SizeInterY = uiCode + sps->getLog2MinCodingBlockSize(); - minQT[1] = 1 << minQtLog2SizeInterY; - READ_UVLC(uiCode, "pic_max_mtt_hierarchy_depth_inter_slice"); maxBTD[1] = uiCode; -#endif + +#if !JVET_Q0819_PH_CHANGES maxTTSize[1] = maxBTSize[1] = minQT[1]; if (maxBTD[1] != 0) { @@ -2227,6 +2269,7 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag READ_UVLC(uiCode, "pic_log2_diff_max_tt_min_qt_inter_slice"); maxTTSize[1] <<= uiCode; CHECK(uiCode > ctbLog2SizeY - minQtLog2SizeInterY, "Invalid code"); } +#endif if (sps->getUseDualITree()) { READ_UVLC(uiCode, "pic_log2_diff_min_qt_min_cb_intra_slice_chroma"); minQT[2] = 1 << (uiCode + sps->getLog2MinCodingBlockSize()); @@ -2238,18 +2281,22 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag READ_UVLC(uiCode, "pic_log2_diff_max_tt_min_qt_intra_slice_chroma"); maxTTSize[2] <<= uiCode; } } - +#if !JVET_Q0819_PH_CHANGES picHeader->setMinQTSizes(minQT); picHeader->setMaxMTTHierarchyDepths(maxBTD); picHeader->setMaxBTSizes(maxBTSize); picHeader->setMaxTTSizes(maxTTSize); +#endif } } +#if !JVET_Q0819_PH_CHANGES else { picHeader->setSplitConsOverrideFlag(0); } +#endif +#if !JVET_Q0819_PH_CHANGES // inherit constraint values from SPS if (!sps->getSplitConsOverrideEnabledFlag() || !picHeader->getSplitConsOverrideFlag()) { @@ -2258,156 +2305,226 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag picHeader->setMaxBTSizes(sps->getMaxBTSizes()); picHeader->setMaxTTSizes(sps->getMaxTTSizes()); } +#endif - // delta quantization and chrom and chroma offset - if (pps->getUseDQP()) - { - READ_UVLC( uiCode, "pic_cu_qp_delta_subdiv_intra_slice" ); picHeader->setCuQpDeltaSubdivIntra( uiCode ); - READ_UVLC( uiCode, "pic_cu_qp_delta_subdiv_inter_slice" ); picHeader->setCuQpDeltaSubdivInter( uiCode ); - } - else - { - picHeader->setCuQpDeltaSubdivIntra( 0 ); - picHeader->setCuQpDeltaSubdivInter( 0 ); - } - if (pps->getCuChromaQpOffsetEnabledFlag()) +#if JVET_Q0819_PH_CHANGES + if (picHeader->getPicIntraSliceAllowedFlag()) { - READ_UVLC( uiCode, "pic_cu_chroma_qp_offset_subdiv_intra_slice" ); picHeader->setCuChromaQpOffsetSubdivIntra( uiCode ); - READ_UVLC( uiCode, "pic_cu_chroma_qp_offset_subdiv_inter_slice" ); picHeader->setCuChromaQpOffsetSubdivInter( uiCode ); +#endif + // delta quantization and chrom and chroma offset + if (pps->getUseDQP()) + { + READ_UVLC( uiCode, "pic_cu_qp_delta_subdiv_intra_slice" ); picHeader->setCuQpDeltaSubdivIntra( uiCode ); +#if !JVET_Q0819_PH_CHANGES + READ_UVLC( uiCode, "pic_cu_qp_delta_subdiv_inter_slice" ); picHeader->setCuQpDeltaSubdivInter( uiCode ); +#endif + } + else + { + picHeader->setCuQpDeltaSubdivIntra( 0 ); +#if !JVET_Q0819_PH_CHANGES + picHeader->setCuQpDeltaSubdivInter( 0 ); +#endif + } + if (pps->getCuChromaQpOffsetEnabledFlag()) + { + READ_UVLC( uiCode, "pic_cu_chroma_qp_offset_subdiv_intra_slice" ); picHeader->setCuChromaQpOffsetSubdivIntra( uiCode ); +#if !JVET_Q0819_PH_CHANGES + READ_UVLC( uiCode, "pic_cu_chroma_qp_offset_subdiv_inter_slice" ); picHeader->setCuChromaQpOffsetSubdivInter( uiCode ); +#endif + } + else + { + picHeader->setCuChromaQpOffsetSubdivIntra( 0 ); +#if !JVET_Q0819_PH_CHANGES + picHeader->setCuChromaQpOffsetSubdivInter( 0 ); +#endif + } +#if JVET_Q0819_PH_CHANGES } - else + + + if (picHeader->getPicInterSliceAllowedFlag()) { - picHeader->setCuChromaQpOffsetSubdivIntra( 0 ); - picHeader->setCuChromaQpOffsetSubdivInter( 0 ); - } - + if (picHeader->getSplitConsOverrideFlag()) + { + READ_UVLC(uiCode, "pic_log2_diff_min_qt_min_cb_inter_slice"); + unsigned minQtLog2SizeInterY = uiCode + sps->getLog2MinCodingBlockSize(); + minQT[1] = 1 << minQtLog2SizeInterY; + READ_UVLC(uiCode, "pic_max_mtt_hierarchy_depth_inter_slice"); maxBTD[1] = uiCode; + + maxTTSize[1] = maxBTSize[1] = minQT[1]; + if (maxBTD[1] != 0) + { + READ_UVLC(uiCode, "pic_log2_diff_max_bt_min_qt_inter_slice"); maxBTSize[1] <<= uiCode; + CHECK(uiCode > ctbLog2SizeY - minQtLog2SizeInterY, "Invalid code"); + READ_UVLC(uiCode, "pic_log2_diff_max_tt_min_qt_inter_slice"); maxTTSize[1] <<= uiCode; + CHECK(uiCode > ctbLog2SizeY - minQtLog2SizeInterY, "Invalid code"); + } + } + // delta quantization and chrom and chroma offset + if (pps->getUseDQP()) + { + READ_UVLC(uiCode, "pic_cu_qp_delta_subdiv_inter_slice"); picHeader->setCuQpDeltaSubdivInter(uiCode); + } + else + { + picHeader->setCuQpDeltaSubdivInter(0); + } + if (pps->getCuChromaQpOffsetEnabledFlag()) + { + READ_UVLC(uiCode, "pic_cu_chroma_qp_offset_subdiv_inter_slice"); picHeader->setCuChromaQpOffsetSubdivInter(uiCode); + } + else + { + picHeader->setCuChromaQpOffsetSubdivInter(0); + } + +#endif // temporal motion vector prediction - if (sps->getSPSTemporalMVPEnabledFlag()) - { - READ_FLAG( uiCode, "pic_temporal_mvp_enabled_flag" ); - picHeader->setEnableTMVPFlag( uiCode != 0 ); - } - else - { - picHeader->setEnableTMVPFlag(false); - } + if (sps->getSPSTemporalMVPEnabledFlag()) + { + READ_FLAG( uiCode, "pic_temporal_mvp_enabled_flag" ); + picHeader->setEnableTMVPFlag( uiCode != 0 ); + } + else + { + picHeader->setEnableTMVPFlag(false); + } // mvd L1 zero flag - if (!pps->getPPSMvdL1ZeroIdc()) - { - READ_FLAG(uiCode, "pic_mvd_l1_zero_flag"); - } - else - { - uiCode = pps->getPPSMvdL1ZeroIdc() - 1; - } - picHeader->setMvdL1ZeroFlag( uiCode != 0 ); + if (!pps->getPPSMvdL1ZeroIdc()) + { + READ_FLAG(uiCode, "pic_mvd_l1_zero_flag"); + } + else + { + uiCode = pps->getPPSMvdL1ZeroIdc() - 1; + } + picHeader->setMvdL1ZeroFlag( uiCode != 0 ); // merge candidate list size - if (!pps->getPPSSixMinusMaxNumMergeCandPlus1()) - { - READ_UVLC(uiCode, "pic_six_minus_max_num_merge_cand"); - } - else - { - uiCode = pps->getPPSSixMinusMaxNumMergeCandPlus1() - 1; - } - CHECK(MRG_MAX_NUM_CANDS <= uiCode, "Incorrrect max number of merge candidates!"); - picHeader->setMaxNumMergeCand(MRG_MAX_NUM_CANDS - uiCode); + if (!pps->getPPSSixMinusMaxNumMergeCandPlus1()) + { + READ_UVLC(uiCode, "pic_six_minus_max_num_merge_cand"); + } + else + { + uiCode = pps->getPPSSixMinusMaxNumMergeCandPlus1() - 1; + } + CHECK(MRG_MAX_NUM_CANDS <= uiCode, "Incorrrect max number of merge candidates!"); + picHeader->setMaxNumMergeCand(MRG_MAX_NUM_CANDS - uiCode); // subblock merge candidate list size - if ( sps->getUseAffine() ) - { - READ_UVLC(uiCode, "pic_five_minus_max_num_subblock_merge_cand"); - CHECK(AFFINE_MRG_MAX_NUM_CANDS < uiCode, "Incorrrect max number of affine merge candidates!"); - picHeader->setMaxNumAffineMergeCand( AFFINE_MRG_MAX_NUM_CANDS - uiCode ); - } - else - { - picHeader->setMaxNumAffineMergeCand( sps->getSBTMVPEnabledFlag() && picHeader->getEnableTMVPFlag() ); - } + if ( sps->getUseAffine() ) + { + READ_UVLC(uiCode, "pic_five_minus_max_num_subblock_merge_cand"); + CHECK(AFFINE_MRG_MAX_NUM_CANDS < uiCode, "Incorrrect max number of affine merge candidates!"); + picHeader->setMaxNumAffineMergeCand( AFFINE_MRG_MAX_NUM_CANDS - uiCode ); + } + else + { + picHeader->setMaxNumAffineMergeCand( sps->getSBTMVPEnabledFlag() && picHeader->getEnableTMVPFlag() ); + } // full-pel MMVD flag - if (sps->getFpelMmvdEnabledFlag()) - { - READ_FLAG( uiCode, "pic_fpel_mmvd_enabled_flag" ); - picHeader->setDisFracMMVD( uiCode != 0 ); - } - else - { - picHeader->setDisFracMMVD(false); - } + if (sps->getFpelMmvdEnabledFlag()) + { + READ_FLAG( uiCode, "pic_fpel_mmvd_enabled_flag" ); + picHeader->setDisFracMMVD( uiCode != 0 ); + } + else + { + picHeader->setDisFracMMVD(false); + } // picture level BDOF disable flags - if (sps->getBdofControlPresentFlag()) - { - READ_FLAG(uiCode, "pic_disable_bdof_flag"); picHeader->setDisBdofFlag(uiCode != 0); - } - else - { - picHeader->setDisBdofFlag(0); - } + if (sps->getBdofControlPresentFlag()) + { + READ_FLAG(uiCode, "pic_disable_bdof_flag"); picHeader->setDisBdofFlag(uiCode != 0); + } + else + { + picHeader->setDisBdofFlag(0); + } // picture level DMVR disable flags - if (sps->getDmvrControlPresentFlag()) - { - READ_FLAG(uiCode, "pic_disable_dmvr_flag"); picHeader->setDisDmvrFlag(uiCode != 0); - } - else - { - picHeader->setDisDmvrFlag(0); - } + if (sps->getDmvrControlPresentFlag()) + { + READ_FLAG(uiCode, "pic_disable_dmvr_flag"); picHeader->setDisDmvrFlag(uiCode != 0); + } + else + { + picHeader->setDisDmvrFlag(0); + } // picture level PROF disable flags - if (sps->getProfControlPresentFlag()) - { - READ_FLAG(uiCode, "pic_disable_prof_flag"); picHeader->setDisProfFlag(uiCode != 0); - } - else - { - picHeader->setDisProfFlag(0); - } + if (sps->getProfControlPresentFlag()) + { + READ_FLAG(uiCode, "pic_disable_prof_flag"); picHeader->setDisProfFlag(uiCode != 0); + } + else + { + picHeader->setDisProfFlag(0); + } #if !JVET_Q0806 // triangle merge candidate list size - if (sps->getUseTriangle() && picHeader->getMaxNumMergeCand() >= 2) - { - if (!pps->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1()) + if (sps->getUseTriangle() && picHeader->getMaxNumMergeCand() >= 2) { - READ_UVLC(uiCode, "pic_max_num_merge_cand_minus_max_num_triangle_cand"); + if (!pps->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1()) + { + READ_UVLC(uiCode, "pic_max_num_merge_cand_minus_max_num_triangle_cand"); + } + else + { + uiCode = pps->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1() - 1; + } + CHECK(picHeader->getMaxNumMergeCand() < uiCode, "Incorrrect max number of triangle candidates!"); + picHeader->setMaxNumTriangleCand((uint32_t)(picHeader->getMaxNumMergeCand() - uiCode)); } else { - uiCode = pps->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1() - 1; + picHeader->setMaxNumTriangleCand(0); } - CHECK(picHeader->getMaxNumMergeCand() < uiCode, "Incorrrect max number of triangle candidates!"); - picHeader->setMaxNumTriangleCand((uint32_t)(picHeader->getMaxNumMergeCand() - uiCode)); - } - else - { - picHeader->setMaxNumTriangleCand(0); - } #else // geometric merge candidate list size - if (sps->getUseGeo() && picHeader->getMaxNumMergeCand() >= 2) - { - if (!pps->getPPSMaxNumMergeCandMinusMaxNumGeoCandPlus1()) + if (sps->getUseGeo() && picHeader->getMaxNumMergeCand() >= 2) { - READ_UVLC(uiCode, "pic_max_num_merge_cand_minus_max_num_gpm_cand"); + if (!pps->getPPSMaxNumMergeCandMinusMaxNumGeoCandPlus1()) + { + READ_UVLC(uiCode, "pic_max_num_merge_cand_minus_max_num_gpm_cand"); + } + else + { + uiCode = pps->getPPSMaxNumMergeCandMinusMaxNumGeoCandPlus1() - 1; + } + CHECK(picHeader->getMaxNumMergeCand() < uiCode, "Incorrrect max number of gpm candidates!"); + picHeader->setMaxNumGeoCand((uint32_t)(picHeader->getMaxNumMergeCand() - uiCode)); } else { - uiCode = pps->getPPSMaxNumMergeCandMinusMaxNumGeoCandPlus1() - 1; + picHeader->setMaxNumGeoCand(0); } - CHECK(picHeader->getMaxNumMergeCand() < uiCode, "Incorrrect max number of gpm candidates!"); - picHeader->setMaxNumGeoCand((uint32_t)(picHeader->getMaxNumMergeCand() - uiCode)); +#endif +#if JVET_Q0819_PH_CHANGES + } + // inherit constraint values from SPS + if (!sps->getSplitConsOverrideEnabledFlag() || !picHeader->getSplitConsOverrideFlag()) + { + picHeader->setMinQTSizes(sps->getMinQTSizes()); + picHeader->setMaxMTTHierarchyDepths(sps->getMaxMTTHierarchyDepths()); + picHeader->setMaxBTSizes(sps->getMaxBTSizes()); + picHeader->setMaxTTSizes(sps->getMaxTTSizes()); } else { - picHeader->setMaxNumGeoCand(0); + picHeader->setMinQTSizes(minQT); + picHeader->setMaxMTTHierarchyDepths(maxBTD); + picHeader->setMaxBTSizes(maxBTSize); + picHeader->setMaxTTSizes(maxTTSize); } #endif - // ibc merge candidate list size if (sps->getIBCFlag()) { @@ -2877,9 +2994,22 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par pcSlice->setSliceID(sliceAddr); } - +#if JVET_Q0819_PH_CHANGES + if (picHeader->getPicInterSliceAllowedFlag()) + { +#endif READ_UVLC ( uiCode, "slice_type" ); pcSlice->setSliceType((SliceType)uiCode); - +#if JVET_Q0819_PH_CHANGES + } + else + { + pcSlice->setSliceType(I_SLICE); + } + if (!picHeader->getPicIntraSliceAllowedFlag()) + { + CHECK(pcSlice->getSliceType() == I_SLICE, "when pic_intra_slice_allowed_flag = 0, no I_Slice is allowed"); + } +#endif #if JVET_Q0155_COLOUR_ID // 4:4:4 colour plane ID if( sps->getSeparateColourPlaneFlag() ) diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index a86c201dd99365b8d263a714863a8a8d9f0696c7..5cce0a921653af882c61b31150f982bab0b0fe3e 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -2029,7 +2029,11 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, picHeader->setSPSId( pcPic->cs->pps->getSPSId() ); picHeader->setPPSId( pcPic->cs->pps->getPPSId() ); picHeader->setSplitConsOverrideFlag(false); - +#if JVET_Q0819_PH_CHANGES + // initial two flags to be false + picHeader->setPicInterSliceAllowedFlag(false); + picHeader->setPicIntraSliceAllowedFlag(false); +#endif #if ER_CHROMA_QP_WCG_PPS // th this is a hot fix for the choma qp control if( m_pcEncLib->getWCGChromaQPControl().isEnabled() && m_pcEncLib->getSwitchPOC() != -1 ) @@ -2089,6 +2093,18 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, { pcSlice->setSliceType(I_SLICE); } + +#if JVET_Q0819_PH_CHANGES + // set two flags according to slice type presented in the picture + if (pcSlice->getSliceType() != I_SLICE) + { + picHeader->setPicInterSliceAllowedFlag(true); + } + if (pcSlice->getSliceType() == I_SLICE) + { + picHeader->setPicIntraSliceAllowedFlag(true); + } +#endif // Set the nal unit type pcSlice->setNalUnitType(getNalUnitType(pocCurr, m_iLastIDR, isField)); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 56f5f143f2deacb871e90ce5fc3f4bedfa8b6906..f3570c8db3a4d5e977e86c6c5b6dfe3793f61b7b 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]" ); @@ -776,13 +779,21 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_FLAG( 0, "separate_colour_plane_flag"); } +#if JVET_Q0043_RPR_and_Subpics + WRITE_FLAG( pcSPS->getRprEnabledFlag(), "res_change_in_clvs_allowed_flag" ); +#else WRITE_FLAG( pcSPS->getRprEnabledFlag(), "ref_pic_resampling_enabled_flag" ); +#endif WRITE_UVLC( pcSPS->getMaxPicWidthInLumaSamples(), "pic_width_max_in_luma_samples" ); WRITE_UVLC( pcSPS->getMaxPicHeightInLumaSamples(), "pic_height_max_in_luma_samples" ); WRITE_CODE(floorLog2(pcSPS->getCTUSize()) - 5, 2, "sps_log2_ctu_size_minus5"); +#if JVET_Q0043_RPR_and_Subpics + WRITE_FLAG(pcSPS->getSubPicPresentFlag(), "subpic_info_present_flag"); +#else WRITE_FLAG(pcSPS->getSubPicPresentFlag(), "subpics_present_flag"); +#endif if(pcSPS->getSubPicPresentFlag()) { WRITE_CODE(pcSPS->getNumSubPics() - 1, 8, "sps_num_subpics_minus1"); @@ -830,6 +841,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]" ); @@ -1315,7 +1329,14 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) #endif CodingStructure& cs = *picHeader->getPic()->cs; - +#if JVET_Q0819_PH_CHANGES + // Q0781, two-flags + WRITE_FLAG(picHeader->getPicInterSliceAllowedFlag(), "pic_inter_slice_allowed_flag"); + if (picHeader->getPicInterSliceAllowedFlag()) + { + WRITE_FLAG(picHeader->getPicIntraSliceAllowedFlag(), "pic_intra_slice_allowed_flag"); + } +#endif WRITE_FLAG(picHeader->getNonReferencePictureFlag(), "non_reference_picture_flag"); WRITE_FLAG(picHeader->getGdrPicFlag(), "gdr_pic_flag"); WRITE_FLAG(picHeader->getNoOutputOfPriorPicsFlag(), "no_output_of_prior_pics_flag"); @@ -1357,6 +1378,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]" ); @@ -1516,6 +1540,16 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) if (sps->getSplitConsOverrideEnabledFlag()) { WRITE_FLAG(picHeader->getSplitConsOverrideFlag(), "partition_constraints_override_flag"); +#if JVET_Q0819_PH_CHANGES + } + else + { + picHeader->setSplitConsOverrideFlag(0); + } + // Q0781, two-flags + if (picHeader->getPicIntraSliceAllowedFlag()) + { +#endif if (picHeader->getSplitConsOverrideFlag()) { WRITE_UVLC(floorLog2(picHeader->getMinQTSize(I_SLICE)) - sps->getLog2MinCodingBlockSize(), "pic_log2_diff_min_qt_min_cb_intra_slice_luma"); @@ -1529,15 +1563,14 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) WRITE_UVLC(floorLog2(picHeader->getMaxBTSize(I_SLICE)) - floorLog2(picHeader->getMinQTSize(I_SLICE)), "pic_log2_diff_max_bt_min_qt_intra_slice_luma"); WRITE_UVLC(floorLog2(picHeader->getMaxTTSize(I_SLICE)) - floorLog2(picHeader->getMinQTSize(I_SLICE)), "pic_log2_diff_max_tt_min_qt_intra_slice_luma"); } -#if JVET_Q0819_PH_CHANGES - WRITE_UVLC(floorLog2(picHeader->getMinQTSize(P_SLICE)) - sps->getLog2MinCodingBlockSize(), "pic_log2_diff_min_qt_min_cb_inter_slice"); - WRITE_UVLC(picHeader->getMaxMTTHierarchyDepth(P_SLICE), "pic_max_mtt_hierarchy_depth_inter_slice"); -#endif + +#if !JVET_Q0819_PH_CHANGES if (picHeader->getMaxMTTHierarchyDepth(P_SLICE) != 0) { WRITE_UVLC(floorLog2(picHeader->getMaxBTSize(P_SLICE)) - floorLog2(picHeader->getMinQTSize(P_SLICE)), "pic_log2_diff_max_bt_min_qt_inter_slice"); WRITE_UVLC(floorLog2(picHeader->getMaxTTSize(P_SLICE)) - floorLog2(picHeader->getMinQTSize(P_SLICE)), "pic_log2_diff_max_tt_min_qt_inter_slice"); } +#endif if (sps->getUseDualITree()) { WRITE_UVLC(floorLog2(picHeader->getMinQTSize(I_SLICE, CHANNEL_TYPE_CHROMA)) - sps->getLog2MinCodingBlockSize(), "pic_log2_diff_min_qt_min_cb_intra_slice_chroma"); @@ -1550,6 +1583,7 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) } } } +#if !JVET_Q0819_PH_CHANGES else { picHeader->setSplitConsOverrideFlag(0); @@ -1563,141 +1597,198 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader ) picHeader->setMaxBTSizes(sps->getMaxBTSizes()); picHeader->setMaxTTSizes(sps->getMaxTTSizes()); } - - // delta quantization and chrom and chroma offset - if (pps->getUseDQP()) - { - WRITE_UVLC( picHeader->getCuQpDeltaSubdivIntra(), "pic_cu_qp_delta_subdiv_intra_slice" ); - WRITE_UVLC( picHeader->getCuQpDeltaSubdivInter(), "pic_cu_qp_delta_subdiv_inter_slice" ); - } - else - { - picHeader->setCuQpDeltaSubdivIntra( 0 ); - picHeader->setCuQpDeltaSubdivInter( 0 ); - } - if (pps->getCuChromaQpOffsetEnabledFlag()) +#endif +#if JVET_Q0819_PH_CHANGES + if (picHeader->getPicIntraSliceAllowedFlag()) { - WRITE_UVLC( picHeader->getCuChromaQpOffsetSubdivIntra(), "pic_cu_chroma_qp_offset_subdiv_intra_slice" ); - WRITE_UVLC( picHeader->getCuChromaQpOffsetSubdivInter(), "pic_cu_chroma_qp_offset_subdiv_inter_slice" ); +#endif + // delta quantization and chrom and chroma offset + if (pps->getUseDQP()) + { + WRITE_UVLC( picHeader->getCuQpDeltaSubdivIntra(), "pic_cu_qp_delta_subdiv_intra_slice" ); +#if !JVET_Q0819_PH_CHANGES + WRITE_UVLC( picHeader->getCuQpDeltaSubdivInter(), "pic_cu_qp_delta_subdiv_inter_slice" ); +#endif + } + else + { + picHeader->setCuQpDeltaSubdivIntra( 0 ); +#if !JVET_Q0819_PH_CHANGES + picHeader->setCuQpDeltaSubdivInter( 0 ); +#endif + } + if (pps->getCuChromaQpOffsetEnabledFlag()) + { + WRITE_UVLC( picHeader->getCuChromaQpOffsetSubdivIntra(), "pic_cu_chroma_qp_offset_subdiv_intra_slice" ); +#if !JVET_Q0819_PH_CHANGES + WRITE_UVLC( picHeader->getCuChromaQpOffsetSubdivInter(), "pic_cu_chroma_qp_offset_subdiv_inter_slice" ); +#endif + } + else + { + picHeader->setCuChromaQpOffsetSubdivIntra( 0 ); +#if !JVET_Q0819_PH_CHANGES + picHeader->setCuChromaQpOffsetSubdivInter( 0 ); +#endif + } +#if JVET_Q0819_PH_CHANGES } - else + + + if (picHeader->getPicInterSliceAllowedFlag()) { - picHeader->setCuChromaQpOffsetSubdivIntra( 0 ); - picHeader->setCuChromaQpOffsetSubdivInter( 0 ); - } - + if (picHeader->getSplitConsOverrideFlag()) + { + WRITE_UVLC(floorLog2(picHeader->getMinQTSize(P_SLICE)) - sps->getLog2MinCodingBlockSize(), "pic_log2_diff_min_qt_min_cb_inter_slice"); + WRITE_UVLC(picHeader->getMaxMTTHierarchyDepth(P_SLICE), "pic_max_mtt_hierarchy_depth_inter_slice"); + if (picHeader->getMaxMTTHierarchyDepth(P_SLICE) != 0) + { + WRITE_UVLC(floorLog2(picHeader->getMaxBTSize(P_SLICE)) - floorLog2(picHeader->getMinQTSize(P_SLICE)), "pic_log2_diff_max_bt_min_qt_inter_slice"); + WRITE_UVLC(floorLog2(picHeader->getMaxTTSize(P_SLICE)) - floorLog2(picHeader->getMinQTSize(P_SLICE)), "pic_log2_diff_max_tt_min_qt_inter_slice"); + } + } + + // delta quantization and chrom and chroma offset + if (pps->getUseDQP()) + { + WRITE_UVLC(picHeader->getCuQpDeltaSubdivInter(), "pic_cu_qp_delta_subdiv_inter_slice"); + } + else + { + picHeader->setCuQpDeltaSubdivInter(0); + } + if (pps->getCuChromaQpOffsetEnabledFlag()) + { + WRITE_UVLC(picHeader->getCuChromaQpOffsetSubdivInter(), "pic_cu_chroma_qp_offset_subdiv_inter_slice"); + } + else + { + picHeader->setCuChromaQpOffsetSubdivInter(0); + } +#endif // temporal motion vector prediction - if (sps->getSPSTemporalMVPEnabledFlag()) - { - WRITE_FLAG( picHeader->getEnableTMVPFlag(), "pic_temporal_mvp_enabled_flag" ); - } - else - { - picHeader->setEnableTMVPFlag(false); - } + if (sps->getSPSTemporalMVPEnabledFlag()) + { + WRITE_FLAG( picHeader->getEnableTMVPFlag(), "pic_temporal_mvp_enabled_flag" ); + } + else + { + picHeader->setEnableTMVPFlag(false); + } // mvd L1 zero flag - if (!pps->getPPSMvdL1ZeroIdc()) - { - WRITE_FLAG(picHeader->getMvdL1ZeroFlag(), "pic_mvd_l1_zero_flag"); - } - else - { - picHeader->setMvdL1ZeroFlag( pps->getPPSMvdL1ZeroIdc() - 1 ); - } + if (!pps->getPPSMvdL1ZeroIdc()) + { + WRITE_FLAG(picHeader->getMvdL1ZeroFlag(), "pic_mvd_l1_zero_flag"); + } + else + { + picHeader->setMvdL1ZeroFlag( pps->getPPSMvdL1ZeroIdc() - 1 ); + } // merge candidate list size - if (!pps->getPPSSixMinusMaxNumMergeCandPlus1()) - { - CHECK(picHeader->getMaxNumMergeCand() > MRG_MAX_NUM_CANDS, "More merge candidates signalled than supported"); - WRITE_UVLC(MRG_MAX_NUM_CANDS - picHeader->getMaxNumMergeCand(), "pic_six_minus_max_num_merge_cand"); - } - else - { - picHeader->setMaxNumMergeCand(MRG_MAX_NUM_CANDS - (pps->getPPSSixMinusMaxNumMergeCandPlus1() - 1)); - } + if (!pps->getPPSSixMinusMaxNumMergeCandPlus1()) + { + CHECK(picHeader->getMaxNumMergeCand() > MRG_MAX_NUM_CANDS, "More merge candidates signalled than supported"); + WRITE_UVLC(MRG_MAX_NUM_CANDS - picHeader->getMaxNumMergeCand(), "pic_six_minus_max_num_merge_cand"); + } + else + { + picHeader->setMaxNumMergeCand(MRG_MAX_NUM_CANDS - (pps->getPPSSixMinusMaxNumMergeCandPlus1() - 1)); + } // subblock merge candidate list size - if ( sps->getUseAffine() ) - { - CHECK( picHeader->getMaxNumAffineMergeCand() > AFFINE_MRG_MAX_NUM_CANDS, "More affine merge candidates signalled than supported" ); - WRITE_UVLC(AFFINE_MRG_MAX_NUM_CANDS - picHeader->getMaxNumAffineMergeCand(), "pic_five_minus_max_num_subblock_merge_cand"); - } - else - { - picHeader->setMaxNumAffineMergeCand( sps->getSBTMVPEnabledFlag() && picHeader->getEnableTMVPFlag() ); - } + if ( sps->getUseAffine() ) + { + CHECK( picHeader->getMaxNumAffineMergeCand() > AFFINE_MRG_MAX_NUM_CANDS, "More affine merge candidates signalled than supported" ); + WRITE_UVLC(AFFINE_MRG_MAX_NUM_CANDS - picHeader->getMaxNumAffineMergeCand(), "pic_five_minus_max_num_subblock_merge_cand"); + } + else + { + picHeader->setMaxNumAffineMergeCand( sps->getSBTMVPEnabledFlag() && picHeader->getEnableTMVPFlag() ); + } // full-pel MMVD flag - if (sps->getFpelMmvdEnabledFlag()) - { - WRITE_FLAG( picHeader->getDisFracMMVD(), "pic_fpel_mmvd_enabled_flag" ); - } - else - { - picHeader->setDisFracMMVD(false); - } + if (sps->getFpelMmvdEnabledFlag()) + { + WRITE_FLAG( picHeader->getDisFracMMVD(), "pic_fpel_mmvd_enabled_flag" ); + } + else + { + picHeader->setDisFracMMVD(false); + } // picture level BDOF disable flags - if (sps->getBdofControlPresentFlag()) - { - WRITE_FLAG(picHeader->getDisBdofFlag(), "pic_disable_bdof_flag"); - } - else - { - picHeader->setDisBdofFlag(0); - } + if (sps->getBdofControlPresentFlag()) + { + WRITE_FLAG(picHeader->getDisBdofFlag(), "pic_disable_bdof_flag"); + } + else + { + picHeader->setDisBdofFlag(0); + } // picture level DMVR disable flags - if (sps->getDmvrControlPresentFlag()) - { - WRITE_FLAG(picHeader->getDisDmvrFlag(), "pic_disable_dmvr_flag"); - } - else - { - picHeader->setDisDmvrFlag(0); - } + if (sps->getDmvrControlPresentFlag()) + { + WRITE_FLAG(picHeader->getDisDmvrFlag(), "pic_disable_dmvr_flag"); + } + else + { + picHeader->setDisDmvrFlag(0); + } // picture level PROF disable flags - if (sps->getProfControlPresentFlag()) - { - WRITE_FLAG(picHeader->getDisProfFlag(), "pic_disable_prof_flag"); - } - else - { - picHeader->setDisProfFlag(0); - } + if (sps->getProfControlPresentFlag()) + { + WRITE_FLAG(picHeader->getDisProfFlag(), "pic_disable_prof_flag"); + } + else + { + picHeader->setDisProfFlag(0); + } #if !JVET_Q0806 // triangle merge candidate list size - if (sps->getUseTriangle() && picHeader->getMaxNumMergeCand() >= 2) - { - if (!pps->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1()) + if (sps->getUseTriangle() && picHeader->getMaxNumMergeCand() >= 2) { - CHECK(picHeader->getMaxNumMergeCand() < picHeader->getMaxNumTriangleCand(), "Incorrrect max number of triangle candidates!"); - WRITE_UVLC(picHeader->getMaxNumMergeCand() - picHeader->getMaxNumTriangleCand(), "pic_max_num_merge_cand_minus_max_num_triangle_cand"); + if (!pps->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1()) + { + CHECK(picHeader->getMaxNumMergeCand() < picHeader->getMaxNumTriangleCand(), "Incorrrect max number of triangle candidates!"); + WRITE_UVLC(picHeader->getMaxNumMergeCand() - picHeader->getMaxNumTriangleCand(), "pic_max_num_merge_cand_minus_max_num_triangle_cand"); + } + else + { + picHeader->setMaxNumTriangleCand((uint32_t)(picHeader->getMaxNumMergeCand() - (pps->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1() - 1))); + } } - else - { - picHeader->setMaxNumTriangleCand((uint32_t)(picHeader->getMaxNumMergeCand() - (pps->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1() - 1))); - } - } + #else // geometric merge candidate list size - if (sps->getUseGeo() && picHeader->getMaxNumMergeCand() >= 2) - { - if (!pps->getPPSMaxNumMergeCandMinusMaxNumGeoCandPlus1()) - { - CHECK(picHeader->getMaxNumMergeCand() < picHeader->getMaxNumGeoCand(), "Incorrrect max number of gpm candidates!"); - WRITE_UVLC(picHeader->getMaxNumMergeCand() - picHeader->getMaxNumGeoCand(), "pic_max_num_merge_cand_minus_max_num_gpm_cand"); - } - else + if (sps->getUseGeo() && picHeader->getMaxNumMergeCand() >= 2) { + if (!pps->getPPSMaxNumMergeCandMinusMaxNumGeoCandPlus1()) + { + CHECK(picHeader->getMaxNumMergeCand() < picHeader->getMaxNumGeoCand(), "Incorrrect max number of gpm candidates!"); + WRITE_UVLC(picHeader->getMaxNumMergeCand() - picHeader->getMaxNumGeoCand(), "pic_max_num_merge_cand_minus_max_num_gpm_cand"); + } + else + { picHeader->setMaxNumGeoCand((uint32_t)(picHeader->getMaxNumMergeCand() - (pps->getPPSMaxNumMergeCandMinusMaxNumGeoCandPlus1() - 1))); + } } +#endif +#if JVET_Q0819_PH_CHANGES + } + // inherit constraint values from SPS + if (!sps->getSplitConsOverrideEnabledFlag() || !picHeader->getSplitConsOverrideFlag()) + { + picHeader->setMinQTSizes(sps->getMinQTSizes()); + picHeader->setMaxMTTHierarchyDepths(sps->getMaxMTTHierarchyDepths()); + picHeader->setMaxBTSizes(sps->getMaxBTSizes()); + picHeader->setMaxTTSizes(sps->getMaxTTSizes()); } #endif - // ibc merge candidate list size if (sps->getIBCFlag()) { @@ -2017,9 +2108,18 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) } } - - WRITE_UVLC( pcSlice->getSliceType(), "slice_type" ); - +#if JVET_Q0819_PH_CHANGES + if (picHeader->getPicInterSliceAllowedFlag()) + { +#endif + WRITE_UVLC(pcSlice->getSliceType(), "slice_type"); +#if JVET_Q0819_PH_CHANGES + } + if (!picHeader->getPicIntraSliceAllowedFlag()) + { + CHECK(pcSlice->getSliceType() == I_SLICE, "when pic_intra_slice_allowed_flag = 0, no I_Slice is allowed"); + } +#endif #if JVET_Q0155_COLOUR_ID // 4:4:4 colour plane ID if( pcSlice->getSPS()->getSeparateColourPlaneFlag() )