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