From bc8613d1c18918e80a29203d29ed452b19e784e2 Mon Sep 17 00:00:00 2001
From: Yao-Jen Chang <yjchang@qti.qualcomm.com>
Date: Wed, 18 Sep 2019 11:53:24 -0700
Subject: [PATCH] JVET-O0452: Brick signaling condition on Tile Height with
 bugfixes

---
 source/Lib/CommonLib/Slice.h        |  2 +-
 source/Lib/DecoderLib/VLCReader.cpp | 12 ++++++++----
 source/Lib/EncoderLib/EncLib.cpp    | 29 +++++++++++++++++++++++------
 source/Lib/EncoderLib/VLCWriter.cpp | 12 ++++++++++--
 4 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index 8e0443bfd..a931220aa 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -1458,7 +1458,7 @@ public:
   void                   setTileRowHeight(const std::vector<int>& rowHeight)              { m_tileRowHeight = rowHeight;                  }
   uint32_t               getTileRowHeight(uint32_t rowIdx) const                          { return m_tileRowHeight[rowIdx];               }
 #if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
-  void                   setTileHeight(uint32_t tileIdx, uint32_t tileHeight)             { m_tileHeight[tileIdx] = tileHeight;           }
+  void                   setTileHeight(const std::vector<int>& tileHeight)                { m_tileHeight = tileHeight;                    }
   uint32_t               getTileHeight(uint32_t tileIdx) const                            { return m_tileHeight[tileIdx];                 }
 #endif
 
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 620fde0ca..d65405cf6 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -592,12 +592,14 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana
         if (pcPPS->getTileHeight(i) > 1)
         {
 #endif
-        READ_FLAG( uiCode, "brick_split_flag [i]" );
-        brickSplitFlag[i] = (uiCode == 1);
+          READ_FLAG(uiCode, "brick_split_flag [i]");
+          brickSplitFlag[i] = (uiCode == 1);
 #if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
         }
         else
+        {
           brickSplitFlag[i] = 0;
+        }
 #endif
 
         if( brickSplitFlag[i] )
@@ -606,12 +608,14 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS, ParameterSetManager *parameterSetMana
           if (pcPPS->getTileHeight(i) > 2)
           {
 #endif
-          READ_FLAG( uiCode, "uniform_brick_spacing_flag [i]" );
-          uniformBrickSpacingFlag[i] = (uiCode == 1);
+            READ_FLAG(uiCode, "uniform_brick_spacing_flag [i]");
+            uniformBrickSpacingFlag[i] = (uiCode == 1);
 #if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
           }
           else
+          {
             uniformBrickSpacingFlag[i] = 1;
+          }
 #endif
           if( uniformBrickSpacingFlag[i] )
           {
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index 641909dc5..cb74d0324 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -1799,6 +1799,9 @@ void  EncLib::xInitPPSforTiles(PPS &pps)
 
   int numTiles= (m_iNumColumnsMinus1 + 1) * (m_iNumRowsMinus1 + 1);
   pps.setNumTilesInPic(numTiles);
+#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
+  std::vector<int> tileHeight(numTiles);
+#endif
 
   if (m_brickSplitMap.empty())
   {
@@ -1870,11 +1873,12 @@ void  EncLib::xInitPPSforTiles(PPS &pps)
 #if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
       const int tileY = tileIdx / (m_iNumColumnsMinus1 + 1);
 
-      int tileHeight = tileRowHeight[tileY];
+      tileHeight[tileIdx] = tileRowHeight[tileY];
 
-      pps.setTileHeight(tileIdx, tileHeight);
-
-      CHECK((tileHeight <= 1) && (pps.getBrickSplitFlag(tileIdx) == 0), "The value of brick_split_flag[ i ] shall be 0 if tileHeight <= 1");
+      if (tileHeight[tileIdx] <= 1)
+      {
+        CHECK(pps.getBrickSplitFlag(tileIdx) != 0, "The value of brick_split_flag[ i ] shall be 0 if tileHeight <= 1");
+      }
 #endif
       if (pps.getBrickSplitFlag(tileIdx))
       {
@@ -1884,11 +1888,18 @@ void  EncLib::xInitPPSforTiles(PPS &pps)
         int tileHeight = tileRowHeight [tileY];
 #endif
 #if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
-        CHECK((tileHeight <= 2) && (pps.getUniformBrickSpacingFlag(tileIdx) == 1), "The value of uniform_brick_spacing_flag[ i ] shall be 1 if tileHeight <= 2");
+        if (tileHeight[tileIdx] <= 2)
+        {
+          CHECK(pps.getUniformBrickSpacingFlag(tileIdx) != 1, "The value of uniform_brick_spacing_flag[ i ] shall be 1 if tileHeight <= 2");
+        }
 #endif
         if (pps.getUniformBrickSpacingFlag(tileIdx))
         {
+#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
+          CHECK((pps.getBrickHeightMinus1(tileIdx) + 1) >= tileHeight[tileIdx], "Brick height larger than or equal to tile height");
+#else
           CHECK((pps.getBrickHeightMinus1(tileIdx) + 1) >= tileHeight, "Brick height larger than or equal to tile height");
+#endif
         }
         else
         {
@@ -1897,12 +1908,18 @@ void  EncLib::xInitPPSforTiles(PPS &pps)
           {
             cumulativeHeight += pps.getBrickRowHeightMinus1(tileIdx, i) + 1;
           }
+#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
+          CHECK(cumulativeHeight >= tileHeight[tileIdx], "Cumulative brick height larger than or equal to tile height");
+#else
           CHECK(cumulativeHeight >= tileHeight, "Cumulative brick height larger than or equal to tile height");
+#endif
         }
       }
     }
   }
-
+#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
+  pps.setTileHeight(tileHeight);
+#endif
 }
 
 void  EncCfg::xCheckGSParameters()
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 6832bbf16..90efec0da 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -343,14 +343,22 @@ void HLSWriter::codePPS( const PPS* pcPPS )
     {
 #if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
       if (pcPPS->getTileHeight(i) > 1)
+      {
+#endif
+        WRITE_FLAG(pcPPS->getBrickSplitFlag(i) ? 1 : 0, "brick_split_flag [i]");
+#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
+      }
 #endif
-      WRITE_FLAG( pcPPS->getBrickSplitFlag(i) ? 1 : 0, "brick_split_flag [i]" );
       if( pcPPS->getBrickSplitFlag(i) )
       {
 #if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
         if (pcPPS->getTileHeight(i) > 2)
+        {
+#endif
+          WRITE_FLAG(pcPPS->getUniformBrickSpacingFlag(i) ? 1 : 0, "uniform_brick_spacing_flag [i]");
+#if JVET_O0452_PPS_BRICK_SIGNALING_CONDITION
+        }
 #endif
-        WRITE_FLAG( pcPPS->getUniformBrickSpacingFlag(i) ? 1 : 0, "uniform_brick_spacing_flag [i]" );
         if( pcPPS->getUniformBrickSpacingFlag(i) )
           WRITE_UVLC( pcPPS->getBrickHeightMinus1(i), "brick_height_minus1" );
         else
-- 
GitLab