diff --git a/doc/software-manual.tex b/doc/software-manual.tex index 37126222c1c8a383cbc04bd007b473860d604f8b..70fef7c8b7e604ba615e73179ee54dc788c64bd3 100644 --- a/doc/software-manual.tex +++ b/doc/software-manual.tex @@ -1354,6 +1354,12 @@ Specifies the value of gci_no_act_constraint_flag Specifies the value of gci_no_explicit_scaling_list_constraint_flag \\ +\Option{NoChromaQpOffsetConstraintFlag} & +%\ShortOption{\None} & +\Default{false} & +Specifies the value of gic_no_chroma_qp_offset_constraint_flag +\\ + \Option{NoDepQuantConstraintFlag} & %\ShortOption{\None} & \Default{false} & diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 21deb722ac2c48a1d64a2ee331c2cd61912a4375..1496af0b16e9da5b0aee50b219f17e4ae750acb3 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -463,6 +463,10 @@ void EncApp::xInitLibCfg() m_cEncLib.setNoVirtualBoundaryConstraintFlag(m_noVirtualBoundaryConstraintFlag); CHECK(m_noVirtualBoundaryConstraintFlag && m_virtualBoundariesEnabledFlag, "Virtuall boundaries shall be deactivated when m_noVirtualBoundaryConstraintFlag is equal to 1"); +#endif +#if JVET_R0341_GCI + m_cEncLib.setNoChromaQpOffsetConstraintFlag(m_noChromaQpOffsetConstraintFlag); + CHECK(m_noChromaQpOffsetConstraintFlag && m_cuChromaQpOffsetSubdiv, "Chroma Qp offset shall be 0 when m_noChromaQpOffsetConstraintFlag is equal to 1"); #endif } else @@ -542,6 +546,9 @@ void EncApp::xInitLibCfg() m_cEncLib.setNoPaletteConstraintFlag(false); m_cEncLib.setNoActConstraintFlag(false); m_cEncLib.setNoLmcsConstraintFlag(false); +#if JVET_R0341_GCI + m_cEncLib.setNoChromaQpOffsetConstraintFlag(false); +#endif } //====== Coding Structure ======== diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index d64932d2c098fef271da68813b9bc8f66534244c..b7f24437cc26afff9856f618ad59d1a25bf0e2a5 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -889,6 +889,9 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("NoActConstraintFlag", m_noActConstraintFlag, false, "Indicate that ACT is deactivated") #if JVET_S0050_GCI ("NoExplicitScaleListConstraintFlag", m_noExplicitScaleListConstraintFlag, false, "Indicate that explicit scaling list is deactivated") +#endif +#if JVET_R0341_GCI + ("NoChromaQpOffsetConstraintFlag", m_noChromaQpOffsetConstraintFlag, false, "Indicate that chroma qp offset is zero") #endif ("NoDepQuantConstraintFlag", m_noDepQuantConstraintFlag, false, "Indicate that DQ is deactivated") ("NoSignDataHidingConstraintFlag", m_noSignDataHidingConstraintFlag, false, "Indicate that SDH is deactivated") diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index a5653b2f3e02a9112e36ee519a81f7318883a80f..bc87daf5edc3bbe99ae2d683721785287cc199eb 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -157,6 +157,9 @@ protected: #endif #if JVET_S0058_GCI bool m_noMttConstraintFlag; +#endif +#if JVET_R0341_GCI + bool m_noChromaQpOffsetConstraintFlag; #endif bool m_noQtbttDualTreeIntraConstraintFlag; #if JVET_S0066_GCI diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 744889ac7205577700c6552b091b0b899ae0619a..ddbd20b9b8e97b38b1f70c9cf3fbfbe07b2037cc 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -4602,6 +4602,9 @@ bool operator == (const ConstraintInfo& op1, const ConstraintInfo& o if (op1.m_noExplicitScaleListConstraintFlag != op2.m_noExplicitScaleListConstraintFlag ) return false; if (op1.m_noVirtualBoundaryConstraintFlag != op2.m_noVirtualBoundaryConstraintFlag ) return false; #endif +#if JVET_R0341_GCI + if (op1.m_noChromaQpOffsetConstraintFlag != op2.m_noChromaQpOffsetConstraintFlag ) return false; +#endif #if JVET_Q0114_ASPECT5_GCI_FLAG if (op1.m_noRprConstraintFlag != op2.m_noRprConstraintFlag ) return false; if (op1.m_noResChangeInClvsConstraintFlag != op2.m_noResChangeInClvsConstraintFlag ) return false; diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 4d3b18fe1d0f90a93ae012b207811ea01a3953b8..80848038ff4b9d840aebdb61db2c0a60d1fec836 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -286,6 +286,9 @@ class ConstraintInfo #endif #if JVET_S0058_GCI bool m_noMttConstraintFlag; +#endif +#if JVET_R0341_GCI + bool m_noChromaQpOffsetConstraintFlag; #endif bool m_noQtbttDualTreeIntraConstraintFlag; #if JVET_S0066_GCI @@ -392,6 +395,9 @@ public: #endif #if JVET_S0058_GCI , m_noMttConstraintFlag(false) +#endif +#if JVET_R0341_GCI + , m_noChromaQpOffsetConstraintFlag(false) #endif , m_noQtbttDualTreeIntraConstraintFlag(false) #if JVET_S0066_GCI @@ -541,6 +547,10 @@ public: #if JVET_S0058_GCI bool getNoMttConstraintFlag() const { return m_noMttConstraintFlag; } void setNoMttConstraintFlag(bool bVal) { m_noMttConstraintFlag = bVal; } +#endif +#if JVET_R0341_GCI + bool getNoChromaQpOffsetConstraintFlag() const { return m_noChromaQpOffsetConstraintFlag; } + void setNoChromaQpOffsetConstraintFlag(bool b) { m_noChromaQpOffsetConstraintFlag = b; } #endif bool getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; } void setNoQtbttDualTreeIntraConstraintFlag(bool bVal) { m_noQtbttDualTreeIntraConstraintFlag = bVal; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 4b9af31596c7401e1c35f7f24408ea2c5c7df472..4b254718a6255a8f1cd66d3b55f6c0abf57bf402 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -54,6 +54,8 @@ //########### place macros to be removed in next cycle below this line ############### #define JVET_S0058_GCI 1 // no_mtt_constraint_flag and no_weightedpred_constraint_flag +#define JVET_R0341_GCI 1 // JVET-R0341: on constraint flag for local chroma QP control + #define JVET_S0203 1 // JVET-S0203 (aspects 1 & 2): change the signalling of sublayer_level_idc[ i ] and ptl_sublayer_level_present_flag[ i ] to be in descending order #define JVET_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) diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index baca3225fa9de7c5ce73bffc6959c65d526d7a56..7cb6755cdef3b42e6ccf28254fd1a90274f34ec9 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -1910,6 +1910,14 @@ void DecLib::xCheckParameterSetConstraints(const int layerId) CHECK((sps->getUseWP() || sps->getUseWPBiPred()), "When gci_no_weighted_prediction_constraint_flag is equal to 1, the values of sps_weighted_pred_flag and sps_weighted_bipred_flag shall be equal to 0"); } #endif + +#if JVET_R0341_GCI + if (sps->getProfileTierLevel()->getConstraintInfo()->getNoChromaQpOffsetConstraintFlag()) + { + CHECK((pps->getCuChromaQpOffsetListEnabledFlag()), "When gci_no_ChromaQpOffset_constraint_flag is equal to 1, the values of pps_cu_chroma_qp_offset_list_enabled_flag 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"); diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 2093b7c95058844a62f29310f809184771c616be..c5b46369cb699f35b61ae2c29cf3bb2e60b0e329 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -4851,6 +4851,9 @@ void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo) READ_FLAG(symbol, "no_act_constraint_flag"); cinfo->setNoActConstraintFlag(symbol > 0 ? true : false); #if JVET_S0050_GCI READ_FLAG(symbol, "no_explicit_scaling_list_constraint_flag"); cinfo->setNoExplicitScaleListConstraintFlag(symbol > 0 ? true : false); +#endif +#if JVET_R0341_GCI + READ_FLAG(symbol, "gci_no_chroma_qp_offset_constraint_flag"); cinfo->setNoChromaQpOffsetConstraintFlag(symbol > 0 ? true : false); #endif READ_FLAG(symbol, "no_lmcs_constraint_flag"); cinfo->setNoLmcsConstraintFlag(symbol > 0 ? true : false); READ_FLAG(symbol, "no_qp_delta_constraint_flag"); cinfo->setNoQpDeltaConstraintFlag(symbol > 0 ? true : false); diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index 896610340bcae863479338852c078daf126142d4..df5a09305b56d757e315285260acafdeadf28e6d 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -202,6 +202,9 @@ protected: #endif #if JVET_S0058_GCI bool m_noMttConstraintFlag; +#endif +#if JVET_R0341_GCI + bool m_noChromaQpOffsetConstraintFlag; #endif bool m_noQtbttDualTreeIntraConstraintFlag; #if JVET_S0066_GCI @@ -856,6 +859,10 @@ public: #if JVET_S0058_GCI bool getNoMttConstraintFlag() const { return m_noMttConstraintFlag; } void setNoMttConstraintFlag(bool val) { m_noMttConstraintFlag = val; } +#endif +#if JVET_R0341_GCI + bool getNoChromaQpOffsetConstraintFlag() const { return m_noChromaQpOffsetConstraintFlag; } + void setNoChromaQpOffsetConstraintFlag(bool bVal) { m_noChromaQpOffsetConstraintFlag = bVal; } #endif bool getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; } void setNoQtbttDualTreeIntraConstraintFlag(bool val) { m_noQtbttDualTreeIntraConstraintFlag = val; } diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index c8b7fefc1a60a60ddd41ed30f0c153d849d6b3a8..9bfd1e402120aa1d66567e31e7ff00bb73a4cfef 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1165,6 +1165,9 @@ void EncLib::xInitSPS( SPS& sps ) #endif #if JVET_S0058_GCI cinfo->setNoMttConstraintFlag(m_noMttConstraintFlag); +#endif +#if JVET_R0341_GCI + cinfo->setNoChromaQpOffsetConstraintFlag(m_noChromaQpOffsetConstraintFlag); #endif cinfo->setNoQtbttDualTreeIntraConstraintFlag(m_noQtbttDualTreeIntraConstraintFlag); cinfo->setNoPartitionConstraintsOverrideConstraintFlag(m_noPartitionConstraintsOverrideConstraintFlag); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 704d9ff9074cdb54d97073f6bed48527563f7249..ace8479ba0803829a8e35cc5c01cf164ca029745 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -2774,6 +2774,9 @@ void HLSWriter::codeConstraintInfo ( const ConstraintInfo* cinfo ) WRITE_FLAG(cinfo->getNoActConstraintFlag() ? 1 : 0, "no_act_constraint_flag"); #if JVET_S0050_GCI WRITE_FLAG(cinfo->getNoExplicitScaleListConstraintFlag() ? 1 : 0, "no_explicit_scaling_list_constraint_flag"); +#endif +#if JVET_R0341_GCI + WRITE_FLAG(cinfo->getNoChromaQpOffsetConstraintFlag() ? 1 : 0, "gic_no_chroma_qp_offset_constraint_flag"); #endif WRITE_FLAG(cinfo->getNoLmcsConstraintFlag() ? 1 : 0, "no_lmcs_constraint_flag"); WRITE_FLAG(cinfo->getNoQpDeltaConstraintFlag() ? 1 : 0, "no_qp_delta_constraint_flag");