From 0ef3d5a6da0ecd0f7dd488ae6ec5404c276d6ea6 Mon Sep 17 00:00:00 2001
From: Han Gao <han.gao@huawei.com>
Date: Wed, 28 Nov 2018 16:22:44 +0100
Subject: [PATCH] move QT/BT/TT HLS from SPSNEXT to SPS, rebased master

---
 source/Lib/CommonLib/Slice.cpp           |  15 ++++
 source/Lib/CommonLib/Slice.h             |  70 ++++++++++++++-
 source/Lib/CommonLib/TypeDef.h           |   2 +
 source/Lib/CommonLib/UnitPartitioner.cpp |   6 +-
 source/Lib/CommonLib/UnitTools.cpp       |  18 +++-
 source/Lib/DecoderLib/CABACReader.cpp    |   4 +
 source/Lib/DecoderLib/VLCReader.cpp      | 105 +++++++++++++++++++++--
 source/Lib/EncoderLib/CABACWriter.cpp    |   4 +
 source/Lib/EncoderLib/EncCu.cpp          |   4 +
 source/Lib/EncoderLib/EncLib.cpp         |  25 +++++-
 source/Lib/EncoderLib/EncModeCtrl.cpp    |   6 +-
 source/Lib/EncoderLib/EncSlice.cpp       |  33 +++++--
 source/Lib/EncoderLib/VLCWriter.cpp      |  69 ++++++++++++++-
 13 files changed, 333 insertions(+), 28 deletions(-)

diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 0f77bcbfc..b541f612f 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -1809,6 +1809,7 @@ SPSNext::SPSNext( SPS& sps )
 #endif
 
   // default values for additional parameters
+#if !JVET_L0217_L0678_SPS_CLEANUP
   , m_CTUSize                   ( 0 )
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
   , m_minQT                     { 0, 0, 0 }
@@ -1820,6 +1821,7 @@ SPSNext::SPSNext( SPS& sps )
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
   , m_maxTTSize                 { MAX_TT_SIZE,  MAX_TT_SIZE_INTER,  MAX_TT_SIZE_C }
 #endif
+#endif
 #if !JVET_L0198_L0468_L0104_ATMVP_8x8SUB_BLOCK
   , m_subPuLog2Size             ( 0 )
 #endif
@@ -1847,6 +1849,19 @@ SPS::SPS()
 , m_picHeightInLumaSamples    (288)
 , m_log2MinCodingBlockSize    (  0)
 , m_log2DiffMaxMinCodingBlockSize(0)
+#if JVET_L0217_L0678_SPS_CLEANUP
+, m_CTUSize(0)
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+, m_minQT{ 0, 0, 0 }
+#else
+, m_minQT{ 0, 0 }
+#endif
+, m_maxBTDepth{ MAX_BT_DEPTH, MAX_BT_DEPTH_INTER, MAX_BT_DEPTH_C }
+, m_maxBTSize{ MAX_BT_SIZE,  MAX_BT_SIZE_INTER,  MAX_BT_SIZE_C }
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+, m_maxTTSize{ MAX_TT_SIZE,  MAX_TT_SIZE_INTER,  MAX_TT_SIZE_C }
+#endif
+#endif
 , m_uiMaxCUWidth              ( 32)
 , m_uiMaxCUHeight             ( 32)
 , m_uiMaxCodingDepth          (  3)
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index c54d840c0..3d377bc99 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -841,6 +841,7 @@ public:
 private:
   //=====  additional parameters  =====
   // qtbt
+#if !JVET_L0217_L0678_SPS_CLEANUP
   unsigned    m_CTUSize;
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
   unsigned    m_partitionOverrideEnalbed;       // enable partition constraints override function
@@ -852,6 +853,7 @@ private:
   unsigned    m_maxTTSize[3];
 #endif
   unsigned    m_dualITree;
+#endif
   // sub-pu merging
 #if !JVET_L0198_L0468_L0104_ATMVP_8x8SUB_BLOCK
   unsigned    m_subPuLog2Size;
@@ -927,6 +929,7 @@ public:
 #endif
   //=====  additional parameters  =====
   // qtbt
+#if !JVET_L0217_L0678_SPS_CLEANUP
   void      setCTUSize            ( unsigned    ctuSize )                           { m_CTUSize = ctuSize; }
   unsigned  getCTUSize            ()                                      const     { return  m_CTUSize;   }
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
@@ -960,7 +963,7 @@ public:
 
   void      setUseDualITree       ( bool b )                                        { m_dualITree = b; }
   bool      getUseDualITree       ()                                      const     { return m_dualITree; }
-
+#endif
   // sub pu tmvp
 #if !JVET_L0198_L0468_L0104_ATMVP_8x8SUB_BLOCK
   void      setSubPuMvpLog2Size   ( unsigned    log2Size )                          { m_subPuLog2Size = log2Size; }
@@ -1013,6 +1016,19 @@ private:
 
   int               m_log2MinCodingBlockSize;
   int               m_log2DiffMaxMinCodingBlockSize;
+#if JVET_L0217_L0678_SPS_CLEANUP
+  unsigned    m_CTUSize;
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  unsigned    m_partitionOverrideEnalbed;       // enable partition constraints override function
+#endif
+  unsigned    m_minQT[3];   // 0: I slice luma; 1: P/B slice; 2: I slice chroma
+  unsigned    m_maxBTDepth[3];
+  unsigned    m_maxBTSize[3];
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  unsigned    m_maxTTSize[3];
+#endif
+  unsigned    m_dualITree;
+#endif
   uint32_t              m_uiMaxCUWidth;
   uint32_t              m_uiMaxCUHeight;
   uint32_t              m_uiMaxCodingDepth; ///< Total CU depth, relative to the smallest possible transform block size.
@@ -1115,6 +1131,44 @@ public:
   void                    setLog2MinCodingBlockSize(int val)                                              { m_log2MinCodingBlockSize = val;                                      }
   int                     getLog2DiffMaxMinCodingBlockSize() const                                        { return m_log2DiffMaxMinCodingBlockSize;                              }
   void                    setLog2DiffMaxMinCodingBlockSize(int val)                                       { m_log2DiffMaxMinCodingBlockSize = val;                               }
+#if JVET_L0217_L0678_SPS_CLEANUP
+  void                    setCTUSize(unsigned    ctuSize)                                                 { m_CTUSize = ctuSize; }
+  unsigned                getCTUSize()                                                              const { return  m_CTUSize; }
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  void                    setSplitConsOverrideEnabledFlag(bool b)                                         { m_partitionOverrideEnalbed = b; }
+  bool                    getSplitConsOverrideEnabledFlag()                                         const { return m_partitionOverrideEnalbed; }
+#endif
+  void                    setMinQTSizes(unsigned*   minQT)                                                { m_minQT[0] = minQT[0]; m_minQT[1] = minQT[1]; m_minQT[2] = minQT[2]; }
+  unsigned                getMinQTSize(SliceType   slicetype,
+                                       ChannelType chType = CHANNEL_TYPE_LUMA)
+                                                                                                    const { return slicetype == I_SLICE ? (chType == CHANNEL_TYPE_LUMA ? m_minQT[0] : m_minQT[2]) : m_minQT[1]; }
+  void                    setMaxBTDepth(unsigned    maxBTDepth,
+                                        unsigned    maxBTDepthI,
+                                        unsigned    maxBTDepthIChroma)
+                                                                                                          { m_maxBTDepth[1] = maxBTDepth; m_maxBTDepth[0] = maxBTDepthI; m_maxBTDepth[2] = maxBTDepthIChroma; }
+  unsigned                getMaxBTDepth()                                                           const { return m_maxBTDepth[1]; }
+  unsigned                getMaxBTDepthI()                                                          const { return m_maxBTDepth[0]; }
+  unsigned                getMaxBTDepthIChroma()                                                    const { return m_maxBTDepth[2]; }
+  void                    setMaxBTSize(unsigned    maxBTSize,
+                                       unsigned    maxBTSizeI,
+                                       unsigned    maxBTSizeC) 
+                                                                                                          { m_maxBTSize[1] = maxBTSize; m_maxBTSize[0] = maxBTSizeI; m_maxBTSize[2] = maxBTSizeC; }
+  unsigned                getMaxBTSize()                                                            const { return m_maxBTSize[1]; }
+  unsigned                getMaxBTSizeI()                                                           const { return m_maxBTSize[0]; }
+  unsigned                getMaxBTSizeIChroma()                                                     const { return m_maxBTSize[2]; }
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  void                    setMaxTTSize(unsigned    maxTTSize,
+                                       unsigned    maxTTSizeI,
+                                       unsigned    maxTTSizeC)
+                                                                                                          { m_maxTTSize[1] = maxTTSize; m_maxTTSize[0] = maxTTSizeI; m_maxTTSize[2] = maxTTSizeC; }
+  unsigned                getMaxTTSize()                                                            const { return m_maxTTSize[1]; }
+  unsigned                getMaxTTSizeI()                                                           const { return m_maxTTSize[0]; }
+  unsigned                getMaxTTSizeIChroma()                                                     const { return m_maxTTSize[2]; }
+#endif 
+
+  void                    setUseDualITree(bool b) { m_dualITree = b; }
+  bool                    getUseDualITree()                                      const { return m_dualITree; }
+#endif
 
   void                    setMaxCUWidth( uint32_t u )                                                         { m_uiMaxCUWidth = u;                                                  }
   uint32_t                    getMaxCUWidth() const                                                           { return  m_uiMaxCUWidth;                                              }
@@ -2175,6 +2229,19 @@ public:
     , fastDeltaQPCuMaxSize( Clip3(sps.getMaxCUHeight() >> (sps.getLog2DiffMaxMinCodingBlockSize()), sps.getMaxCUHeight(), 32u) )
     , noChroma2x2         (  false )
     , isEncoder           ( _isEncoder )
+#if JVET_L0217_L0678_SPS_CLEANUP
+    , ISingleTree         ( !sps.getUseDualITree() )
+    , maxBtDepth          { sps.getMaxBTDepthI(), sps.getMaxBTDepth(), sps.getMaxBTDepthIChroma() }
+    , minBtSize           { MIN_BT_SIZE, MIN_BT_SIZE_INTER, MIN_BT_SIZE_C }
+    , maxBtSize           { sps.getMaxBTSizeI(), sps.getMaxBTSize(), sps.getMaxBTSizeIChroma() }
+    , minTtSize           { MIN_TT_SIZE, MIN_TT_SIZE_INTER, MIN_TT_SIZE_C }
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+    , maxTtSize           { sps.getMaxTTSizeI(), sps.getMaxTTSize(), sps.getMaxTTSizeIChroma() }
+#else
+    , maxTtSize           { MAX_TT_SIZE, MAX_TT_SIZE_INTER, MAX_TT_SIZE_C }
+#endif
+    , minQtSize           { sps.getMinQTSize(I_SLICE, CHANNEL_TYPE_LUMA), sps.getMinQTSize(B_SLICE, CHANNEL_TYPE_LUMA), sps.getMinQTSize(I_SLICE, CHANNEL_TYPE_CHROMA) }
+#else
     , ISingleTree         ( !sps.getSpsNext().getUseDualITree() )
     , maxBtDepth          { sps.getSpsNext().getMaxBTDepthI(), sps.getSpsNext().getMaxBTDepth(), sps.getSpsNext().getMaxBTDepthIChroma() }
     , minBtSize           { MIN_BT_SIZE, MIN_BT_SIZE_INTER, MIN_BT_SIZE_C }
@@ -2186,6 +2253,7 @@ public:
     , maxTtSize           { MAX_TT_SIZE, MAX_TT_SIZE_INTER, MAX_TT_SIZE_C }
 #endif
     , minQtSize           { sps.getSpsNext().getMinQTSize( I_SLICE, CHANNEL_TYPE_LUMA ), sps.getSpsNext().getMinQTSize( B_SLICE, CHANNEL_TYPE_LUMA ), sps.getSpsNext().getMinQTSize( I_SLICE, CHANNEL_TYPE_CHROMA ) }
+#endif
   {}
 
   const ChromaFormat chrFormat;
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 9f4077909..26280850f 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -175,6 +175,8 @@
 
 #endif
 #define JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT   1
+#define JVET_L0217_L0678_SPS_CLEANUP                      1 // move the QT/BT/TT related high level syntax element from SPSNext to SPS, delete HEVC RQT in SPS
+
 
 #define JVET_L0198_L0468_L0104_ATMVP_8x8SUB_BLOCK         1  // Fix sub-block size to 8x8 in ATMVP as proposed in L0198, L0468 and L0104
 #define JVET_L0198_ATMVP_SCAN_SIMP                        1  // Simplification for scan process in ATMVP cTMv derivation
diff --git a/source/Lib/CommonLib/UnitPartitioner.cpp b/source/Lib/CommonLib/UnitPartitioner.cpp
index b07df2328..9dd51e2d0 100644
--- a/source/Lib/CommonLib/UnitPartitioner.cpp
+++ b/source/Lib/CommonLib/UnitPartitioner.cpp
@@ -132,7 +132,11 @@ void Partitioner::copyState( const Partitioner& other )
 void AdaptiveDepthPartitioner::setMaxMinDepth( unsigned& minDepth, unsigned& maxDepth, const CodingStructure& cs ) const
 {
   unsigned          stdMinDepth = 0;
-  unsigned          stdMaxDepth = ( g_aucLog2[cs.sps->getSpsNext().getCTUSize()] - g_aucLog2[cs.sps->getSpsNext().getMinQTSize( cs.slice->getSliceType(), chType )]);
+#if JVET_L0217_L0678_SPS_CLEANUP
+  unsigned          stdMaxDepth = ( g_aucLog2[cs.sps->getCTUSize()] - g_aucLog2[cs.sps->getMinQTSize( cs.slice->getSliceType(), chType )]);
+#else
+  unsigned          stdMaxDepth = (g_aucLog2[cs.sps->getSpsNext().getCTUSize()] - g_aucLog2[cs.sps->getSpsNext().getMinQTSize(cs.slice->getSliceType(), chType)]);
+#endif
   const Position    pos         = currArea().blocks[chType].pos();
   const unsigned    curSliceIdx = cs.slice->getIndependentSliceIdx();
 #if HEVC_TILES_WPP
diff --git a/source/Lib/CommonLib/UnitTools.cpp b/source/Lib/CommonLib/UnitTools.cpp
index 94e2ae59f..2c0340099 100644
--- a/source/Lib/CommonLib/UnitTools.cpp
+++ b/source/Lib/CommonLib/UnitTools.cpp
@@ -2609,7 +2609,11 @@ void PU::xInheritedAffineMv( const PredictionUnit &pu, const PredictionUnit* puN
 
 #if JVET_L0694_AFFINE_LINEBUFFER_CLEANUP
   bool isTopCtuBoundary = false;
-  if ( (posNeiY + neiH) % pu.cs->sps->getSpsNext().getCTUSize() == 0 && (posNeiY + neiH) == posCurY )
+#if JVET_L0217_L0678_SPS_CLEANUP
+  if ( (posNeiY + neiH) % pu.cs->sps->getCTUSize() == 0 && (posNeiY + neiH) == posCurY )
+#else
+  if ((posNeiY + neiH) % pu.cs->sps->getSpsNext().getCTUSize() == 0 && (posNeiY + neiH) == posCurY)
+#endif
   {
     // use bottom-left and bottom-right sub-block MVs for inheritance
     const Position posRB = puNeighbour->Y().bottomRight();
@@ -4189,14 +4193,24 @@ static bool deriveScaledMotionTemporal( const Slice&      slice,
 void clipColPos(int& posX, int& posY, const PredictionUnit& pu)
 {
   Position puPos = pu.lumaPos();
+#if JVET_L0217_L0678_SPS_CLEANUP
+  int log2CtuSize = g_aucLog2[pu.cs->sps->getCTUSize()];
+#else
   int log2CtuSize = g_aucLog2[pu.cs->sps->getSpsNext().getCTUSize()];
+#endif
   int ctuX = ((puPos.x >> log2CtuSize) << log2CtuSize);
   int ctuY = ((puPos.y >> log2CtuSize) << log2CtuSize);
-
+#if JVET_L0217_L0678_SPS_CLEANUP
+  int horMax = std::min((int)pu.cs->sps->getPicWidthInLumaSamples() - 1, ctuX + (int)pu.cs->sps->getCTUSize() + 3);
+  int horMin = std::max((int)0, ctuX);
+  int verMax = std::min((int)pu.cs->sps->getPicHeightInLumaSamples() - 1, ctuY + (int)pu.cs->sps->getCTUSize() - 1);
+  int verMin = std::max((int)0, ctuY);
+#else
   int horMax = std::min((int)pu.cs->sps->getPicWidthInLumaSamples() - 1, ctuX + (int)pu.cs->sps->getSpsNext().getCTUSize() + 3);
   int horMin = std::max((int)0, ctuX);
   int verMax = std::min((int)pu.cs->sps->getPicHeightInLumaSamples() - 1, ctuY + (int)pu.cs->sps->getSpsNext().getCTUSize() - 1);
   int verMin = std::max((int)0, ctuY);
+#endif
 
   posX = std::min(horMax, std::max(horMin, posX));
   posY = std::min(verMax, std::max(verMin, posY));
diff --git a/source/Lib/DecoderLib/CABACReader.cpp b/source/Lib/DecoderLib/CABACReader.cpp
index 29fa8027e..b7f8b557f 100644
--- a/source/Lib/DecoderLib/CABACReader.cpp
+++ b/source/Lib/DecoderLib/CABACReader.cpp
@@ -633,7 +633,11 @@ PartSplit CABACReader::split_cu_mode_mt( CodingStructure& cs, Partitioner &parti
 bool CABACReader::split_cu_flag( CodingStructure& cs, Partitioner &partitioner )
 {
   // TODO: make maxQTDepth a slice parameter
+#if JVET_L0217_L0678_SPS_CLEANUP
+  unsigned maxQTDepth = (g_aucLog2[cs.sps->getCTUSize()] - g_aucLog2[cs.sps->getMinQTSize(cs.slice->getSliceType(), partitioner.chType)]);
+#else
   unsigned maxQTDepth = ( g_aucLog2[cs.sps->getSpsNext().getCTUSize()] - g_aucLog2[cs.sps->getSpsNext().getMinQTSize( cs.slice->getSliceType(), partitioner.chType )] );
+#endif
   if( partitioner.currDepth == maxQTDepth )
   {
     return false;
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index a72c94c67..68ef05660 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -830,6 +830,7 @@ void HLSyntaxReader::parseSPSNext( SPSNext& spsNext, const bool usePCM )
 #endif
 
   // additional parameters
+#if !JVET_L0217_L0678_SPS_CLEANUP
   unsigned  minQT [3] = { 0, 0, 0 };
   unsigned  maxBTD[3] = { 0, 0, 0 };
 
@@ -894,7 +895,7 @@ void HLSyntaxReader::parseSPSNext( SPSNext& spsNext, const bool usePCM )
 #else
   spsNext.setMaxBTDepth( maxBTD[0], maxBTD[1], maxBTD[2] );
 #endif
-
+#endif
   if( spsNext.getUseSubPuMvp() )
   {
 #if !JVET_L0198_L0468_L0104_ATMVP_8x8SUB_BLOCK
@@ -1020,7 +1021,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS)
     }
   }
 
-
+#if !JVET_L0217_L0678_SPS_CLEANUP
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
   READ_UVLC( uiCode, "log2_min_luma_coding_block_size_minus2");
   int log2MinCUSize = uiCode + 2;
@@ -1031,26 +1032,104 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS)
   pcSPS->setLog2MinCodingBlockSize(log2MinCUSize);
   READ_UVLC( uiCode, "log2_diff_max_min_luma_coding_block_size" );
   pcSPS->setLog2DiffMaxMinCodingBlockSize(uiCode);
+#endif
+#if JVET_L0217_L0678_SPS_CLEANUP
+  unsigned  minQT[3] = { 0, 0, 0 };
+  unsigned  maxBTD[3] = { 0, 0, 0 };
+
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  unsigned  maxBTSize[3] = { 0, 0, 0 };
+  unsigned  maxTTSize[3] = { 0, 0, 0 };
+#endif
+  READ_FLAG(uiCode, "qtbt_dual_intra_tree");                   pcSPS->setUseDualITree(uiCode);
+  READ_UVLC(uiCode, "log2_CTU_size_minus2");                   pcSPS->setCTUSize(1 << (uiCode + 2));
+  pcSPS->setMaxCodingDepth(uiCode);
+  pcSPS->setLog2DiffMaxMinCodingBlockSize(uiCode);
+  pcSPS->setMaxCUWidth(pcSPS->getCTUSize());
+  pcSPS->setMaxCUHeight(pcSPS->getCTUSize());
+
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  READ_UVLC(uiCode, "log2_min_luma_coding_block_size_minus2");
+  int log2MinCUSize = uiCode + 2;
+#else
+  READ_UVLC(uiCode, "log2_min_luma_coding_block_size_minus3");
+  int log2MinCUSize = uiCode + 3;
+#endif
+  pcSPS->setLog2MinCodingBlockSize(log2MinCUSize);
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  READ_FLAG(uiCode, "sps_override_partition_constraints_enable_flag"); pcSPS->setSplitConsOverrideEnabledFlag(uiCode);
+  READ_UVLC(uiCode, "sps_log2_diff_min_qt_min_cb_intra_slice");      minQT[0] = 1 << (uiCode + pcSPS->getLog2MinCodingBlockSize());
+  READ_UVLC(uiCode, "sps_log2_diff_min_qt_min_cb_inter_slice");      minQT[1] = 1 << (uiCode + pcSPS->getLog2MinCodingBlockSize());
+  READ_UVLC(uiCode, "sps_max_mtt_hierarchy_depth_inter_slices");     maxBTD[1] = uiCode;
+  READ_UVLC(uiCode, "sps_max_mtt_hierarchy_depth_intra_slices");     maxBTD[0] = uiCode;
+#else
+  READ_UVLC(uiCode, "log2_minQT_ISlice_minus2");               minQT[0] = 1 << (uiCode + MIN_CU_LOG2);
+  READ_UVLC(uiCode, "log2_minQT_PBSlice_minus2");              minQT[1] = 1 << (uiCode + MIN_CU_LOG2);
+  READ_UVLC(uiCode, "max_bt_depth");                           maxBTD[0] = uiCode;
+  READ_UVLC(uiCode, "max_bt_depth_i_slice");                   maxBTD[1] = uiCode;
+#endif
+
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  maxTTSize[0] = maxBTSize[0] = minQT[0];
+  if (maxBTD[0] != 0)
+  {
+    READ_UVLC(uiCode, "sps_log2_diff_max_bt_min_qt_intra_slice");     maxBTSize[0] <<= uiCode;
+    READ_UVLC(uiCode, "sps_log2_diff_max_tt_min_qt_intra_slice");     maxTTSize[0] <<= uiCode;
+  }
+  maxTTSize[1] = maxBTSize[1] = minQT[1];
+  if (maxBTD[1] != 0)
+  {
+    READ_UVLC(uiCode, "sps_log2_diff_max_bt_min_qt_inter_slice");     maxBTSize[1] <<= uiCode;
+    READ_UVLC(uiCode, "sps_log2_diff_max_tt_min_qt_inter_slice");     maxTTSize[1] <<= uiCode;
+  }
+#endif
+  if (pcSPS->getUseDualITree())
+  {
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+    READ_UVLC(uiCode, "sps_log2_diff_min_qt_min_cb_intra_slice_chroma"); minQT[2] = 1 << (uiCode + pcSPS->getLog2MinCodingBlockSize());
+    READ_UVLC(uiCode, "sps_max_mtt_hierarchy_depth_intra_slices_chroma"); maxBTD[2] = uiCode;
+    maxTTSize[2] = maxBTSize[2] = minQT[2];
+    if (maxBTD[2] != 0)
+    {
+      READ_UVLC(uiCode, "sps_log2_diff_max_bt_min_qt_intra_slice_chroma");       maxBTSize[2] <<= uiCode;
+      READ_UVLC(uiCode, "sps_log2_diff_max_tt_min_qt_intra_slice_chroma");       maxTTSize[2] <<= uiCode;
+    }
+#else
+    READ_UVLC(uiCode, "log2_minQT_ISliceChroma_minus2");        minQT[2] = 1 << (uiCode + MIN_CU_LOG2);
+    READ_UVLC(uiCode, "max_bt_depth_i_slice_chroma");           maxBTD[2] = uiCode;
+#endif
+}
+
+  pcSPS->setMinQTSizes(minQT);
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  pcSPS->setMaxBTDepth(maxBTD[1], maxBTD[0], maxBTD[2]);
+  pcSPS->setMaxBTSize(maxBTSize[1], maxBTSize[0], maxBTSize[2]);
+  pcSPS->setMaxTTSize(maxTTSize[1], maxTTSize[0], maxTTSize[2]);
+#else
+  pcSPS->setMaxBTDepth(maxBTD[0], maxBTD[1], maxBTD[2]);
+#endif
+#endif
 
   if (pcSPS->getPTL()->getGeneralPTL()->getLevelIdc() >= Level::LEVEL5)
   {
     CHECK(log2MinCUSize + pcSPS->getLog2DiffMaxMinCodingBlockSize() < 5, "Invalid code");
   }
-
+#if !JVET_L0217_L0678_SPS_CLEANUP
   int maxCUDepthDelta = uiCode;
   pcSPS->setMaxCUWidth  ( 1<<(log2MinCUSize + maxCUDepthDelta) );
   pcSPS->setMaxCUHeight ( 1<<(log2MinCUSize + maxCUDepthDelta) );
+#endif
   READ_UVLC( uiCode, "log2_min_luma_transform_block_size_minus2" );   pcSPS->setQuadtreeTULog2MinSize( uiCode + 2 );
 
   READ_UVLC( uiCode, "log2_diff_max_min_luma_transform_block_size" ); pcSPS->setQuadtreeTULog2MaxSize( uiCode + pcSPS->getQuadtreeTULog2MinSize() );
   pcSPS->setMaxTrSize( 1<<(uiCode + pcSPS->getQuadtreeTULog2MinSize()) );
-
+#if !JVET_L0217_L0678_SPS_CLEANUP
     READ_UVLC( uiCode, "max_transform_hierarchy_depth_inter" );    pcSPS->setQuadtreeTUMaxDepthInter( uiCode + 1 );
     READ_UVLC( uiCode, "max_transform_hierarchy_depth_intra" );    pcSPS->setQuadtreeTUMaxDepthIntra( uiCode + 1 );
 
   int addCuDepth = std::max (0, log2MinCUSize - (int)pcSPS->getQuadtreeTULog2MinSize() );
   pcSPS->setMaxCodingDepth( maxCUDepthDelta + addCuDepth );
-
+#endif
   READ_FLAG( uiCode, "sps_alf_enable_flag" ); pcSPS->setUseALF( uiCode );
 
 #if HEVC_USE_SCALING_LISTS
@@ -1729,7 +1808,13 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para
     }
 #endif
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
-    if (sps->getSpsNext().getSplitConsOverrideEnabledFlag())
+    if (
+#if JVET_L0217_L0678_SPS_CLEANUP
+      sps->getSplitConsOverrideEnabledFlag()
+#else
+      sps->getSpsNext().getSplitConsOverrideEnabledFlag()
+#endif
+      )
     {
       READ_FLAG(uiCode, "partition_constrainst_override_flag");        pcSlice->setSplitConsOverrideFlag(uiCode ? true : false);
       if (pcSlice->getSplitConsOverrideFlag())
@@ -1746,7 +1831,13 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para
           pcSlice->setMaxBTSize(pcSlice->getMinQTSize());
           pcSlice->setMaxTTSize(pcSlice->getMinQTSize());
         }
-        if (pcSlice->isIntra() && sps->getSpsNext().getUseDualITree())
+        if (
+#if JVET_L0217_L0678_SPS_CLEANUP
+          pcSlice->isIntra() && sps->getUseDualITree()
+#else
+          pcSlice->isIntra() && sps->getSpsNext().getUseDualITree()
+#endif
+          )
         {
           READ_UVLC(uiCode, "log2_diff_min_qt_min_cb_chroma");                 pcSlice->setMinQTSizeIChroma(1 << (uiCode + sps->getLog2MinCodingBlockSize()));
           READ_UVLC(uiCode, "max_mtt_hierarchy_depth_chroma");                            pcSlice->setMaxBTDepthIChroma(uiCode);
diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp
index 576b5cd96..9ff380591 100644
--- a/source/Lib/EncoderLib/CABACWriter.cpp
+++ b/source/Lib/EncoderLib/CABACWriter.cpp
@@ -529,7 +529,11 @@ void CABACWriter::coding_tree(const CodingStructure& cs, Partitioner& partitione
 
 void CABACWriter::split_cu_flag( bool split, const CodingStructure& cs, Partitioner& partitioner )
 {
+#if JVET_L0217_L0678_SPS_CLEANUP
+  unsigned maxQTDepth = ( g_aucLog2[cs.sps->getCTUSize()] - g_aucLog2[cs.sps->getMinQTSize(cs.slice->getSliceType(), partitioner.chType)] );
+#else
   unsigned maxQTDepth = ( g_aucLog2[cs.sps->getSpsNext().getCTUSize()] - g_aucLog2[cs.sps->getSpsNext().getMinQTSize( cs.slice->getSliceType(), partitioner.chType )] );
+#endif
   if( partitioner.currDepth == maxQTDepth )
   {
     return;
diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp
index e7fc09971..aacd729c0 100644
--- a/source/Lib/EncoderLib/EncCu.cpp
+++ b/source/Lib/EncoderLib/EncCu.cpp
@@ -1236,7 +1236,11 @@ void EncCu::xCheckModeSplit(CodingStructure *&tempCS, CodingStructure *&bestCS,
     if( m_pcEncCfg->getUseFastLCTU() )
     {
       unsigned minDepth = 0;
+#if JVET_L0217_L0678_SPS_CLEANUP
+      unsigned maxDepth = g_aucLog2[tempCS->sps->getCTUSize()] - g_aucLog2[tempCS->sps->getMinQTSize(slice.getSliceType(), partitioner.chType)];
+#else
       unsigned maxDepth = g_aucLog2[tempCS->sps->getSpsNext().getCTUSize()] - g_aucLog2[tempCS->sps->getSpsNext().getMinQTSize( slice.getSliceType(), partitioner.chType )];
+#endif
 
       if( auto ad = dynamic_cast<AdaptiveDepthPartitioner*>( &partitioner ) )
       {
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index e57939ac7..1cb62367f 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -824,15 +824,26 @@ void EncLib::xInitSPS(SPS &sps)
   sps.setLog2DiffMaxMinCodingBlockSize(m_log2DiffMaxMinCodingBlockSize);
 
   sps.getSpsNext().setNextToolsEnabled      ( m_profile == Profile::NEXT );
-  sps.getSpsNext().setCTUSize               ( m_CTUSize );
+#if JVET_L0217_L0678_SPS_CLEANUP
+  sps.setCTUSize                             ( m_CTUSize );
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
-  sps.getSpsNext().setSplitConsOverrideEnabledFlag( m_useSplitConsOverride );
+  sps.setSplitConsOverrideEnabledFlag        ( m_useSplitConsOverride );
+#endif
+  sps.setMinQTSizes                          ( m_uiMinQT );
+  sps.getSpsNext().setUseLargeCTU            ( m_LargeCTU );
+  sps.setMaxBTDepth                          ( m_uiMaxBTDepth, m_uiMaxBTDepthI, m_uiMaxBTDepthIChroma );
+  sps.setUseDualITree                        ( m_dualITree );
+#else
+  sps.getSpsNext().setCTUSize                (m_CTUSize);
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  sps.getSpsNext().setSplitConsOverrideEnabledFlag(m_useSplitConsOverride);
 #endif
   sps.getSpsNext().setMinQTSizes            ( m_uiMinQT );
   sps.getSpsNext().setUseLargeCTU           ( m_LargeCTU );
   sps.getSpsNext().setMaxBTDepth            ( m_uiMaxBTDepth, m_uiMaxBTDepthI, m_uiMaxBTDepthIChroma );
   sps.getSpsNext().setUseDualITree          ( m_dualITree );
-  sps.getSpsNext().setSubPuMvpMode(m_SubPuMvpMode);
+#endif
+  sps.getSpsNext().setSubPuMvpMode          ( m_SubPuMvpMode );
 #if !JVET_L0198_L0468_L0104_ATMVP_8x8SUB_BLOCK
   sps.getSpsNext().setSubPuMvpLog2Size(m_SubPuMvpLog2Size);
 #endif 
@@ -1315,7 +1326,13 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps)
  #endif
   pps.setSliceChromaQpFlag(bChromaDeltaQPEnabled);
 #endif
-  if (!pps.getSliceChromaQpFlag() && sps.getSpsNext().getUseDualITree() && (getChromaFormatIdc() != CHROMA_400))
+  if (
+#if JVET_L0217_L0678_SPS_CLEANUP
+    !pps.getSliceChromaQpFlag() && sps.getUseDualITree() 
+#else
+    !pps.getSliceChromaQpFlag() && sps.getSpsNext().getUseDualITree()
+#endif
+    && (getChromaFormatIdc() != CHROMA_400))
   {
     pps.setSliceChromaQpFlag(m_chromaCbQpOffsetDualTree != 0 || m_chromaCrQpOffsetDualTree != 0);
   }
diff --git a/source/Lib/EncoderLib/EncModeCtrl.cpp b/source/Lib/EncoderLib/EncModeCtrl.cpp
index 8278d015f..a6ba8d5d2 100644
--- a/source/Lib/EncoderLib/EncModeCtrl.cpp
+++ b/source/Lib/EncoderLib/EncModeCtrl.cpp
@@ -878,7 +878,11 @@ void EncModeCtrlMTnoRQT::initCULevel( Partitioner &partitioner, const CodingStru
 {
   // Min/max depth
   unsigned minDepth = 0;
-  unsigned maxDepth = g_aucLog2[cs.sps->getSpsNext().getCTUSize()] - g_aucLog2[cs.sps->getSpsNext().getMinQTSize( m_slice->getSliceType(), partitioner.chType )];
+#if JVET_L0217_L0678_SPS_CLEANUP
+  unsigned maxDepth = g_aucLog2[cs.sps->getCTUSize()] - g_aucLog2[cs.sps->getMinQTSize( m_slice->getSliceType(), partitioner.chType )];
+#else
+  unsigned maxDepth = g_aucLog2[cs.sps->getSpsNext().getCTUSize()] - g_aucLog2[cs.sps->getSpsNext().getMinQTSize(m_slice->getSliceType(), partitioner.chType)];
+#endif
   if( m_pcEncCfg->getUseFastLCTU() )
   {
     if( auto adPartitioner = dynamic_cast<AdaptiveDepthPartitioner*>( &partitioner ) )
diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp
index 36242f620..1ebdd4463 100644
--- a/source/Lib/EncoderLib/EncSlice.cpp
+++ b/source/Lib/EncoderLib/EncSlice.cpp
@@ -676,18 +676,33 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr
   rpcSlice->setMaxNumAffineMergeCand( m_pcCfg->getMaxNumAffineMergeCand() );
 #endif
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+#if JVET_L0217_L0678_SPS_CLEANUP
   rpcSlice->setSplitConsOverrideFlag(false);
-  rpcSlice->setMinQTSize( rpcSlice->getSPS()->getSpsNext().getMinQTSize(eSliceType));
-  rpcSlice->setMaxBTDepth( rpcSlice->isIntra() ? rpcSlice->getSPS()->getSpsNext().getMaxBTDepthI() : rpcSlice->getSPS()->getSpsNext().getMaxBTDepth() );
-  rpcSlice->setMaxBTSize( rpcSlice->isIntra() ? rpcSlice->getSPS()->getSpsNext().getMaxBTSizeI() : rpcSlice->getSPS()->getSpsNext().getMaxBTSize() );
-  rpcSlice->setMaxTTSize( rpcSlice->isIntra() ? rpcSlice->getSPS()->getSpsNext().getMaxTTSizeI() : rpcSlice->getSPS()->getSpsNext().getMaxTTSize() );
-  if ( eSliceType == I_SLICE && rpcSlice->getSPS()->getSpsNext().getUseDualITree() )
+  rpcSlice->setMinQTSize( rpcSlice->getSPS()->getMinQTSize(eSliceType));
+  rpcSlice->setMaxBTDepth( rpcSlice->isIntra() ? rpcSlice->getSPS()->getMaxBTDepthI() : rpcSlice->getSPS()->getMaxBTDepth() );
+  rpcSlice->setMaxBTSize( rpcSlice->isIntra() ? rpcSlice->getSPS()->getMaxBTSizeI() : rpcSlice->getSPS()->getMaxBTSize() );
+  rpcSlice->setMaxTTSize( rpcSlice->isIntra() ? rpcSlice->getSPS()->getMaxTTSizeI() : rpcSlice->getSPS()->getMaxTTSize() );
+  if ( eSliceType == I_SLICE && rpcSlice->getSPS()->getUseDualITree() )
   {
-    rpcSlice->setMinQTSizeIChroma( rpcSlice->getSPS()->getSpsNext().getMinQTSize(eSliceType, CHANNEL_TYPE_CHROMA) );
-    rpcSlice->setMaxBTDepthIChroma( rpcSlice->getSPS()->getSpsNext().getMaxBTDepthIChroma() );
-    rpcSlice->setMaxBTSizeIChroma( rpcSlice->getSPS()->getSpsNext().getMaxBTSizeIChroma() );
-    rpcSlice->setMaxTTSizeIChroma( rpcSlice->getSPS()->getSpsNext().getMaxTTSizeIChroma() );
+    rpcSlice->setMinQTSizeIChroma( rpcSlice->getSPS()->getMinQTSize(eSliceType, CHANNEL_TYPE_CHROMA) );
+    rpcSlice->setMaxBTDepthIChroma( rpcSlice->getSPS()->getMaxBTDepthIChroma() );
+    rpcSlice->setMaxBTSizeIChroma( rpcSlice->getSPS()->getMaxBTSizeIChroma() );
+    rpcSlice->setMaxTTSizeIChroma( rpcSlice->getSPS()->getMaxTTSizeIChroma() );
   }
+#else
+  rpcSlice->setSplitConsOverrideFlag(false);
+  rpcSlice->setMinQTSize(rpcSlice->getSPS()->getSpsNext().getMinQTSize(eSliceType));
+  rpcSlice->setMaxBTDepth(rpcSlice->isIntra() ? rpcSlice->getSPS()->getSpsNext().getMaxBTDepthI() : rpcSlice->getSPS()->getSpsNext().getMaxBTDepth());
+  rpcSlice->setMaxBTSize(rpcSlice->isIntra() ? rpcSlice->getSPS()->getSpsNext().getMaxBTSizeI() : rpcSlice->getSPS()->getSpsNext().getMaxBTSize());
+  rpcSlice->setMaxTTSize(rpcSlice->isIntra() ? rpcSlice->getSPS()->getSpsNext().getMaxTTSizeI() : rpcSlice->getSPS()->getSpsNext().getMaxTTSize());
+  if (eSliceType == I_SLICE && rpcSlice->getSPS()->getSpsNext().getUseDualITree())
+  {
+    rpcSlice->setMinQTSizeIChroma(rpcSlice->getSPS()->getSpsNext().getMinQTSize(eSliceType, CHANNEL_TYPE_CHROMA));
+    rpcSlice->setMaxBTDepthIChroma(rpcSlice->getSPS()->getSpsNext().getMaxBTDepthIChroma());
+    rpcSlice->setMaxBTSizeIChroma(rpcSlice->getSPS()->getSpsNext().getMaxBTSizeIChroma());
+    rpcSlice->setMaxTTSizeIChroma(rpcSlice->getSPS()->getSpsNext().getMaxTTSizeIChroma());
+  }
+#endif
 #else
   rpcSlice->setMaxBTSize            ( rpcSlice->isIntra() ? MAX_BT_SIZE : MAX_BT_SIZE_INTER );
 #endif
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index dbb3dd213..1ccc1fac8 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -571,6 +571,7 @@ void HLSWriter::codeSPSNext( const SPSNext& spsNext, const bool usePCM )
 #endif
 
   // additional parameters
+#if !JVET_L0217_L0678_SPS_CLEANUP
   WRITE_FLAG( spsNext.getUseDualITree(),                                                      "qtbt_dual_intra_tree" );
   WRITE_UVLC( g_aucLog2[spsNext.getCTUSize()]                                 - MIN_CU_LOG2,  "log2_CTU_size_minus2" );
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
@@ -610,7 +611,7 @@ void HLSWriter::codeSPSNext( const SPSNext& spsNext, const bool usePCM )
     WRITE_UVLC( spsNext.getMaxBTDepthIChroma(),                                                "max_bt_depth_i_slice_chroma" );
 #endif
   }
-
+#endif
 #if !JVET_L0198_L0468_L0104_ATMVP_8x8SUB_BLOCK
   if( spsNext.getUseSubPuMvp() )
   {
@@ -697,16 +698,66 @@ void HLSWriter::codeSPS( const SPS* pcSPS )
     }
   }
   CHECK( pcSPS->getMaxCUWidth() != pcSPS->getMaxCUHeight(),                          "Rectangular CTUs not supported" );
+#if !JVET_L0217_L0678_SPS_CLEANUP
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
   WRITE_UVLC( pcSPS->getLog2MinCodingBlockSize() - 2,                                "log2_min_luma_coding_block_size_minus2");
 #else
   WRITE_UVLC( pcSPS->getLog2MinCodingBlockSize() - 3,                                "log2_min_luma_coding_block_size_minus3" );
 #endif
   WRITE_UVLC( pcSPS->getLog2DiffMaxMinCodingBlockSize(),                             "log2_diff_max_min_luma_coding_block_size" );
+#endif
+#if JVET_L0217_L0678_SPS_CLEANUP
+  WRITE_FLAG(pcSPS->getUseDualITree(), "qtbt_dual_intra_tree");
+  WRITE_UVLC(g_aucLog2[pcSPS->getCTUSize()] - MIN_CU_LOG2, "log2_CTU_size_minus2");
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  WRITE_UVLC(pcSPS->getLog2MinCodingBlockSize() - 2, "log2_min_luma_coding_block_size_minus2");
+#else
+  WRITE_UVLC(pcSPS->getLog2MinCodingBlockSize() - 3, "log2_min_luma_coding_block_size_minus3");
+#endif
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+  WRITE_FLAG(pcSPS->getSplitConsOverrideEnabledFlag(), "sps_override_partition_constraints_enable_flag");
+  WRITE_UVLC(g_aucLog2[pcSPS->getMinQTSize(I_SLICE)] - pcSPS->getLog2MinCodingBlockSize(), "sps_log2_diff_min_qt_min_cb_intra_slice");
+  WRITE_UVLC(g_aucLog2[pcSPS->getMinQTSize(B_SLICE)] - pcSPS->getLog2MinCodingBlockSize(), "sps_log2_diff_min_qt_min_cb_inter_slice");
+  WRITE_UVLC(pcSPS->getMaxBTDepth(), "sps_max_mtt_hierarchy_depth_inter_slices");
+  WRITE_UVLC(pcSPS->getMaxBTDepthI(), "sps_max_mtt_hierarchy_depth_intra_slices");
+  if (pcSPS->getMaxBTDepthI() != 0)
+  {
+    WRITE_UVLC(g_aucLog2[pcSPS->getMaxBTSizeI()] - g_aucLog2[pcSPS->getMinQTSize(I_SLICE)], "sps_log2_diff_max_bt_min_qt_intra_slice");
+    WRITE_UVLC(g_aucLog2[pcSPS->getMaxTTSizeI()] - g_aucLog2[pcSPS->getMinQTSize(I_SLICE)], "sps_log2_diff_max_tt_min_qt_intra_slice");
+  }
+  if (pcSPS->getMaxBTDepth() != 0)
+  {
+    WRITE_UVLC(g_aucLog2[pcSPS->getMaxBTSize()] - g_aucLog2[pcSPS->getMinQTSize(B_SLICE)], "sps_log2_diff_max_bt_min_qt_inter_slice");
+    WRITE_UVLC(g_aucLog2[pcSPS->getMaxTTSize()] - g_aucLog2[pcSPS->getMinQTSize(B_SLICE)], "sps_log2_diff_max_tt_min_qt_inter_slice");
+  }
+#else
+  WRITE_UVLC(g_aucLog2[pcSPS->getMinQTSize(I_SLICE)] - MIN_CU_LOG2, "log2_minQT_ISlice_minus2");
+  WRITE_UVLC(g_aucLog2[pcSPS->getMinQTSize(B_SLICE)] - MIN_CU_LOG2, "log2_minQT_PBSlice_minus2");
+  WRITE_UVLC(pcSPS->getMaxBTDepth(), "max_bt_depth");
+  WRITE_UVLC(pcSPS->getMaxBTDepthI(), "max_bt_depth_i_slice");
+#endif
+  if (pcSPS->getUseDualITree())
+  {
+#if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
+    WRITE_UVLC(g_aucLog2[pcSPS->getMinQTSize(I_SLICE, CHANNEL_TYPE_CHROMA)] - pcSPS->getLog2MinCodingBlockSize(), "sps_log2_diff_min_qt_min_cb_intra_slice_chroma");
+    WRITE_UVLC(pcSPS->getMaxBTDepthIChroma(), "sps_max_mtt_hierarchy_depth_intra_slices_chroma");
+    if (pcSPS->getMaxBTDepthIChroma() != 0)
+    {
+      WRITE_UVLC(g_aucLog2[pcSPS->getMaxBTSizeIChroma()] - g_aucLog2[pcSPS->getMinQTSize(I_SLICE, CHANNEL_TYPE_CHROMA)], "sps_log2_diff_max_bt_min_qt_intra_slice_chroma");
+      WRITE_UVLC(g_aucLog2[pcSPS->getMaxTTSizeIChroma()] - g_aucLog2[pcSPS->getMinQTSize(I_SLICE, CHANNEL_TYPE_CHROMA)], "sps_log2_diff_max_tt_min_qt_intra_slice_chroma");
+    }
+#else
+    WRITE_UVLC(g_aucLog2[pcSPS->getMinQTSize(I_SLICE, CHANNEL_TYPE_CHROMA)] - MIN_CU_LOG2, "log2_minQT_ISliceChroma_minus2");
+    WRITE_UVLC(pcSPS->getMaxBTDepthIChroma(), "max_bt_depth_i_slice_chroma");
+#endif
+  }
+#endif
   WRITE_UVLC( pcSPS->getQuadtreeTULog2MinSize() - 2,                                 "log2_min_luma_transform_block_size_minus2" );
   WRITE_UVLC( pcSPS->getQuadtreeTULog2MaxSize() - pcSPS->getQuadtreeTULog2MinSize(), "log2_diff_max_min_luma_transform_block_size" );
+#if !JVET_L0217_L0678_SPS_CLEANUP
   WRITE_UVLC( pcSPS->getQuadtreeTUMaxDepthInter() - 1,                               "max_transform_hierarchy_depth_inter" );
   WRITE_UVLC( pcSPS->getQuadtreeTUMaxDepthIntra() - 1,                               "max_transform_hierarchy_depth_intra" );
+#endif
   WRITE_FLAG( pcSPS->getUseALF(), "sps_alf_enable_flag" );
 #if HEVC_USE_SCALING_LISTS
   WRITE_FLAG( pcSPS->getScalingListFlag() ? 1 : 0,                                   "scaling_list_enabled_flag" );
@@ -1232,7 +1283,13 @@ void HLSWriter::codeSliceHeader         ( Slice* pcSlice )
     }
 #endif
 #if JVET_L0217_L0678_PARTITION_HIGHLEVEL_CONSTRAINT
-    if (pcSlice->getSPS()->getSpsNext().getSplitConsOverrideEnabledFlag())
+    if (
+#if JVET_L0217_L0678_SPS_CLEANUP
+      pcSlice->getSPS()->getSplitConsOverrideEnabledFlag()
+#else
+      pcSlice->getSPS()->getSpsNext().getSplitConsOverrideEnabledFlag()
+#endif
+      )
     {
       WRITE_FLAG(pcSlice->getSplitConsOverrideFlag() ? 1 : 0, "partition_constrainst_override_flag");
       if (pcSlice->getSplitConsOverrideFlag())
@@ -1246,7 +1303,13 @@ void HLSWriter::codeSliceHeader         ( Slice* pcSlice )
           CHECK(pcSlice->getMaxTTSize() < pcSlice->getMinQTSize(), "maxTtSize is smaller than minQtSize");
           WRITE_UVLC(g_aucLog2[pcSlice->getMaxTTSize()] - g_aucLog2[pcSlice->getMinQTSize()], "log2_diff_max_tt_min_qt");
         }
-        if (pcSlice->isIntra() && pcSlice->getSPS()->getSpsNext().getUseDualITree())
+        if (
+#if JVET_L0217_L0678_SPS_CLEANUP
+          pcSlice->isIntra() && pcSlice->getSPS()->getUseDualITree()
+#else
+          pcSlice->isIntra() && pcSlice->getSPS()->getSpsNext().getUseDualITree()
+#endif
+          )
         {
           WRITE_UVLC(g_aucLog2[pcSlice->getMinQTSizeIChroma()] - pcSlice->getSPS()->getLog2MinCodingBlockSize(), "log2_diff_min_qt_min_cb_chroma");
           WRITE_UVLC(pcSlice->getMaxBTDepthIChroma(), "max_mtt_hierarchy_depth_chroma");
-- 
GitLab