From f227b0172bd20c4ac2917eb76a734568ccfdf000 Mon Sep 17 00:00:00 2001 From: Tomohiro Ikai <ikai.tomohiro@sharp.co.jp> Date: Tue, 9 Nov 2021 07:20:01 +0000 Subject: [PATCH] JVET_X0076_X0095_V2_GCI --- doc/software-manual.tex | 29 +++++++++++++++++++++++++++++ source/App/EncoderApp/EncApp.cpp | 19 +++++++++++++++++++ source/App/EncoderApp/EncAppCfg.cpp | 7 +++++++ source/App/EncoderApp/EncAppCfg.h | 7 +++++++ source/Lib/CommonLib/Slice.h | 26 ++++++++++++++++++++++++++ source/Lib/CommonLib/TypeDef.h | 2 ++ source/Lib/DecoderLib/VLCReader.cpp | 9 +++++++++ source/Lib/EncoderLib/EncCfg.h | 19 +++++++++++++++++++ source/Lib/EncoderLib/EncLib.cpp | 7 +++++++ source/Lib/EncoderLib/VLCWriter.cpp | 11 +++++++++++ 10 files changed, 136 insertions(+) diff --git a/doc/software-manual.tex b/doc/software-manual.tex index c7e5c7f99..5a28f8784 100644 --- a/doc/software-manual.tex +++ b/doc/software-manual.tex @@ -1435,6 +1435,35 @@ Specifies the value of gci_no_virtual_boundaries_constraint_flag \Default{false} & Indicate that all pictures in OlsInScope are IRAP pictures or GDR pictures with ph_recovery_poc_cnt equal to 0 \\ +\Option{NoExtendedPrecisionProcessingConstraintFlag} & +%\ShortOption{\None} & +\Default{false} & +Specifies the value of gci_no_extended_precision_processing_constraint_flag +\\ + +\Option{NoTsResidualCodingRiceConstraintFlag} & +%\ShortOption{\None} & +\Default{false} & +Specifies the value of gci_no_ts_residual_coding_rice_constraint_flag +\\ + +\Option{NoRrcRiceExtensionConstraintFlag} & +%\ShortOption{\None} & +\Default{false} & +Specifies the value of gci_no_rrc_rice_extension_constraint_flag +\\ + +\Option{NoPersistentRiceAdaptationConstraintFlag} & +%\ShortOption{\None} & +\Default{false} & +Specifies the value of gci_no_persistent_rice_adaptation_constraint_flag +\\ + +\Option{NoReverseLastSigCoeffConstraintFlag} & +%\ShortOption{\None} & +\Default{false} & +Specifies the value of gci_no_reverse_last_sig_coeff_constraint_flag +\\ \end{OptionTableNoShorthand} diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 7e031f619..4efcbcb9f 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -460,6 +460,18 @@ void EncApp::xInitLibCfg() { CHECK(m_generalLowerBitRateConstraintFlag==0, "generalLowerBitRateConstraintFlag shall be 1 when non-Intra/Still Picture operation range extension profiles are used"); } +#endif +#if JVET_X0076_X0095_V2_GCI + m_cEncLib.setNoExtendedPrecisionProcessingConstraintFlag(m_noExtendedPrecisionProcessingConstraintFlag); + CHECK(m_noExtendedPrecisionProcessingConstraintFlag && m_extendedPrecisionProcessingFlag, "ExtendedPrecision shall be deactivated when m_noExtendedPrecisionProcessingConstraintFlag is equal to 1"); + m_cEncLib.setNoTsResidualCodingRiceConstraintFlag(m_noTsResidualCodingRiceConstraintFlag); + CHECK(m_noTsResidualCodingRiceConstraintFlag && m_tsrcRicePresentFlag, "TSRCRicePresent shall be deactivated when m_noTsResidualCodingRiceConstraintFlag is equal to 1"); + m_cEncLib.setNoRrcRiceExtensionConstraintFlag(m_noRrcRiceExtensionConstraintFlag); + CHECK(m_noRrcRiceExtensionConstraintFlag && m_rrcRiceExtensionEnableFlag, "ExtendedRiceRRC shall be deactivated when m_noRrcRiceExtensionConstraintFlag is equal to 1"); + m_cEncLib.setNoPersistentRiceAdaptationConstraintFlag(m_noPersistentRiceAdaptationConstraintFlag); + CHECK(m_noPersistentRiceAdaptationConstraintFlag && m_persistentRiceAdaptationEnabledFlag, "GolombRiceParameterAdaptation shall be deactivated when m_noPersistentRiceAdaptationConstraintFlag is equal to 1"); + m_cEncLib.setNoReverseLastSigCoeffConstraintFlag(m_noReverseLastSigCoeffConstraintFlag); + CHECK(m_noReverseLastSigCoeffConstraintFlag && m_reverseLastSigCoeffEnabledFlag, "ReverseLastSigCoeff shall be deactivated when m_noReverseLastSigCoeffConstraintFlag is equal to 1"); #endif } else @@ -530,6 +542,13 @@ void EncApp::xInitLibCfg() m_cEncLib.setAllRapPicturesFlag(false); #else m_cEncLib.setGeneralLowerBitRateConstraintFlag(false); +#endif +#if JVET_X0076_X0095_V2_GCI + m_cEncLib.setNoExtendedPrecisionProcessingConstraintFlag(false); + m_cEncLib.setNoTsResidualCodingRiceConstraintFlag(false); + m_cEncLib.setNoRrcRiceExtensionConstraintFlag(false); + m_cEncLib.setNoPersistentRiceAdaptationConstraintFlag(false); + m_cEncLib.setNoReverseLastSigCoeffConstraintFlag(false); #endif } diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index 1eb35ecd5..2944b9ae0 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -936,6 +936,13 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) #else ("GeneralLowerBitRateConstraintFlag", m_generalLowerBitRateConstraintFlag, false, "Indicate whether lower bitrate constraint is used") #endif +#if JVET_X0076_X0095_V2_GCI + ("NoExtendedPrecisionProcessingConstraintFlag", m_noExtendedPrecisionProcessingConstraintFlag, false, "Indicate that ExtendedPrecision is deactivated") + ("NoTsResidualCodingRiceConstraintFlag", m_noTsResidualCodingRiceConstraintFlag, false, "Indicate that TSRCRicePresent is deactivated") + ("NoRrcRiceExtensionConstraintFlag", m_noRrcRiceExtensionConstraintFlag, false, "Indicate that ExtendedRiceRRC is deactivated") + ("NoPersistentRiceAdaptationConstraintFlag", m_noPersistentRiceAdaptationConstraintFlag, false, "Indicate that GolombRiceParameterAdaptation is deactivated") + ("NoReverseLastSigCoeffConstraintFlag", m_noReverseLastSigCoeffConstraintFlag, false, "Indicate that ReverseLastSigCoeff is deactivated") +#endif ("CTUSize", m_uiCTUSize, 128u, "CTUSize (specifies the CTU size if QTBT is on) [default: 128]") ("Log2MinCuSize", m_log2MinCuSize, 2u, "Log2 min CU size") diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index 0ce7304e7..ccf8cfa6c 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -194,6 +194,13 @@ protected: #else bool m_generalLowerBitRateConstraintFlag; #endif +#if JVET_X0076_X0095_V2_GCI + bool m_noExtendedPrecisionProcessingConstraintFlag; + bool m_noTsResidualCodingRiceConstraintFlag; + bool m_noRrcRiceExtensionConstraintFlag; + bool m_noPersistentRiceAdaptationConstraintFlag; + bool m_noReverseLastSigCoeffConstraintFlag; +#endif // profile/level Profile::Name m_profile; diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index b92fc2535..48769fe8c 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -309,6 +309,13 @@ class ConstraintInfo #if JVET_X0079_MODIFIED_BITRATE bool m_allRapPicturesFlag; #endif +#if JVET_X0076_X0095_V2_GCI + bool m_noExtendedPrecisionProcessingConstraintFlag; + bool m_noTsResidualCodingRiceConstraintFlag; + bool m_noRrcRiceExtensionConstraintFlag; + bool m_noPersistentRiceAdaptationConstraintFlag; + bool m_noReverseLastSigCoeffConstraintFlag; +#endif public: ConstraintInfo() @@ -384,6 +391,13 @@ public: , m_noApsConstraintFlag (false) #if JVET_X0079_MODIFIED_BITRATE , m_allRapPicturesFlag (false) +#endif +#if JVET_X0076_X0095_V2_GCI + , m_noExtendedPrecisionProcessingConstraintFlag (false) + , m_noTsResidualCodingRiceConstraintFlag (false) + , m_noRrcRiceExtensionConstraintFlag (false) + , m_noPersistentRiceAdaptationConstraintFlag (false) + , m_noReverseLastSigCoeffConstraintFlag (false) #endif {} @@ -545,6 +559,18 @@ public: bool getAllRapPicturesFlag() const { return m_allRapPicturesFlag; } void setAllRapPicturesFlag(bool bVal) { m_allRapPicturesFlag = bVal; } #endif +#if JVET_X0076_X0095_V2_GCI + bool getNoExtendedPrecisionProcessingConstraintFlag() const { return m_noExtendedPrecisionProcessingConstraintFlag; } + void setNoExtendedPrecisionProcessingConstraintFlag(bool val) { m_noExtendedPrecisionProcessingConstraintFlag = val; } + bool getNoTsResidualCodingRiceConstraintFlag() const { return m_noTsResidualCodingRiceConstraintFlag; } + void setNoTsResidualCodingRiceConstraintFlag(bool val) { m_noTsResidualCodingRiceConstraintFlag = val; } + bool getNoRrcRiceExtensionConstraintFlag() const { return m_noRrcRiceExtensionConstraintFlag; } + void setNoRrcRiceExtensionConstraintFlag(bool val) { m_noRrcRiceExtensionConstraintFlag = val; } + bool getNoPersistentRiceAdaptationConstraintFlag() const { return m_noPersistentRiceAdaptationConstraintFlag; } + void setNoPersistentRiceAdaptationConstraintFlag(bool val) { m_noPersistentRiceAdaptationConstraintFlag = val; } + bool getNoReverseLastSigCoeffConstraintFlag() const { return m_noReverseLastSigCoeffConstraintFlag; } + void setNoReverseLastSigCoeffConstraintFlag(bool val) { m_noReverseLastSigCoeffConstraintFlag = val; } +#endif friend bool operator == (const ConstraintInfo& op1, const ConstraintInfo& op2); friend bool operator != (const ConstraintInfo& op1, const ConstraintInfo& op2); diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 387805986..83694e9df 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -62,6 +62,8 @@ #define JVET_X0137_ETSRC_RLSCP_DETERMINATION 1 // JVET-X0137 Determine signalled parameters for ETSRC and RLSCP using estimated residual +#define JVET_X0076_X0095_V2_GCI 1 // JVET-X0076/X0095 GCI flags for VVC V2 tools + //########### place macros to be be kept below this line ############### #define GDR_ENABLED 1 diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 0605de35b..a82bfe1f0 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -4600,7 +4600,16 @@ void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo, const ProfileTie if (numAdditionalBits > 0) { READ_FLAG(symbol, "gci_all_rap_pictures_flag"); cinfo->setAllRapPicturesFlag(symbol > 0 ? true : false); +#if JVET_X0076_X0095_V2_GCI + READ_FLAG(symbol, "gci_no_extended_precision_processing_constraint_flag"); cinfo->setNoExtendedPrecisionProcessingConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "gci_no_ts_residual_coding_rice_constraint_flag"); cinfo->setNoTsResidualCodingRiceConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "gci_no_rrc_rice_extension_constraint_flag"); cinfo->setNoRrcRiceExtensionConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "gci_no_persistent_rice_adaptation_constraint_flag"); cinfo->setNoPersistentRiceAdaptationConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "gci_no_reverse_last_sig_coeff_constraint_flag"); cinfo->setNoReverseLastSigCoeffConstraintFlag(symbol > 0 ? true : false); + numAdditionalBitsUsed = 6; +#else numAdditionalBitsUsed = 1; +#endif } else { diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index 69cadf7bf..748f5680b 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -240,6 +240,13 @@ protected: #else bool m_generalLowerBitRateConstraintFlag; #endif +#if JVET_X0076_X0095_V2_GCI + bool m_noExtendedPrecisionProcessingConstraintFlag; + bool m_noTsResidualCodingRiceConstraintFlag; + bool m_noRrcRiceExtensionConstraintFlag; + bool m_noPersistentRiceAdaptationConstraintFlag; + bool m_noReverseLastSigCoeffConstraintFlag; +#endif /* profile & level */ Profile::Name m_profile; @@ -1021,6 +1028,18 @@ public: bool getGeneralLowerBitRateConstraintFlag() const { return m_generalLowerBitRateConstraintFlag; } void setGeneralLowerBitRateConstraintFlag(bool val) { m_generalLowerBitRateConstraintFlag = val; } #endif +#if JVET_X0076_X0095_V2_GCI + bool getNoExtendedPrecisionProcessingConstraintFlag() const { return m_noExtendedPrecisionProcessingConstraintFlag; } + void setNoExtendedPrecisionProcessingConstraintFlag(bool val) { m_noExtendedPrecisionProcessingConstraintFlag = val; } + bool getNoTsResidualCodingRiceConstraintFlag() const { return m_noTsResidualCodingRiceConstraintFlag; } + void setNoTsResidualCodingRiceConstraintFlag(bool val) { m_noTsResidualCodingRiceConstraintFlag = val; } + bool getNoRrcRiceExtensionConstraintFlag() const { return m_noRrcRiceExtensionConstraintFlag; } + void setNoRrcRiceExtensionConstraintFlag(bool val) { m_noRrcRiceExtensionConstraintFlag = val; } + bool getNoPersistentRiceAdaptationConstraintFlag() const { return m_noPersistentRiceAdaptationConstraintFlag; } + void setNoPersistentRiceAdaptationConstraintFlag(bool val) { m_noPersistentRiceAdaptationConstraintFlag = val; } + bool getNoReverseLastSigCoeffConstraintFlag() const { return m_noReverseLastSigCoeffConstraintFlag; } + void setNoReverseLastSigCoeffConstraintFlag(bool val) { m_noReverseLastSigCoeffConstraintFlag = val; } +#endif void setFrameRate ( int i ) { m_iFrameRate = i; } void setFrameSkip ( uint32_t i ) { m_FrameSkip = i; } diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index 5f7f1d0a4..51ac4fd42 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -1123,6 +1123,13 @@ void EncLib::xInitSPS( SPS& sps ) #else cinfo->setLowerBitRateConstraintFlag(m_generalLowerBitRateConstraintFlag); #endif +#if JVET_X0076_X0095_V2_GCI + cinfo->setNoExtendedPrecisionProcessingConstraintFlag(m_noExtendedPrecisionProcessingConstraintFlag); + cinfo->setNoTsResidualCodingRiceConstraintFlag(m_noTsResidualCodingRiceConstraintFlag); + cinfo->setNoRrcRiceExtensionConstraintFlag(m_noRrcRiceExtensionConstraintFlag); + cinfo->setNoPersistentRiceAdaptationConstraintFlag(m_noPersistentRiceAdaptationConstraintFlag); + cinfo->setNoReverseLastSigCoeffConstraintFlag(m_noReverseLastSigCoeffConstraintFlag); +#endif profileTierLevel->setLevelIdc (m_level); profileTierLevel->setTierFlag (m_levelTier); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 7b963f001..c431ef9ce 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -2704,9 +2704,20 @@ void HLSWriter::codeConstraintInfo ( const ConstraintInfo* cinfo, const Profil profile == Profile::MAIN_16_444 || profile == Profile::MAIN_16_444_INTRA || profile == Profile::MAIN_16_444_STILL_PICTURE) { #if JVET_X0079_MODIFIED_BITRATE +#if JVET_X0076_X0095_V2_GCI + int numAdditionalBits = 6; +#else int numAdditionalBits = 1; +#endif WRITE_CODE(numAdditionalBits, 8, "gci_num_additional_bits"); WRITE_FLAG(cinfo->getAllRapPicturesFlag() ? 1 : 0, "gci_all_rap_pictures_flag"); +#if JVET_X0076_X0095_V2_GCI + WRITE_FLAG(cinfo->getNoExtendedPrecisionProcessingConstraintFlag() ? 1 : 0, "gci_no_extended_precision_processing_constraint_flag"); + WRITE_FLAG(cinfo->getNoTsResidualCodingRiceConstraintFlag() ? 1 : 0, "gci_no_ts_residual_coding_rice_constraint_flag"); + WRITE_FLAG(cinfo->getNoRrcRiceExtensionConstraintFlag() ? 1 : 0, "gci_no_rrc_rice_extension_constraint_flag"); + WRITE_FLAG(cinfo->getNoPersistentRiceAdaptationConstraintFlag() ? 1 : 0, "gci_no_persistent_rice_adaptation_constraint_flag"); + WRITE_FLAG(cinfo->getNoReverseLastSigCoeffConstraintFlag() ? 1 : 0, "gci_no_reverse_last_sig_coeff_constraint_flag"); +#endif #else int numReservedBits = 1; WRITE_CODE(numReservedBits, 8, "gci_num_reserved_bits"); -- GitLab