diff --git a/cfg/encoder_intra_vtm.cfg b/cfg/encoder_intra_vtm.cfg index f413f709f24bc97f8e0f08bba8119222f080a18b..2a053c992fba3cc0768c66b3697d879b3f699297 100644 --- a/cfg/encoder_intra_vtm.cfg +++ b/cfg/encoder_intra_vtm.cfg @@ -100,6 +100,7 @@ LMCSEnable : 1 # LMCS: 0: disable, 1:enable LMCSSignalType : 0 # Input signal type: 0:SDR, 1:HDR-PQ, 2:HDR-HLG LMCSUpdateCtrl : 1 # LMCS model update control: 0:RA, 1:AI, 2:LDB/LDP LMCSOffset : 2 # chroma residual scaling offset +MRL : 1 MIP : 1 JointCbCr : 1 # joint coding of chroma residuals (if available): 0: disable, 1: enable ChromaTS : 1 diff --git a/cfg/encoder_lowdelay_P_vtm.cfg b/cfg/encoder_lowdelay_P_vtm.cfg index e3a15ee59aa81ad5c0ea271dbf0c0412d1eeb32b..caea7e3b634aca301a32073e5f177110c3b3ace2 100644 --- a/cfg/encoder_lowdelay_P_vtm.cfg +++ b/cfg/encoder_lowdelay_P_vtm.cfg @@ -124,6 +124,7 @@ LMCSEnable : 1 # LMCS: 0: disable, 1:enable LMCSSignalType : 0 # Input signal type: 0:SDR, 1:HDR-PQ, 2:HDR-HLG LMCSUpdateCtrl : 2 # LMCS model update control: 0:RA, 1:AI, 2:LDB/LDP LMCSOffset : 1 # chroma residual scaling offset +MRL : 1 MIP : 0 JointCbCr : 1 # joint coding of chroma residuals (if available): 0: disable, 1: enable PROF : 1 diff --git a/cfg/encoder_lowdelay_vtm.cfg b/cfg/encoder_lowdelay_vtm.cfg index 35fe96c089d4ba75c39c16a8b0a677b7e02e0c43..5898b6fc0a8ab84ebaa6fef6de0075ba99b0f4b4 100644 --- a/cfg/encoder_lowdelay_vtm.cfg +++ b/cfg/encoder_lowdelay_vtm.cfg @@ -128,6 +128,7 @@ LMCSEnable : 1 # LMCS: 0: disable, 1:enable LMCSSignalType : 0 # Input signal type: 0:SDR, 1:HDR-PQ, 2:HDR-HLG LMCSUpdateCtrl : 2 # LMCS model update control: 0:RA, 1:AI, 2:LDB/LDP LMCSOffset : 1 # chroma residual scaling offset +MRL : 1 MIP : 0 JointCbCr : 1 # joint coding of chroma residuals (if available): 0: disable, 1: enable PROF : 1 diff --git a/cfg/encoder_randomaccess_vtm.cfg b/cfg/encoder_randomaccess_vtm.cfg index 58a684e9e9e6dd93902405de46866490ab913b0d..c5b87e8d29fa68737487bbd5d77cc414cf09fea9 100644 --- a/cfg/encoder_randomaccess_vtm.cfg +++ b/cfg/encoder_randomaccess_vtm.cfg @@ -141,6 +141,7 @@ LMCSEnable : 1 # LMCS: 0: disable, 1:enable LMCSSignalType : 0 # Input signal type: 0:SDR, 1:HDR-PQ, 2:HDR-HLG LMCSUpdateCtrl : 0 # LMCS model update control: 0:RA, 1:AI, 2:LDB/LDP LMCSOffset : 6 # chroma residual scaling offset +MRL : 1 MIP : 1 DMVR : 1 SMVD : 1 diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg index fb5b259b9b3fce7a05c331b20fb90ac4282424ce..e2352c36ece776ca045ec697152555cbba14aa47 100644 --- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg +++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RasterScanSlice.cfg @@ -140,6 +140,7 @@ AffineAmvr : 1 LMCSEnable : 1 # LMCS: 0: disable, 1:enable LMCSSignalType : 0 # Input signal type: 0:SDR, 1:HDR-PQ, 2:HDR-HLG LMCSUpdateCtrl : 0 # LMCS model update control: 0:RA, 1:AI, 2:LDB/LDP +MRL : 1 MIP : 1 DMVR : 1 SMVD : 1 diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg index 952231c63457de9f6c08f55f3e495eea2a1bfd4d..abe82d62af9e3dca34c02a448efe080623ededfb 100644 --- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg +++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSlice.cfg @@ -140,6 +140,7 @@ AffineAmvr : 1 LMCSEnable : 1 # LMCS: 0: disable, 1:enable LMCSSignalType : 0 # Input signal type: 0:SDR, 1:HDR-PQ, 2:HDR-HLG LMCSUpdateCtrl : 0 # LMCS model update control: 0:RA, 1:AI, 2:LDB/LDP +MRL : 1 MIP : 1 DMVR : 1 SMVD : 1 diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSliceFixedSize.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSliceFixedSize.cfg index d939ef9370c56ef545e0b6fa59291b61f420685d..136ac9e0ef1cd1ccf6a588ff325dbc12fb9d6e7a 100644 --- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSliceFixedSize.cfg +++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_RectangularSliceFixedSize.cfg @@ -141,6 +141,7 @@ AffineAmvr : 1 LMCSEnable : 1 # LMCS: 0: disable, 1:enable LMCSSignalType : 0 # Input signal type: 0:SDR, 1:HDR-PQ, 2:HDR-HLG LMCSUpdateCtrl : 0 # LMCS model update control: 0:RA, 1:AI, 2:LDB/LDP +MRL : 1 MIP : 1 DMVR : 1 SMVD : 1 diff --git a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg index 4dabdcdb88251f43a63290b5d73e003e36b37702..d575d71f55bbe3f91cae79bf187162e550b73479 100644 --- a/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg +++ b/cfg/nonCTC-SliceConfigExamples/encoder_randomaccess_vtm_SingleTilePerSlice.cfg @@ -138,6 +138,7 @@ AffineAmvr : 1 LMCSEnable : 1 # LMCS: 0: disable, 1:enable LMCSSignalType : 0 # Input signal type: 0:SDR, 1:HDR-PQ, 2:HDR-HLG LMCSUpdateCtrl : 0 # LMCS model update control: 0:RA, 1:AI, 2:LDB/LDP +MRL : 1 MIP : 1 DMVR : 1 SMVD : 1 diff --git a/doc/software-manual.tex b/doc/software-manual.tex index 17486fbb01036b6f841a0ec9050e6f4064fe8dcf..f864515a94127c49a2720d74886d0e70aac5c236 100755 --- a/doc/software-manual.tex +++ b/doc/software-manual.tex @@ -1874,6 +1874,12 @@ Specifies the locations of the horizontal virtual boundaries in units of luma sa \begin{OptionTableNoShorthand}{Coding tools parameters}{tab:coding-tools} +\Option{MRL} & +%\ShortOption{\None} & +\Default{false} & +Enables or disables the use of multiple reference line intra prediction (MRL). +\\ + \Option{MIP} & %\ShortOption{\None} & \Default{true} & diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 849c8fae46cdc03e70f730e4b63042c5ea3d435c..eeb2776f9215005c5150069a7ff9d1d69d763c43 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -401,6 +401,9 @@ void EncApp::xInitLibCfg() m_cEncLib.setUseNonLinearAlfLuma ( m_useNonLinearAlfLuma ); m_cEncLib.setUseNonLinearAlfChroma ( m_useNonLinearAlfChroma ); m_cEncLib.setMaxNumAlfAlternativesChroma ( m_maxNumAlfAlternativesChroma ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + m_cEncLib.setUseMRL ( m_MRL ); +#endif m_cEncLib.setUseMIP ( m_MIP ); m_cEncLib.setUseFastMIP ( m_useFastMIP ); m_cEncLib.setFastLocalDualTreeMode ( m_fastLocalDualTreeMode ); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index bd377ab19e68c727ee36c9022b45abcbcc5b45be..e59d51b160778c1dddc7e665a15b3c86204025f2 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -1157,6 +1157,9 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("UseNonLinearAlfChroma", m_useNonLinearAlfChroma, true, "Non-linear adaptive loop filters for Chroma Channels") ("MaxNumAlfAlternativesChroma", m_maxNumAlfAlternativesChroma, (unsigned)MAX_NUM_ALF_ALTERNATIVES_CHROMA, std::string("Maximum number of alternative Chroma filters (1-") + std::to_string(MAX_NUM_ALF_ALTERNATIVES_CHROMA) + std::string (", inclusive)") ) +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + ("MRL", m_MRL, false, "Enable MRL (multiple reference line intra prediction)") +#endif ("MIP", m_MIP, true, "Enable MIP (matrix-based intra prediction)") ("FastMIP", m_useFastMIP, false, "Fast encoder search for MIP (matrix-based intra prediction)") ("FastLocalDualTreeMode", m_fastLocalDualTreeMode, 0, "Fast intra pass coding for local dual-tree in intra coding region, 0: off, 1: use threshold, 2: one intra mode only") @@ -4090,6 +4093,9 @@ bool EncAppCfg::xCheckParameter() } #endif +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + xConfirmPara(m_TransquantBypassEnabledFlag , "TransquantBypassEnableFlag is not supported in VVC"); +#endif xConfirmPara(!m_TransquantBypassEnabledFlag && m_CUTransquantBypassFlagForce, "CUTransquantBypassFlagForce cannot be 1 when TransquantBypassEnableFlag is 0"); #if HEVC_SEI @@ -4470,6 +4476,9 @@ void EncAppCfg::xPrintParameter() #endif msg(VERBOSE, ") "); } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + msg(VERBOSE, "MRL:%d ", m_MRL); +#endif msg(VERBOSE, "MIP:%d ", m_MIP); msg(VERBOSE, "EncDbOpt:%d ", m_encDbOpt); msg( VERBOSE, "\nFAST TOOL CFG: " ); diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 1843824a8fa939fc23151c94453e924d51b15475..516b48c298808b800315304e24fdec975d68cb2a 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -376,6 +376,9 @@ protected: bool m_useNonLinearAlfLuma; bool m_useNonLinearAlfChroma; unsigned m_maxNumAlfAlternativesChroma; +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + bool m_MRL; +#endif bool m_MIP; bool m_useFastMIP; int m_fastLocalDualTreeMode; diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 7cf799322c155d9fb4f71158a890dc8894c01510..f20409953431e674d642518c7894345016eed2d0 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -2114,6 +2114,9 @@ SPS::SPS() , m_LadfQpOffset { 0 } , m_LadfIntervalLowerBound { 0 } #endif +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES +, m_MRL ( false ) +#endif , m_MIP ( false ) , m_GDREnabledFlag ( true ) , m_SubLayerCbpParametersPresentFlag ( true ) diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index d5e2825a4b48a6e10ef6b11769d56719d22db65d..04d7f4640349f41da4bbdce368f163049bdcf968 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -1110,6 +1110,9 @@ private: int m_LadfNumIntervals; int m_LadfQpOffset[MAX_LADF_INTERVALS]; int m_LadfIntervalLowerBound[MAX_LADF_INTERVALS]; +#endif +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + bool m_MRL; #endif bool m_MIP; ChromaQpMappingTable m_chromaQpMappingTable; @@ -1424,6 +1427,10 @@ public: bool getUseMHIntra () const { return m_MHIntra; } void setUseTriangle ( bool b ) { m_Triangle = b; } bool getUseTriangle () const { return m_Triangle; } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + void setUseMRL ( bool b ) { m_MRL = b; } + bool getUseMRL () const { return m_MRL; } +#endif void setUseMIP ( bool b ) { m_MIP = b; } bool getUseMIP () const { return m_MIP; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index b9914d84d2717b05ff45adb593c3f445463b83d2..e2ac3e482a1452959cbe019cdd597cd4e507ac5e 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,8 @@ #include <assert.h> #include <cassert> +#define JVET_P2001_SYNTAX_ORDER_MISMATCHES 1 // JVET-P2001: Rearrange SPS/PPS syntax to match JVET-P2001 draft text + #define JVET_P0126_SIGNALLING_SUBPICID 1 // JVET-P0126: Signalling of subpicture IDs #define JVET_P1004_REMOVE_BRICKS 1 // JVET-P1004: Removal of bricks diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp index ec7a33c8c6beb9e7db3e4e025abb3aae9915f404..d4ae962efbf5e0c1646a805d9a843743cdbfd0f4 100644 --- a/source/Lib/DecoderLib/CABACReader.cpp +++ b/source/Lib/DecoderLib/CABACReader.cpp @@ -1483,6 +1483,14 @@ void CABACReader::extend_ref_line(CodingUnit& cu) for (int k = 0; k < numBlocks; k++) { +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + if( !cu.cs->sps->getUseMRL() ) + { + pu->multiRefIdx = 0; + pu = pu->next; + continue; + } +#endif bool isFirstLineOfCtu = (((cu.block(COMPONENT_Y).y)&((cu.cs->sps)->getMaxCUWidth() - 1)) == 0); if (isFirstLineOfCtu) { diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index f5db1f576386c67b19ccd9ec618c95a478223eb2..4537af73fb91efd0d93371e5ac8e24d3b03e7510 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -546,6 +546,9 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana READ_CODE(1, uiCode, "loop_filter_across_slices_enabled_flag"); pcPPS->setLoopFilterAcrossSlicesEnabledFlag( uiCode == 1 ); } +#endif +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG(uiCode, "entropy_coding_sync_enabled_flag"); pcPPS->setEntropyCodingSyncEnabledFlag(uiCode == 1); #endif READ_FLAG( uiCode, "cabac_init_present_flag" ); pcPPS->setCabacInitPresentFlag( uiCode ? true : false ); @@ -560,6 +563,7 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana READ_FLAG(uiCode, "rpl1_idx_present_flag"); pcPPS->setRpl1IdxPresentFlag(uiCode); +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES READ_FLAG( uiCode, "constant_slice_header_params_enabled_flag"); pcPPS->setConstantSliceHeaderParamsEnabledFlag(uiCode); if ( pcPPS->getConstantSliceHeaderParamsEnabledFlag() ) { READ_CODE( 2, uiCode, "pps_dep_quant_enabled_idc"); pcPPS->setPPSDepQuantEnabledIdc(uiCode); @@ -592,6 +596,7 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana #endif pcPPS->setPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1(0); } +#endif READ_SVLC(iCode, "init_qp_minus26" ); pcPPS->setPicInitQPMinus26(iCode); if (parameterSetManager->getSPS(pcPPS->getSPSId())->getTransformSkipEnabledFlag()) @@ -697,9 +702,14 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana READ_FLAG( uiCode, "weighted_bipred_flag" ); // Use of Bi-Directional Weighting Prediction (B_SLICE) pcPPS->setWPBiPred( uiCode==1 ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + // transquant_bypass is not supported in VVC + pcPPS->setTransquantBypassEnabledFlag(false); +#else READ_FLAG( uiCode, "transquant_bypass_enabled_flag"); pcPPS->setTransquantBypassEnabledFlag(uiCode ? true : false); +#endif #if !JVET_P1004_REMOVE_BRICKS READ_FLAG( uiCode, "single_tile_in_pic_flag" ); pcPPS->setSingleTileInPicFlag(uiCode == 1); @@ -963,8 +973,10 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana #endif +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES READ_FLAG(uiCode, "entropy_coding_sync_enabled_flag"); pcPPS->setEntropyCodingSyncEnabledFlag(uiCode == 1); +#endif READ_FLAG( uiCode, "deblocking_filter_control_present_flag" ); pcPPS->setDeblockingFilterControlPresentFlag( uiCode ? true : false ); if(pcPPS->getDeblockingFilterControlPresentFlag()) { @@ -976,6 +988,40 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana READ_SVLC ( iCode, "pps_tc_offset_div2" ); pcPPS->setDeblockingFilterTcOffsetDiv2( iCode ); } } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG( uiCode, "constant_slice_header_params_enabled_flag"); pcPPS->setConstantSliceHeaderParamsEnabledFlag(uiCode); + if ( pcPPS->getConstantSliceHeaderParamsEnabledFlag() ) { + READ_CODE( 2, uiCode, "pps_dep_quant_enabled_idc"); pcPPS->setPPSDepQuantEnabledIdc(uiCode); + READ_CODE( 2, uiCode, "pps_ref_pic_list_sps_idc[0]"); pcPPS->setPPSRefPicListSPSIdc0(uiCode); + READ_CODE( 2, uiCode, "pps_ref_pic_list_sps_idc[1]"); pcPPS->setPPSRefPicListSPSIdc1(uiCode); +#if !JVET_P0206_TMVP_flags + READ_CODE( 2, uiCode, "pps_temporal_mvp_enabled_idc"); pcPPS->setPPSTemporalMVPEnabledIdc(uiCode); +#endif + READ_CODE( 2, uiCode, "pps_mvd_l1_zero_idc"); pcPPS->setPPSMvdL1ZeroIdc(uiCode); + READ_CODE( 2, uiCode, "pps_collocated_from_l0_idc"); pcPPS->setPPSCollocatedFromL0Idc(uiCode); + READ_UVLC( uiCode, "pps_six_minus_max_num_merge_cand_plus1"); pcPPS->setPPSSixMinusMaxNumMergeCandPlus1(uiCode); +#if !JVET_P0152_REMOVE_PPS_NUM_SUBBLOCK_MERGE_CAND + READ_UVLC( uiCode, "pps_five_minus_max_num_subblock_merge_cand_plus1"); pcPPS->setPPSFiveMinusMaxNumSubblockMergeCandPlus1(uiCode); +#endif + READ_UVLC( uiCode, "pps_max_num_merge_cand_minus_max_num_triangle_cand_plus1");pcPPS->setPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1(uiCode); + } + else + { + pcPPS->setPPSDepQuantEnabledIdc(0); + pcPPS->setPPSRefPicListSPSIdc0(0); + pcPPS->setPPSRefPicListSPSIdc1(0); +#if !JVET_P0206_TMVP_flags + pcPPS->setPPSTemporalMVPEnabledIdc(0); +#endif + pcPPS->setPPSMvdL1ZeroIdc(0); + pcPPS->setPPSCollocatedFromL0Idc(0); + pcPPS->setPPSSixMinusMaxNumMergeCandPlus1(0); +#if !JVET_P0152_REMOVE_PPS_NUM_SUBBLOCK_MERGE_CAND + pcPPS->setPPSFiveMinusMaxNumSubblockMergeCandPlus1(0); +#endif + pcPPS->setPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1(0); + } +#endif #if !JVET_P1006_PICTURE_HEADER READ_FLAG( uiCode, "pps_loop_filter_across_virtual_boundaries_disabled_flag" ); pcPPS->setLoopFilterAcrossVirtualBoundariesDisabledFlag( uiCode != 0 ); @@ -1403,6 +1449,15 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_UVLC( uiCode, "pic_width_max_in_luma_samples" ); pcSPS->setMaxPicWidthInLumaSamples( uiCode ); READ_UVLC( uiCode, "pic_height_max_in_luma_samples" ); pcSPS->setMaxPicHeightInLumaSamples( uiCode ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_CODE(2, uiCode, "sps_log2_ctu_size_minus5"); pcSPS->setCTUSize(1 << (uiCode + 5)); + CHECK(uiCode > 2, "sps_log2_ctu_size_minus5 must be less than or equal to 2"); + unsigned ctbLog2SizeY = uiCode + 5; + pcSPS->setMaxCodingDepth(uiCode+3); + pcSPS->setLog2DiffMaxMinCodingBlockSize(uiCode+3); + pcSPS->setMaxCUWidth(pcSPS->getCTUSize()); + pcSPS->setMaxCUHeight(pcSPS->getCTUSize()); +#endif #if JVET_P0126_SIGNALLING_SUBPICID READ_FLAG( uiCode, "subpics_present_flag" ); pcSPS->setSubPicPresentFlag(uiCode); #endif @@ -1469,7 +1524,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_UVLC( uiCode, "log2_max_pic_order_cnt_lsb_minus4" ); pcSPS->setBitsForPOC( 4 + uiCode ); #endif CHECK(uiCode > 12, "Invalid code"); +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES READ_FLAG( uiCode, "sps_idr_rpl_present_flag" ); pcSPS->setIDRRefParamListPresent( (bool) uiCode); +#endif // KJS: Marakech decision: sub-layers added back uint32_t subLayerOrderingInfoPresentFlag; if (pcSPS->getMaxTLayers() > 1) @@ -1503,6 +1560,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) } READ_FLAG(uiCode, "long_term_ref_pics_flag"); pcSPS->setLongTermRefsPresent(uiCode); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG( uiCode, "sps_idr_rpl_present_flag" ); pcSPS->setIDRRefParamListPresent( (bool) uiCode ); +#endif READ_FLAG(uiCode, "rpl1_copy_from_rpl0_flag"); pcSPS->setRPL1CopyFromRPL0Flag(uiCode); @@ -1546,6 +1606,16 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) unsigned maxBTSize[3] = { 0, 0, 0 }; unsigned maxTTSize[3] = { 0, 0, 0 }; +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + if( pcSPS->getChromaFormatIdc() != CHROMA_400 ) + { + READ_FLAG(uiCode, "qtbtt_dual_tree_intra_flag"); pcSPS->setUseDualITree(uiCode); + } + else + { + pcSPS->setUseDualITree(0); + } +#else READ_FLAG(uiCode, "qtbtt_dual_tree_intra_flag"); pcSPS->setUseDualITree(uiCode); READ_CODE(2, uiCode, "log2_ctu_size_minus5"); pcSPS->setCTUSize(1 << (uiCode + 5)); @@ -1555,6 +1625,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) pcSPS->setLog2DiffMaxMinCodingBlockSize(uiCode+3); pcSPS->setMaxCUWidth(pcSPS->getCTUSize()); pcSPS->setMaxCUHeight(pcSPS->getCTUSize()); +#endif READ_UVLC(uiCode, "log2_min_luma_coding_block_size_minus2"); int log2MinCUSize = uiCode + 2; @@ -1707,10 +1778,45 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_FLAG( uiCode, "sps_amvr_enabled_flag" ); pcSPS->setAMVREnabledFlag ( uiCode != 0 ); READ_FLAG( uiCode, "sps_bdof_enabled_flag" ); pcSPS->setBDOFEnabledFlag ( uiCode != 0 ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES && JVET_P0314_PROF_BDOF_DMVR_HLS + if (pcSPS->getBDOFEnabledFlag()) + { + READ_FLAG(uiCode, "sps_bdof_pic_present_flag"); pcSPS->setBdofControlPresentFlag( uiCode != 0 ); + } + else { + pcSPS->setBdofControlPresentFlag( false ); + } +#endif +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG(uiCode, "sps_smvd_enabled_flag"); pcSPS->setUseSMVD( uiCode != 0 ); +#endif READ_FLAG(uiCode, "sps_dmvr_enable_flag"); pcSPS->setUseDMVR(uiCode != 0); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES && JVET_P0314_PROF_BDOF_DMVR_HLS + if (pcSPS->getUseDMVR()) + { + READ_FLAG(uiCode, "sps_dmvr_pic_present_flag"); pcSPS->setDmvrControlPresentFlag( uiCode != 0 ); + } + else { + pcSPS->setDmvrControlPresentFlag( false ); + } +#endif READ_FLAG(uiCode, "sps_mmvd_enable_flag"); pcSPS->setUseMMVD(uiCode != 0); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG(uiCode, "sps_isp_enabled_flag"); pcSPS->setUseISP( uiCode != 0 ); + READ_FLAG(uiCode, "sps_mrl_enabled_flag"); pcSPS->setUseMRL( uiCode != 0 ); + READ_FLAG(uiCode, "sps_mip_enabled_flag"); pcSPS->setUseMIP( uiCode != 0 ); + if( pcSPS->getChromaFormatIdc() != CHROMA_400) + { + READ_FLAG( uiCode, "sps_cclm_enabled_flag" ); pcSPS->setUseLMChroma( uiCode != 0 ); + } + else + { + pcSPS->setUseLMChroma(0); + } +#else // KJS: sps_cclm_enabled_flag READ_FLAG( uiCode, "lm_chroma_enabled_flag" ); pcSPS->setUseLMChroma ( uiCode != 0 ); +#endif #if JVET_P0592_CHROMA_PHASE if( pcSPS->getChromaFormatIdc() == CHROMA_420 ) { @@ -1730,17 +1836,37 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_FLAG( uiCode, "mts_intra_enabled_flag" ); pcSPS->setUseIntraMTS ( uiCode != 0 ); READ_FLAG( uiCode, "mts_inter_enabled_flag" ); pcSPS->setUseInterMTS ( uiCode != 0 ); } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG(uiCode, "sps_sbt_enabled_flag"); pcSPS->setUseSBT ( uiCode != 0 ); +#else READ_FLAG( uiCode, "lfnst_enabled_flag" ); pcSPS->setUseLFNST ( uiCode != 0 ); READ_FLAG(uiCode, "smvd_flag"); pcSPS->setUseSMVD ( uiCode != 0 ); +#endif // KJS: sps_affine_enabled_flag READ_FLAG( uiCode, "affine_flag" ); pcSPS->setUseAffine ( uiCode != 0 ); if ( pcSPS->getUseAffine() ) { READ_FLAG( uiCode, "affine_type_flag" ); pcSPS->setUseAffineType ( uiCode != 0 ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG( uiCode, "sps_affine_amvr_enabled_flag" ); pcSPS->setAffineAmvrEnabledFlag ( uiCode != 0 ); + READ_FLAG( uiCode, "sps_affine_prof_enabled_flag" ); pcSPS->setUsePROF ( uiCode != 0 ); +#if JVET_P0314_PROF_BDOF_DMVR_HLS + if (pcSPS->getUsePROF()) + { + READ_FLAG(uiCode, "sps_prof_pic_present_flag"); pcSPS->setProfControlPresentFlag ( uiCode != 0 ); + } + else { + pcSPS->setProfControlPresentFlag( false ); + } +#endif +#else READ_FLAG( uiCode, "sps_prof_enabled_flag"); pcSPS->setUsePROF ( uiCode != 0 ); READ_FLAG( uiCode, "sps_affine_amvr_enabled_flag" ); pcSPS->setAffineAmvrEnabledFlag ( uiCode != 0 ); +#endif } +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES READ_FLAG( uiCode, "gbi_flag" ); pcSPS->setUseGBi ( uiCode != 0 ); +#endif #if JVET_P0517_ADAPTIVE_COLOR_TRANSFORM if (pcSPS->getChromaFormatIdc() == CHROMA_444) { @@ -1759,6 +1885,9 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) { pcSPS->setPLTMode(false); } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG( uiCode, "sps_bcw_enabled_flag" ); pcSPS->setUseGBi( uiCode != 0 ); +#endif READ_FLAG(uiCode, "ibc_flag"); pcSPS->setIBCFlag(uiCode); // KJS: sps_ciip_enabled_flag READ_FLAG( uiCode, "mhintra_flag" ); pcSPS->setUseMHIntra ( uiCode != 0 ); @@ -1768,6 +1897,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_FLAG( uiCode, "sps_fpel_mmvd_enabled_flag" ); pcSPS->setFpelMmvdEnabledFlag ( uiCode != 0 ); } #if JVET_P0314_PROF_BDOF_DMVR_HLS +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES if (pcSPS->getBDOFEnabledFlag()) { READ_FLAG(uiCode, "sps_bdof_picture_level_present_flag"); pcSPS->setBdofControlPresentFlag(uiCode != 0); @@ -1780,6 +1910,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) { READ_FLAG(uiCode, "sps_prof_picture_level_present_flag"); pcSPS->setProfControlPresentFlag(uiCode != 0); } +#endif #else if (pcSPS->getBDOFEnabledFlag() || pcSPS->getUseDMVR()) { @@ -1789,9 +1920,11 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) READ_FLAG( uiCode, "triangle_flag" ); pcSPS->setUseTriangle ( uiCode != 0 ); +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES READ_FLAG( uiCode, "sps_mip_flag"); pcSPS->setUseMIP ( uiCode != 0 ); // KJS: not in draft yet READ_FLAG(uiCode, "sbt_enable_flag"); pcSPS->setUseSBT(uiCode != 0); +#endif #if !JVET_P0983_REMOVE_SPS_SBT_MAX_SIZE_FLAG if( pcSPS->getUseSBT() ) { @@ -1800,7 +1933,11 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) #endif // KJS: not in draft yet READ_FLAG(uiCode, "sps_reshaper_enable_flag"); pcSPS->setUseReshaper(uiCode == 1); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + READ_FLAG( uiCode, "sps_lfnst_enabled_flag" ); pcSPS->setUseLFNST( uiCode != 0 ); +#else READ_FLAG(uiCode, "isp_enable_flag"); pcSPS->setUseISP(uiCode != 0); +#endif #if LUMA_ADAPTIVE_DEBLOCKING_FILTER_QP_OFFSET READ_FLAG( uiCode, "sps_ladf_enabled_flag" ); pcSPS->setLadfEnabled( uiCode != 0 ); diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index 344de27c5a2213de6eb06a73b751e7ca8285cd94..1d2bc2583c8e51fda8f25864bfec042efaa6c6da 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -964,6 +964,12 @@ void CABACWriter::extend_ref_line(const PredictionUnit& pu) { return; } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + if( !cu.cs->sps->getUseMRL() ) + { + return; + } +#endif bool isFirstLineOfCtu = (((cu.block(COMPONENT_Y).y)&((cu.cs->sps)->getMaxCUWidth() - 1)) == 0); if (isFirstLineOfCtu) { @@ -987,6 +993,12 @@ void CABACWriter::extend_ref_line(const CodingUnit& cu) { return; } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + if( !cu.cs->sps->getUseMRL() ) + { + return; + } +#endif const int numBlocks = CU::getNumPUs(cu); const PredictionUnit* pu = cu.firstPU; diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index 5d5ad9704a35dccf57b86ed9d2e8a8bb8802c752..e7908916372834b24e3adb20fbbf756b9b406c5b 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -374,6 +374,9 @@ protected: bool m_useNonLinearAlfLuma; bool m_useNonLinearAlfChroma; unsigned m_maxNumAlfAlternativesChroma; +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + bool m_MRL; +#endif bool m_MIP; bool m_useFastMIP; int m_fastLocalDualTreeMode; @@ -1160,6 +1163,10 @@ public: bool getUseNonLinearAlfChroma () const { return m_useNonLinearAlfChroma; } void setMaxNumAlfAlternativesChroma ( uint32_t u ) { m_maxNumAlfAlternativesChroma = u; } uint32_t getMaxNumAlfAlternativesChroma () const { return m_maxNumAlfAlternativesChroma; } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + void setUseMRL ( bool b ) { m_MRL = b; } + bool getUseMRL () const { return m_MRL; } +#endif void setUseMIP ( bool b ) { m_MIP = b; } bool getUseMIP () const { return m_MIP; } void setUseFastMIP ( bool b ) { m_useFastMIP = b; } diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 4c73b7ccee289645124db2969bee106e2f28fbb4..1acaa54335f0241a1b1a689eb2c0f9f8228bb355 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1521,6 +1521,9 @@ void EncLib::xInitSPS(SPS &sps) // ADD_NEW_TOOL : (encoder lib) set tool enabling flags and associated parameters here sps.setUseISP ( m_ISP ); sps.setUseReshaper ( m_lumaReshapeEnable ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + sps.setUseMRL ( m_MRL ); +#endif sps.setUseMIP ( m_MIP ); int minCUSize = sps.getMaxCUWidth() >> sps.getLog2DiffMaxMinCodingBlockSize(); int log2MinCUSize = 0; diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp index e9a6fffdcbaaff4a9c4d30c7c8418cfb0204db91..93a1217a0c6d731afc1ec197f6a853049db28b2d 100644 --- a/source/Lib/EncoderLib/IntraSearch.cpp +++ b/source/Lib/EncoderLib/IntraSearch.cpp @@ -545,7 +545,11 @@ bool IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, // this should always be true CHECK( !pu.Y().valid(), "PU is not valid" ); bool isFirstLineOfCtu = (((pu.block(COMPONENT_Y).y)&((pu.cs->sps)->getMaxCUWidth() - 1)) == 0); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + int numOfPassesExtendRef = ((!sps.getUseMRL() || isFirstLineOfCtu) ? 1 : MRL_NUM_REF_LINES); +#else int numOfPassesExtendRef = (isFirstLineOfCtu ? 1 : MRL_NUM_REF_LINES); +#endif pu.multiRefIdx = 0; if( numModesForFullRD != numModesAvailable ) diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 5949c5466be62357d0cfe79601ea5ca078e088c3..804612f3ef9080384e1890b5029c8a08b484d099 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -348,12 +348,16 @@ void HLSWriter::codePPS( const PPS* pcPPS, const SPS* pcSPS ) WRITE_FLAG( pcPPS->getLoopFilterAcrossSlicesEnabledFlag(), "loop_filter_across_slices_enabled_flag"); } +#endif +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG( pcPPS->getEntropyCodingSyncEnabledFlag() ? 1 : 0, "entropy_coding_sync_enabled_flag" ); #endif WRITE_FLAG( pcPPS->getCabacInitPresentFlag() ? 1 : 0, "cabac_init_present_flag" ); WRITE_UVLC( pcPPS->getNumRefIdxL0DefaultActive()-1, "num_ref_idx_l0_default_active_minus1"); WRITE_UVLC( pcPPS->getNumRefIdxL1DefaultActive()-1, "num_ref_idx_l1_default_active_minus1"); WRITE_FLAG(pcPPS->getRpl1IdxPresentFlag() ? 1 : 0, "rpl1IdxPresentFlag"); +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES WRITE_FLAG( pcPPS->getConstantSliceHeaderParamsEnabledFlag(), "constant_slice_header_params_enabled_flag"); if ( pcPPS->getConstantSliceHeaderParamsEnabledFlag() ) { WRITE_CODE( pcPPS->getPPSDepQuantEnabledIdc(), 2, "pps_dep_quant_enabled_idc"); @@ -370,6 +374,7 @@ void HLSWriter::codePPS( const PPS* pcPPS, const SPS* pcSPS ) #endif WRITE_UVLC( pcPPS->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1(), "pps_max_num_merge_cand_minus_max_num_triangle_cand_plus1"); } +#endif WRITE_SVLC( pcPPS->getPicInitQPMinus26(), "init_qp_minus26"); if (pcSPS->getTransformSkipEnabledFlag()) @@ -427,8 +432,13 @@ void HLSWriter::codePPS( const PPS* pcPPS, const SPS* pcSPS ) WRITE_FLAG( pcPPS->getUseWP() ? 1 : 0, "weighted_pred_flag" ); // Use of Weighting Prediction (P_SLICE) WRITE_FLAG( pcPPS->getWPBiPred() ? 1 : 0, "weighted_bipred_flag" ); // Use of Weighting Bi-Prediction (B_SLICE) +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + // transquant_bypass is not supported in VVC + CHECK( pcPPS->getTransquantBypassEnabledFlag(), "transquant_bypass_enabled_flag is not supported in VVC"); +#else WRITE_FLAG( pcPPS->getTransquantBypassEnabledFlag() ? 1 : 0, "transquant_bypass_enabled_flag" ); +#endif #if !JVET_P1004_REMOVE_BRICKS WRITE_FLAG( pcPPS->getSingleTileInPicFlag() ? 1 : 0, "single_tile_in_pic_flag" ); if (!pcPPS->getSingleTileInPicFlag()) @@ -547,7 +557,9 @@ void HLSWriter::codePPS( const PPS* pcPPS, const SPS* pcSPS ) #endif +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES WRITE_FLAG( pcPPS->getEntropyCodingSyncEnabledFlag() ? 1 : 0, "entropy_coding_sync_enabled_flag" ); +#endif WRITE_FLAG( pcPPS->getDeblockingFilterControlPresentFlag()?1 : 0, "deblocking_filter_control_present_flag"); if(pcPPS->getDeblockingFilterControlPresentFlag()) @@ -560,6 +572,24 @@ void HLSWriter::codePPS( const PPS* pcPPS, const SPS* pcSPS ) WRITE_SVLC( pcPPS->getDeblockingFilterTcOffsetDiv2(), "pps_tc_offset_div2" ); } } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG( pcPPS->getConstantSliceHeaderParamsEnabledFlag(), "constant_slice_header_params_enabled_flag"); + if ( pcPPS->getConstantSliceHeaderParamsEnabledFlag() ) { + WRITE_CODE( pcPPS->getPPSDepQuantEnabledIdc(), 2, "pps_dep_quant_enabled_idc"); + WRITE_CODE( pcPPS->getPPSRefPicListSPSIdc0(), 2, "pps_ref_pic_list_sps_idc[0]"); + WRITE_CODE( pcPPS->getPPSRefPicListSPSIdc1(), 2, "pps_ref_pic_list_sps_idc[1]"); +#if !JVET_P0206_TMVP_flags + WRITE_CODE( pcPPS->getPPSTemporalMVPEnabledIdc(), 2, "pps_temporal_mvp_enabled_idc"); +#endif + WRITE_CODE( pcPPS->getPPSMvdL1ZeroIdc(), 2, "pps_mvd_l1_zero_idc"); + WRITE_CODE( pcPPS->getPPSCollocatedFromL0Idc(), 2, "pps_collocated_from_l0_idc"); + WRITE_UVLC( pcPPS->getPPSSixMinusMaxNumMergeCandPlus1(), "pps_six_minus_max_num_merge_cand_plus1"); +#if !JVET_P0152_REMOVE_PPS_NUM_SUBBLOCK_MERGE_CAND + WRITE_UVLC( pcPPS->getPPSFiveMinusMaxNumSubblockMergeCandPlus1(), "pps_five_minus_max_num_subblock_merge_cand_plus1"); +#endif + WRITE_UVLC( pcPPS->getPPSMaxNumMergeCandMinusMaxNumTriangleCandPlus1(), "pps_max_num_merge_cand_minus_max_num_triangle_cand_plus1"); + } +#endif #if !JVET_P1006_PICTURE_HEADER WRITE_FLAG( pcPPS->getLoopFilterAcrossVirtualBoundariesDisabledFlag() ? 1 : 0, "pps_loop_filter_across_virtual_boundaries_disabled_flag" ); @@ -894,6 +924,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_UVLC( pcSPS->getMaxPicWidthInLumaSamples(), "pic_width_max_in_luma_samples" ); WRITE_UVLC( pcSPS->getMaxPicHeightInLumaSamples(), "pic_height_max_in_luma_samples" ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_CODE(floorLog2(pcSPS->getCTUSize()) - 5, 2, "sps_log2_ctu_size_minus5"); +#endif #if JVET_P0126_SIGNALLING_SUBPICID WRITE_FLAG(pcSPS->getSubPicPresentFlag(), "subpics_present_flag"); @@ -934,7 +967,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) #else WRITE_UVLC( pcSPS->getBitsForPOC()-4, "log2_max_pic_order_cnt_lsb_minus4" ); #endif +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES WRITE_FLAG( pcSPS->getIDRRefParamListPresent(), "sps_idr_rpl_present_flag" ); +#endif // KJS: Marakech decision: sub-layers added back const bool subLayerOrderingInfoPresentFlag = 1; if (pcSPS->getMaxTLayers() > 1) @@ -953,6 +988,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) } CHECK( pcSPS->getMaxCUWidth() != pcSPS->getMaxCUHeight(), "Rectangular CTUs not supported" ); WRITE_FLAG(pcSPS->getLongTermRefsPresent() ? 1 : 0, "long_term_ref_pics_flag"); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG(pcSPS->getIDRRefParamListPresent() ? 1 : 0, "sps_idr_rpl_present_flag" ); +#endif WRITE_FLAG(pcSPS->getRPL1CopyFromRPL0Flag() ? 1 : 0, "rpl1_copy_from_rpl0_flag"); const RPLList* rplList0 = pcSPS->getRPLList0(); @@ -978,8 +1016,15 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) xCodeRefPicList( rpl, pcSPS->getLongTermRefsPresent(), pcSPS->getBitsForPOC(), !pcSPS->getUseWP() && !pcSPS->getUseWPBiPred() ); } } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + if( pcSPS->getChromaFormatIdc() != CHROMA_400 ) + { + WRITE_FLAG(pcSPS->getUseDualITree(), "qtbtt_dual_tree_intra_flag"); + } +#else WRITE_FLAG(pcSPS->getUseDualITree(), "qtbtt_dual_tree_intra_flag"); WRITE_CODE(floorLog2(pcSPS->getCTUSize()) - 5, 2, "log2_ctu_size_minus5"); +#endif WRITE_UVLC(pcSPS->getLog2MinCodingBlockSize() - 2, "log2_min_luma_coding_block_size_minus2"); WRITE_FLAG(pcSPS->getSplitConsOverrideEnabledFlag(), "partition_constraints_override_enabled_flag"); WRITE_UVLC(floorLog2(pcSPS->getMinQTSize(I_SLICE)) - pcSPS->getLog2MinCodingBlockSize(), "sps_log2_diff_min_qt_min_cb_intra_slice_luma"); @@ -1090,11 +1135,36 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_FLAG( pcSPS->getAMVREnabledFlag() ? 1 : 0, "sps_amvr_enabled_flag" ); WRITE_FLAG( pcSPS->getBDOFEnabledFlag() ? 1 : 0, "sps_bdof_enabled_flag" ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES && JVET_P0314_PROF_BDOF_DMVR_HLS + if (pcSPS->getBDOFEnabledFlag()) + { + WRITE_FLAG(pcSPS->getBdofControlPresentFlag() ? 1 : 0, "sps_bdof_pic_present_flag"); + } +#endif +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG( pcSPS->getUseSMVD() ? 1 : 0, "sps_smvd_enabled_flag" ); +#endif WRITE_FLAG( pcSPS->getUseDMVR() ? 1 : 0, "sps_dmvr_enable_flag" ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES && JVET_P0314_PROF_BDOF_DMVR_HLS + if (pcSPS->getUseDMVR()) + { + WRITE_FLAG(pcSPS->getDmvrControlPresentFlag() ? 1 : 0, "sps_dmvr_pic_present_flag"); + } +#endif WRITE_FLAG(pcSPS->getUseMMVD() ? 1 : 0, "sps_mmvd_enable_flag"); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG( pcSPS->getUseISP() ? 1 : 0, "sps_isp_enabled_flag"); + WRITE_FLAG( pcSPS->getUseMRL() ? 1 : 0, "sps_mrl_enabled_flag"); + WRITE_FLAG( pcSPS->getUseMIP() ? 1 : 0, "sps_mip_enabled_flag"); + if( pcSPS->getChromaFormatIdc() != CHROMA_400) + { + WRITE_FLAG( pcSPS->getUseLMChroma() ? 1 : 0, "sps_cclm_enabled_flag"); + } +#else // KJS: sps_cclm_enabled_flag WRITE_FLAG( pcSPS->getUseLMChroma() ? 1 : 0, "lm_chroma_enabled_flag" ); +#endif #if JVET_P0592_CHROMA_PHASE if( pcSPS->getChromaFormatIdc() == CHROMA_420 ) { @@ -1114,17 +1184,34 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_FLAG( pcSPS->getUseIntraMTS() ? 1 : 0, "mts_intra_enabled_flag" ); WRITE_FLAG( pcSPS->getUseInterMTS() ? 1 : 0, "mts_inter_enabled_flag" ); } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG( pcSPS->getUseSBT() ? 1 : 0, "sps_sbt_enabled_flag"); +#else WRITE_FLAG( pcSPS->getUseLFNST() ? 1 : 0, "lfnst_enabled_flag" ); WRITE_FLAG( pcSPS->getUseSMVD() ? 1 : 0, "smvd_flag" ); +#endif // KJS: sps_affine_enabled_flag WRITE_FLAG( pcSPS->getUseAffine() ? 1 : 0, "affine_flag" ); if ( pcSPS->getUseAffine() ) { WRITE_FLAG( pcSPS->getUseAffineType() ? 1 : 0, "affine_type_flag" ); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG( pcSPS->getAffineAmvrEnabledFlag() ? 1 : 0, "sps_affine_amvr_enabled_flag" ); + WRITE_FLAG( pcSPS->getUsePROF() ? 1 : 0, "sps_affine_prof_enabled_flag" ); +#if JVET_P0314_PROF_BDOF_DMVR_HLS + if (pcSPS->getUsePROF()) + { + WRITE_FLAG(pcSPS->getProfControlPresentFlag() ? 1 : 0, "sps_prof_pic_present_flag" ); + } +#endif +#else WRITE_FLAG( pcSPS->getUsePROF() ? 1 : 0, "sps_prof_enabled_flag" ); WRITE_FLAG( pcSPS->getAffineAmvrEnabledFlag() ? 1 : 0, "sps_affine_amvr_enabled_flag" ); +#endif } +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES WRITE_FLAG( pcSPS->getUseGBi() ? 1 : 0, "gbi_flag" ); +#endif #if JVET_P0517_ADAPTIVE_COLOR_TRANSFORM if (pcSPS->getChromaFormatIdc() == CHROMA_444) { @@ -1135,6 +1222,9 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) { WRITE_FLAG(pcSPS->getPLTMode() ? 1 : 0, "plt_flag" ); } +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG( pcSPS->getUseGBi() ? 1 : 0, "sps_bcw_enabled_flag" ); +#endif WRITE_FLAG(pcSPS->getIBCFlag() ? 1 : 0, "ibc_flag"); // KJS: sps_ciip_enabled_flag @@ -1145,6 +1235,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_FLAG( pcSPS->getFpelMmvdEnabledFlag() ? 1 : 0, "sps_fpel_mmvd_enabled_flag" ); } #if JVET_P0314_PROF_BDOF_DMVR_HLS +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES if (pcSPS->getBDOFEnabledFlag()) { WRITE_FLAG(pcSPS->getBdofControlPresentFlag() ? 1 : 0, "sps_bdof_picture_level_present_flag"); @@ -1157,6 +1248,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) { WRITE_FLAG(pcSPS->getProfControlPresentFlag() ? 1 : 0, "sps_prof_picture_level_present_flag"); } +#endif #else if(pcSPS->getBDOFEnabledFlag() || pcSPS->getUseDMVR()) { @@ -1165,9 +1257,11 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) #endif WRITE_FLAG( pcSPS->getUseTriangle() ? 1: 0, "triangle_flag" ); +#if !JVET_P2001_SYNTAX_ORDER_MISMATCHES WRITE_FLAG( pcSPS->getUseMIP() ? 1: 0, "sps_mip_flag" ); // KJS: not in draft yet WRITE_FLAG( pcSPS->getUseSBT() ? 1 : 0, "sbt_enable_flag"); +#endif #if !JVET_P0983_REMOVE_SPS_SBT_MAX_SIZE_FLAG if( pcSPS->getUseSBT() ) { @@ -1176,7 +1270,11 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) #endif // KJS: not in draft yet WRITE_FLAG(pcSPS->getUseReshaper() ? 1 : 0, "sps_reshaper_enable_flag"); +#if JVET_P2001_SYNTAX_ORDER_MISMATCHES + WRITE_FLAG( pcSPS->getUseLFNST() ? 1 : 0, "sps_lfnst_enabled_flag" ); +#else WRITE_FLAG( pcSPS->getUseISP() ? 1 : 0, "isp_enable_flag"); +#endif #if LUMA_ADAPTIVE_DEBLOCKING_FILTER_QP_OFFSET WRITE_FLAG( pcSPS->getLadfEnabled() ? 1 : 0, "sps_ladf_enabled_flag" );