From 1f7786ca788c3059704ed5d49b169c9cb90e76e4 Mon Sep 17 00:00:00 2001
From: sc29wg11 <zhangkai.video@bytedance.com>
Date: Sun, 24 May 2020 14:17:51 -0700
Subject: [PATCH] Commit JVET-R0062

---
 source/Lib/CommonLib/Slice.cpp      |  2 ++
 source/Lib/CommonLib/TypeDef.h      |  2 ++
 source/Lib/DecoderLib/VLCReader.cpp |  7 +++++++
 source/Lib/EncoderLib/VLCWriter.cpp | 10 ++++++++++
 4 files changed, 21 insertions(+)

diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index 4db41ba7b..e352a93a3 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -2811,6 +2811,7 @@ void PPS::initTiles()
 
   // check explicit tile column sizes
   uint32_t  remainingWidthInCtu  = m_picWidthInCtu;
+
   for( colIdx = 0; colIdx < m_numExpTileCols; colIdx++ )
   {
     CHECK(m_tileColWidth[colIdx] > remainingWidthInCtu,    "Tile column width exceeds picture width");
@@ -2831,6 +2832,7 @@ void PPS::initTiles()
 
   // check explicit tile row sizes
   uint32_t  remainingHeightInCtu  = m_picHeightInCtu;
+
   for( rowIdx = 0; rowIdx < m_numExpTileRows; rowIdx++ )
   {
     CHECK(m_tileRowHeight[rowIdx] > remainingHeightInCtu,     "Tile row height exceeds picture height");
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 9715ee901..cf5d2cfb9 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -51,6 +51,8 @@
 #include <cassert>
 
 //########### place macros to be removed in next cycle below this line ###############
+#define JVET_R0062                                        1 // JVET-R0062: changes on uniform tile and rectangular slice partitioning
+
 #define JVET_R0058                                        1 // JVET-R0058: the combination of RPR, subpictures, and scalability 
 
 #define JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING   1 // JVET-R0078: disable chroma DBF offset signalling
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 4c5659142..4167ed63d 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -655,13 +655,20 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS )
               uint32_t numExpSliceInTile = uiCode;
               uint32_t remTileRowHeight  = pcPPS->getTileRowHeight(tileIdx / pcPPS->getNumTileColumns());
               int j = 0;
+
+#if JVET_R0062
+              for( ; j < numExpSliceInTile; j++ )
+#else
               for( ; j < numExpSliceInTile - 1; j++ )
+#endif
               {
                 READ_UVLC(uiCode, "exp_slice_height_in_ctus_minus1[i]");
                 pcPPS->setSliceHeightInCtu(i + j, uiCode + 1);
                 remTileRowHeight -= (uiCode + 1);
               }
+#if !JVET_R0062
               READ_UVLC(uiCode, "exp_slice_height_in_ctus_minus1[i]");
+#endif
               uint32_t uniformSliceHeight = uiCode + 1;
 
               while( remTileRowHeight >= uniformSliceHeight )
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 1d312e738..17195e50f 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -408,11 +408,21 @@ void HLSWriter::codePPS( const PPS* pcPPS )
               }
             }
           }
+#if JVET_R0062
+          uint32_t iExpSliceHeightSum = 0;
+#endif
           WRITE_UVLC(numExpSliceInTile, "num_exp_slices_in_tile[i]");
           for( int j = 0; j < numExpSliceInTile; j++ )
           {
             WRITE_UVLC(pcPPS->getSliceHeightInCtu(i + j) - 1, "exp_slice_height_in_ctus_minus1[i]");
+#if JVET_R0062
+            iExpSliceHeightSum += pcPPS->getSliceHeightInCtu(i + j);
+#endif
           }
+
+#if JVET_R0062
+          CHECK( iExpSliceHeightSum > pcPPS->getTileRowHeight(pcPPS->getSliceTileIdx(i) / pcPPS->getNumTileColumns()), "The sum of expressed slice heights is larger than the height of the tile containing the slices.");
+#endif
           i += (pcPPS->getNumSlicesInTile(i) - 1);
         }
 
-- 
GitLab