From c83e1672d075d0c7cc9274c41cdeaf336021f5bd Mon Sep 17 00:00:00 2001
From: biaowang <biao.wang@huawei.com>
Date: Sat, 28 Mar 2020 14:12:49 +0100
Subject: [PATCH] fixTicket983: rect_slice_flag signaling

---
 source/Lib/CommonLib/TypeDef.h      |  2 ++
 source/Lib/DecoderLib/VLCReader.cpp | 13 ++++++++++++-
 source/Lib/EncoderLib/VLCWriter.cpp |  7 +++++++
 3 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 1c7b98b412..a71731ede7 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -58,6 +58,8 @@
 
 #define JVET_Q0371_DEBLOCKING_CLEANUP                     1 //JVET_Q0371: cleanup on deblocking across subpicture boundaries
 
+#define JVET_Q0289_BUGFIX_RECT_SLICE_FLAG                 1 //JVET-Q0289: If NumTilesInPic is equal to 1, don't signal the rect_slice_flag and infer its value to be 1.
+
 #define CABAC_RETRAIN                                     1 // CABAC retraining based on VTM8rc1
 
 #define JVET_Q0210_SUBPIC_VIRTUAL_BOUNDARY_CONSTRAINT     1 // JVET-Q0210 (aspect 7): when subpicture signalling is present, virtual boundaries if present shall be in the SPS.
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 4f6d7f067a..bdd78d2487 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -533,9 +533,20 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS )
 #endif
     }
     pcPPS->initTiles();
-     
     // rectangular slice signalling
+#if JVET_Q0289_BUGFIX_RECT_SLICE_FLAG
+    if (pcPPS->getNumTiles() > 1)
+    {
+      READ_CODE(1, uiCode, "rect_slice_flag");
+    }
+    else
+    {
+      uiCode = 1;
+    }
+    pcPPS->setRectSliceFlag(uiCode == 1);
+#else
     READ_CODE(1, uiCode, "rect_slice_flag");                          pcPPS->setRectSliceFlag( uiCode == 1 );
+#endif
     if (pcPPS->getRectSliceFlag()) 
     {
       READ_FLAG(uiCode, "single_slice_per_subpic_flag");            pcPPS->setSingleSlicePerSubPicFlag(uiCode == 1);
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 1b6652af2e..1837ea1346 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -333,7 +333,14 @@ void HLSWriter::codePPS( const PPS* pcPPS )
     }
      
     // rectangular slice signalling
+#if JVET_Q0289_BUGFIX_RECT_SLICE_FLAG
+    if (pcPPS->getNumTiles() > 1)
+    {
+      WRITE_FLAG(pcPPS->getRectSliceFlag() ? 1 : 0, "rect_slice_flag");
+    }
+#else
     WRITE_FLAG( pcPPS->getRectSliceFlag( ) ? 1 : 0, "rect_slice_flag");
+#endif
     if (pcPPS->getRectSliceFlag())
     {
       WRITE_FLAG(pcPPS->getSingleSlicePerSubPicFlag( ) ? 1 : 0, "single_slice_per_subpic_flag");
-- 
GitLab