diff --git a/doc/software-manual.tex b/doc/software-manual.tex index 3180971ee7f19c4b56e71e99a83eee7392076e7d..f0305e365c8e4f554c3b5d171ed3b5ad86d4d078 100644 --- a/doc/software-manual.tex +++ b/doc/software-manual.tex @@ -1108,6 +1108,12 @@ Specifies the value of one_slice_per_pic_constraint_flag Specifies the value of one_subpic_per_pic_constraint_flag \\ +\Option{MaxLog2CtuSizeConstraintIdc} & +%\ShortOption{\None} & +\Default{8} & +Specifies the value of gci_three_minus_max_log2_ctu_size_constraint_idc +\\ + \Option{PartitionConstraintsOverrideConstraintFlag} & %\ShortOption{\None} & \Default{false} & @@ -1246,6 +1252,12 @@ Specifies the value of gci_no_gpm_constraint_flag Specifies the value of gci_no_transform_skip_constraint_flag \\ +\Option{LumaTransformSize64ConstraintFlag} & +%\ShortOption{\None} & +\Default{false} & +Specifies the value of gci_no_luma_transform_size_64_constraint_flag +\\ + \Option{BDPCMConstraintFlag} & %\ShortOption{\None} & \Default{false} & diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index af077e021d1511d06ab5a2fa7f97763f513935f0..b1621268cac1b73badc871d9cb65ae786d7b9392 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -288,6 +288,11 @@ void EncApp::xInitLibCfg() m_cEncLib.setNoQtbttDualTreeIntraConstraintFlag(m_bNoQtbttDualTreeIntraConstraintFlag); CHECK(m_bNoQtbttDualTreeIntraConstraintFlag && m_dualTree, "Dual tree shall be deactivated when m_bNoQtbttDualTreeIntraConstraintFlag is equal to 1"); +#if JVET_S0066_GCI + m_cEncLib.setMaxLog2CtuSizeConstraintIdc(m_maxLog2CtuSizeConstraintIdc); + CHECK( m_uiCTUSize > (1<<(m_maxLog2CtuSizeConstraintIdc)), "CTUSize shall be less than or equal to 1 << m_maxLog2CtuSize"); + +#endif m_cEncLib.setNoPartitionConstraintsOverrideConstraintFlag(m_noPartitionConstraintsOverrideConstraintFlag); CHECK(m_noPartitionConstraintsOverrideConstraintFlag && m_SplitConsOverrideEnabledFlag, "Partition override shall be deactivated when m_noPartitionConstraintsOverrideConstraintFlag is equal to 1"); @@ -349,6 +354,11 @@ void EncApp::xInitLibCfg() m_cEncLib.setNoTransformSkipConstraintFlag(m_noTransformSkipConstraintFlag); CHECK(m_noTransformSkipConstraintFlag && m_useTransformSkip, "Transform skip shall be deactivated when m_noTransformSkipConstraintFlag is equal to 1"); +#if JVET_S0066_GCI + m_cEncLib.setNoLumaTransformSize64ConstraintFlag(m_noLumaTransformSize64ConstraintFlag); + CHECK(m_noLumaTransformSize64ConstraintFlag && m_log2MaxTbSize > 5, "Max transform size shall be less than 64 when m_noLumaTransformSize64ConstraintFlag is equal to 1"); + +#endif m_cEncLib.setNoBDPCMConstraintFlag(m_noBDPCMConstraintFlag); CHECK(m_noBDPCMConstraintFlag && m_useBDPCM, "BDPCM shall be deactivated when m_noBDPCMConstraintFlag is equal to 1"); diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index a94c6c7a218554ffee8a77a3b4b85eb6ceb5a619..5c2dcdca056b6ab9264528c8a9a41d8fde2f244e 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -795,6 +795,9 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("PicHeaderInSliceHeaderConstraintFlag", m_picHeaderInSliceHeaderConstraintFlag, false, "Indicate that picture header is present in slice header") ("OneSlicePerPicConstraintFlag", m_oneSlicePerPicConstraintFlag, false, "Indicate that each picture shall contain only one slice") ("OneSubpicPerPicConstraintFlag", m_oneSubpicPerPicConstraintFlag, false, "Indicate that each picture shall contain only one subpicture") +#if JVET_S0066_GCI + ("MaxLog2CtuSizeConstraintIdc", m_maxLog2CtuSizeConstraintIdc, 8, "Indicate that Log2CtuSize shall be in the range of 0 to m_maxLog2CtuSizeConstraintIdc") +#endif ("PartitionConstraintsOverrideConstraintFlag", m_noPartitionConstraintsOverrideConstraintFlag, false, "Indicate that Partition Override is deactivated") ("QtbttDualTreeIntraConstraintFlag", m_bNoQtbttDualTreeIntraConstraintFlag, false, "Indicate that Qtbtt DualTree Intra is deactivated") ("PaletteConstraintFlag", m_noPaletteConstraintFlag, false, "Indicate that PLT is deactivated") @@ -818,6 +821,9 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("CiipConstraintFlag", m_bNoCiipConstraintFlag, false, "Indicate that CIIP is deactivated") ("GpmConstraintFlag", m_noGeoConstraintFlag, false, "Indicate that GPM is deactivated") ("TransformSkipConstraintFlag", m_noTransformSkipConstraintFlag, false, "Indicate that Transform Skip is deactivated") +#if JVET_S0066_GCI + ("LumaTransformSize64ConstraintFlag", m_noLumaTransformSize64ConstraintFlag, false, "Indicate that Luma Transform Size 64 is deactivated") +#endif ("BDPCMConstraintFlag", m_noBDPCMConstraintFlag, false, "Indicate that BDPCM is deactivated") ("MtsConstraintFlag", m_bNoMtsConstraintFlag, false, "Indicate that MTS is deactivated") ("LfnstConstraintFlag", m_noLfnstConstraintFlag, false, "Indicate that LFNST is deactivated") diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 745f9214c233f8273df9cffa719da0859ae1eee7..f8f54ee5d261882533724cc4182f2384f69c6a60 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -154,6 +154,9 @@ protected: bool m_noVirtualBoundaryConstraintFlag; #endif bool m_bNoQtbttDualTreeIntraConstraintFlag; +#if JVET_S0066_GCI + int m_maxLog2CtuSizeConstraintIdc; +#endif bool m_noPartitionConstraintsOverrideConstraintFlag; bool m_bNoSaoConstraintFlag; bool m_bNoAlfConstraintFlag; @@ -174,6 +177,9 @@ protected: bool m_noGeoConstraintFlag; bool m_bNoLadfConstraintFlag; bool m_noTransformSkipConstraintFlag; +#if JVET_S0066_GCI + bool m_noLumaTransformSize64ConstraintFlag; +#endif bool m_noBDPCMConstraintFlag; bool m_noJointCbCrConstraintFlag; bool m_bNoQpDeltaConstraintFlag; diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 860160d93791b6232b260d8490d72ae1d39742b9..ef6a5d6f9faf720bd0cbf33d1e407683b65fa326 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -272,6 +272,9 @@ class ConstraintInfo bool m_noVirtualBoundaryConstraintFlag; #endif bool m_noQtbttDualTreeIntraConstraintFlag; +#if JVET_S0066_GCI + int m_maxLog2CtuSizeConstraintIdc; +#endif bool m_noPartitionConstraintsOverrideConstraintFlag; bool m_noSaoConstraintFlag; bool m_noAlfConstraintFlag; @@ -292,6 +295,9 @@ class ConstraintInfo bool m_noGeoConstraintFlag; bool m_noLadfConstraintFlag; bool m_noTransformSkipConstraintFlag; +#if JVET_S0066_GCI + bool m_noLumaTransformSize64ConstraintFlag; +#endif bool m_noBDPCMConstraintFlag; bool m_noJointCbCrConstraintFlag; bool m_noQpDeltaConstraintFlag; @@ -353,6 +359,9 @@ public: , m_noVirtualBoundaryConstraintFlag(false) #endif , m_noQtbttDualTreeIntraConstraintFlag(false) +#if JVET_S0066_GCI + , m_maxLog2CtuSizeConstraintIdc(8) +#endif , m_noPartitionConstraintsOverrideConstraintFlag(false) , m_noSaoConstraintFlag (false) , m_noAlfConstraintFlag (false) @@ -373,6 +382,9 @@ public: , m_noGeoConstraintFlag (false) , m_noLadfConstraintFlag (false) , m_noTransformSkipConstraintFlag(false) +#if JVET_S0066_GCI + , m_noLumaTransformSize64ConstraintFlag(false) +#endif , m_noBDPCMConstraintFlag (false) , m_noJointCbCrConstraintFlag (false) , m_noQpDeltaConstraintFlag (false) @@ -470,6 +482,10 @@ public: #endif bool getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; } void setNoQtbttDualTreeIntraConstraintFlag(bool bVal) { m_noQtbttDualTreeIntraConstraintFlag = bVal; } +#if JVET_S0066_GCI + int getMaxLog2CtuSizeConstraintIdc() const { return m_maxLog2CtuSizeConstraintIdc; } + void setMaxLog2CtuSizeConstraintIdc(int idc) { m_maxLog2CtuSizeConstraintIdc = idc; } +#endif bool getNoPartitionConstraintsOverrideConstraintFlag() const { return m_noPartitionConstraintsOverrideConstraintFlag; } void setNoPartitionConstraintsOverrideConstraintFlag(bool bVal) { m_noPartitionConstraintsOverrideConstraintFlag = bVal; } bool getNoSaoConstraintFlag() const { return m_noSaoConstraintFlag; } @@ -512,6 +528,10 @@ public: void setNoLadfConstraintFlag(bool bVal) { m_noLadfConstraintFlag = bVal; } bool getNoTransformSkipConstraintFlag() const { return m_noTransformSkipConstraintFlag; } void setNoTransformSkipConstraintFlag(bool bVal) { m_noTransformSkipConstraintFlag = bVal; } +#if JVET_S0066_GCI + bool getNoLumaTransformSize64ConstraintFlag() const { return m_noLumaTransformSize64ConstraintFlag; } + void setNoLumaTransformSize64ConstraintFlag(bool bVal) { m_noLumaTransformSize64ConstraintFlag = bVal; } +#endif bool getNoBDPCMConstraintFlag() const { return m_noBDPCMConstraintFlag; } void setNoBDPCMConstraintFlag(bool bVal) { m_noBDPCMConstraintFlag = bVal; } bool getNoQpDeltaConstraintFlag() const { return m_noQpDeltaConstraintFlag; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index fd07951543f7cfd6df0fa1c2eae3632b361d07ca..356ccb34260904b03e5cc26d00c89145bb2b3fa9 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -52,6 +52,8 @@ //########### place macros to be removed in next cycle below this line ############### +#define JVET_S0066_GCI 1 // JVET-S0066: Signal new GCI flags gci_three_minus_max_log2_ctu_size_constraint_idc and gci_no_luma_transform_size_64_constraint_flag (no_explicit_scaling_list_constraint_flag already included as part of JVET-S0050) + #define JVET_S0193_NO_OUTPUT_PRIOR_PIC 1 // JVET-S0193: Move ph_no_output_of_prior_pics_flag to SH #define JVET_S0219_ASPECT2_CHANGE_ORDER_APS_PARAMS_TYPE 1 // JVET-S0219 aspect2: change the order to put the aps_params_type before the aps_adaptation_parameter_set_id. diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 5a2c59def0a418357842025cdec1c8625d666a5d..0cbd35ebf690466aa5b65eb41304e97e8a812bdc 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -1861,7 +1861,15 @@ void DecLib::xCheckParameterSetConstraints(const int layerId) CHECK(sps->getNumSubPics() != 1, "When one_subpic_per_pic_constraint_flag is equal to 1, the value of sps_num_subpics_minus1 shall be equal to 0") } #endif +#if JVET_S0066_GCI + CHECK(sps->getCTUSize() > (1 << sps->getProfileTierLevel()->getConstraintInfo()->getMaxLog2CtuSizeConstraintIdc()), "The CTU size specified by sps_log2_ctu_size_minus5 shall not exceed the constraint specified by gci_three_minus_max_log2_ctu_size_constraint_idc"); + if (sps->getProfileTierLevel()->getConstraintInfo()->getNoLumaTransformSize64ConstraintFlag()) + { + CHECK(sps->getLog2MaxTbSize() != 5, "When gci_no_luma_transform_size_64_constraint_flag is equal to 1, the value of sps_max_luma_transform_size_64_flag shall be equal to 0"); + } + +#endif if (sps->getMaxPicWidthInLumaSamples() == pps->getPicWidthInLumaSamples() && sps->getMaxPicHeightInLumaSamples() == pps->getPicHeightInLumaSamples()) { diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 78304d80f52d75438ead17e05910d77b6cee6808..df3594c47f22bb718aa0feb893a229773c75e6d6 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -4629,6 +4629,9 @@ void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo) { CHECK(symbol == 0, "When max_chroma_format_constraint_idc is equal to 0, the value of no_qtbtt_dual_tree_intra_constraint_flag shall be equal to 1"); } +#endif +#if JVET_S0066_GCI + READ_CODE(2, symbol, "gci_three_minus_max_log2_ctu_size_constraint_idc" ); cinfo->setMaxLog2CtuSizeConstraintIdc(((3-symbol)+5)); #endif READ_FLAG(symbol, "no_partition_constraints_override_constraint_flag"); cinfo->setNoPartitionConstraintsOverrideConstraintFlag(symbol > 0 ? true : false); READ_FLAG(symbol, "no_sao_constraint_flag"); cinfo->setNoSaoConstraintFlag(symbol > 0 ? true : false); @@ -4753,6 +4756,9 @@ void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo) } #endif READ_FLAG(symbol, "no_ladf_constraint_flag"); cinfo->setNoLadfConstraintFlag(symbol > 0 ? true : false); +#if JVET_S0066_GCI + READ_FLAG(symbol, "gci_no_luma_transform_size_64_constraint_flag"); cinfo->setNoLumaTransformSize64ConstraintFlag(symbol > 0 ? true : false); +#endif READ_FLAG(symbol, "no_transform_skip_constraint_flag"); cinfo->setNoTransformSkipConstraintFlag(symbol > 0 ? true : false); READ_FLAG(symbol, "no_bdpcm_constraint_flag"); cinfo->setNoBDPCMConstraintFlag(symbol > 0 ? true : false); READ_FLAG(symbol, "no_palette_constraint_flag"); cinfo->setNoPaletteConstraintFlag(symbol > 0 ? true : false); diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index ad9e4b0d2549b2a646c9206604720db14cc60c65..153b6c4e86127444219de2fec8f2d7c736ef5717 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -200,6 +200,9 @@ protected: bool m_noVirtualBoundaryConstraintFlag; #endif bool m_bNoQtbttDualTreeIntraConstraintFlag; +#if JVET_S0066_GCI + int m_maxLog2CtuSizeConstraintIdc; +#endif bool m_noPartitionConstraintsOverrideConstraintFlag; bool m_bNoSaoConstraintFlag; bool m_bNoAlfConstraintFlag; @@ -220,6 +223,9 @@ protected: bool m_noGeoConstraintFlag; bool m_bNoLadfConstraintFlag; bool m_noTransformSkipConstraintFlag; +#if JVET_S0066_GCI + bool m_noLumaTransformSize64ConstraintFlag; +#endif bool m_noBDPCMConstraintFlag; bool m_noJointCbCrConstraintFlag; bool m_bNoQpDeltaConstraintFlag; @@ -816,6 +822,10 @@ public: #endif bool getNoQtbttDualTreeIntraConstraintFlag() const { return m_bNoQtbttDualTreeIntraConstraintFlag; } void setNoQtbttDualTreeIntraConstraintFlag(bool bVal) { m_bNoQtbttDualTreeIntraConstraintFlag = bVal; } +#if JVET_S0066_GCI + int getMaxLog2CtuSizeConstraintIdc() const { return m_maxLog2CtuSizeConstraintIdc; } + void setMaxLog2CtuSizeConstraintIdc(int u) { m_maxLog2CtuSizeConstraintIdc = u; } +#endif bool getNoPartitionConstraintsOverrideConstraintFlag() const { return m_noPartitionConstraintsOverrideConstraintFlag; } void setNoPartitionConstraintsOverrideConstraintFlag(bool bVal) { m_noPartitionConstraintsOverrideConstraintFlag = bVal; } bool getNoSaoConstraintFlag() const { return m_bNoSaoConstraintFlag; } @@ -856,6 +866,10 @@ public: void setNoLadfConstraintFlag(bool bVal) { m_bNoLadfConstraintFlag = bVal; } bool getNoTransformSkipConstraintFlag() const { return m_noTransformSkipConstraintFlag; } void setNoTransformSkipConstraintFlag(bool bVal) { m_noTransformSkipConstraintFlag = bVal; } +#if JVET_S0066_GCI + bool getNoLumaTransformSize64ConstraintFlag() const { return m_noLumaTransformSize64ConstraintFlag; } + void setNoLumaTransformSize64ConstraintFlag(bool bVal) { m_noLumaTransformSize64ConstraintFlag = bVal; } +#endif bool getNoBDPCMConstraintFlag() const { return m_noBDPCMConstraintFlag; } void setNoBDPCMConstraintFlag(bool bVal) { m_noBDPCMConstraintFlag = bVal; } bool getNoJointCbCrConstraintFlag() const { return m_noJointCbCrConstraintFlag; } diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 06d14092cb608f9a83d93d3599eeb850aabf580f..7fcbf5aed83b3b388368a6329fefc76907a57a36 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -2691,6 +2691,9 @@ void HLSWriter::codeConstraintInfo ( const ConstraintInfo* cinfo ) WRITE_FLAG(cinfo->getOneSubpicPerPicConstraintFlag(), "one_subpic_per_pic_constraint_flag"); WRITE_FLAG(cinfo->getNoQtbttDualTreeIntraConstraintFlag() ? 1 : 0, "no_qtbtt_dual_tree_intra_constraint_flag"); +#if JVET_S0066_GCI + WRITE_CODE(3-(cinfo->getMaxLog2CtuSizeConstraintIdc()-5), 2, "gci_three_minus_max_log2_ctu_size_constraint_idc" ); +#endif WRITE_FLAG(cinfo->getNoPartitionConstraintsOverrideConstraintFlag() ? 1 : 0, "no_partition_constraints_override_constraint_flag"); WRITE_FLAG(cinfo->getNoSaoConstraintFlag() ? 1 : 0, "no_sao_constraint_flag"); WRITE_FLAG(cinfo->getNoAlfConstraintFlag() ? 1 : 0, "no_alf_constraint_flag"); @@ -2719,6 +2722,9 @@ void HLSWriter::codeConstraintInfo ( const ConstraintInfo* cinfo ) WRITE_FLAG(cinfo->getNoGeoConstraintFlag() ? 1 : 0, "no_gpm_constraint_flag"); WRITE_FLAG(cinfo->getNoLadfConstraintFlag() ? 1 : 0, "no_ladf_constraint_flag"); WRITE_FLAG(cinfo->getNoTransformSkipConstraintFlag() ? 1 : 0, "no_transform_skip_constraint_flag"); +#if JVET_S0066_GCI + WRITE_FLAG(cinfo->getNoLumaTransformSize64ConstraintFlag() ? 1 : 0, "gci_no_luma_transform_size_64_constraint_flag"); +#endif WRITE_FLAG(cinfo->getNoBDPCMConstraintFlag() ? 1 : 0, "no_bdpcm_constraint_flag"); WRITE_FLAG(cinfo->getNoPaletteConstraintFlag() ? 1 : 0, "no_palette_constraint_flag"); WRITE_FLAG(cinfo->getNoActConstraintFlag() ? 1 : 0, "no_act_constraint_flag");