From efdf9a837f61b8bb4dbfa96b20b2fb26f647db32 Mon Sep 17 00:00:00 2001
From: Haiwei Sun <haiwei.sun@sg.panasonic.com>
Date: Mon, 11 May 2020 15:06:58 +0800
Subject: [PATCH 1/4] JVET-R0078: cleanup for chroma tc and beta DBF offset in
 PPS, PH and SH

---
 source/Lib/CommonLib/Slice.cpp      |  25 +++++-
 source/Lib/CommonLib/TypeDef.h      |   2 +
 source/Lib/DecoderLib/VLCReader.cpp | 130 ++++++++++++++++++----------
 source/Lib/EncoderLib/EncLib.cpp    |  26 +++++-
 source/Lib/EncoderLib/EncSlice.cpp  |  22 ++++-
 source/Lib/EncoderLib/VLCWriter.cpp |  46 +++++++---
 6 files changed, 185 insertions(+), 66 deletions(-)

diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index ad2ab6661b..71fb5a353a 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -224,10 +224,24 @@ void Slice::inheritFromPicHeader( PicHeader *picHeader, const PPS *pps, const SP
   setDeblockingFilterDisable( picHeader->getDeblockingFilterDisable() );
   setDeblockingFilterBetaOffsetDiv2( picHeader->getDeblockingFilterBetaOffsetDiv2() );
   setDeblockingFilterTcOffsetDiv2( picHeader->getDeblockingFilterTcOffsetDiv2() );
-  setDeblockingFilterCbBetaOffsetDiv2( picHeader->getDeblockingFilterCbBetaOffsetDiv2() );
-  setDeblockingFilterCbTcOffsetDiv2( picHeader->getDeblockingFilterCbTcOffsetDiv2() );
-  setDeblockingFilterCrBetaOffsetDiv2( picHeader->getDeblockingFilterCrBetaOffsetDiv2() );
-  setDeblockingFilterCrTcOffsetDiv2( picHeader->getDeblockingFilterCrTcOffsetDiv2() );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+  if (pps->getPPSChromaToolFlag())
+  {
+#endif
+    setDeblockingFilterCbBetaOffsetDiv2 ( picHeader->getDeblockingFilterCbBetaOffsetDiv2() );
+    setDeblockingFilterCbTcOffsetDiv2   ( picHeader->getDeblockingFilterCbTcOffsetDiv2()   );
+    setDeblockingFilterCrBetaOffsetDiv2 ( picHeader->getDeblockingFilterCrBetaOffsetDiv2() );
+    setDeblockingFilterCrTcOffsetDiv2   ( picHeader->getDeblockingFilterCrTcOffsetDiv2()   );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+  }
+  else
+  {
+    setDeblockingFilterCbBetaOffsetDiv2 ( getDeblockingFilterBetaOffsetDiv2() );
+    setDeblockingFilterCbTcOffsetDiv2   ( getDeblockingFilterTcOffsetDiv2()   );
+    setDeblockingFilterCrBetaOffsetDiv2 ( getDeblockingFilterBetaOffsetDiv2() );
+    setDeblockingFilterCrTcOffsetDiv2   ( getDeblockingFilterTcOffsetDiv2()   );
+  }
+#endif
 
   setSaoEnabledFlag(CHANNEL_TYPE_LUMA,     picHeader->getSaoEnabledFlag(CHANNEL_TYPE_LUMA));
   setSaoEnabledFlag(CHANNEL_TYPE_CHROMA,   picHeader->getSaoEnabledFlag(CHANNEL_TYPE_CHROMA));
@@ -2644,6 +2658,9 @@ PPS::PPS()
 , m_SPSId                            (0)
 , m_picInitQPMinus26                 (0)
 , m_useDQP                           (false)
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+, m_usePPSChromaTool                 (false)
+#endif
 , m_bSliceChromaQpFlag               (false)
 , m_chromaCbQpOffset                 (0)
 , m_chromaCrQpOffset                 (0)
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 0128157a3f..60c4053bec 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_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING   1 // JVET-R0078: disable chroma DBF offset signalling
+
 #define JVET_R0055_HANDLING_NON_EXISTENT_QM               1 // JVET-R0055: infer chroma scaling lists to be all 16 in 4:0:0 by copy mode flag
 
 #define JVET_R0097_MAX_TRSIZE_CONDITIONALY_SIGNALING      1 // JVET-R0097: Aspect 1, If the luma CTB size is not larger than 32, sps_max_luma_transform_size_64_flag is not signalled and inferred to be 0
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 0b90a6aa96..62055b3199 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -832,21 +832,35 @@ void HLSyntaxReader::parsePPS( PPS* pcPPS )
       CHECK(  pcPPS->getDeblockingFilterTcOffsetDiv2() < -12 ||
               pcPPS->getDeblockingFilterTcOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
 
-      READ_SVLC( iCode, "pps_cb_beta_offset_div2");                   pcPPS->setDeblockingFilterCbBetaOffsetDiv2( iCode );
-      CHECK(  pcPPS->getDeblockingFilterCbBetaOffsetDiv2() < -12 ||
-              pcPPS->getDeblockingFilterCbBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+      if( pcPPS->getPPSChromaToolFlag() )
+      {
+#endif
+        READ_SVLC( iCode, "pps_cb_beta_offset_div2" );                   pcPPS->setDeblockingFilterCbBetaOffsetDiv2( iCode );
+        CHECK( pcPPS->getDeblockingFilterCbBetaOffsetDiv2() < -12 ||
+          pcPPS->getDeblockingFilterCbBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
 
-      READ_SVLC( iCode, "pps_cb_tc_offset_div2");                     pcPPS->setDeblockingFilterCbTcOffsetDiv2( iCode );
-      CHECK(  pcPPS->getDeblockingFilterCbTcOffsetDiv2() < -12 ||
-              pcPPS->getDeblockingFilterCbTcOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
+        READ_SVLC( iCode, "pps_cb_tc_offset_div2" );                     pcPPS->setDeblockingFilterCbTcOffsetDiv2( iCode );
+        CHECK( pcPPS->getDeblockingFilterCbTcOffsetDiv2() < -12 ||
+          pcPPS->getDeblockingFilterCbTcOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
 
-      READ_SVLC( iCode, "pps_cr_beta_offset_div2");                   pcPPS->setDeblockingFilterCrBetaOffsetDiv2( iCode );
-      CHECK(  pcPPS->getDeblockingFilterCrBetaOffsetDiv2() < -12 ||
-              pcPPS->getDeblockingFilterCrBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
+        READ_SVLC( iCode, "pps_cr_beta_offset_div2") ;                   pcPPS->setDeblockingFilterCrBetaOffsetDiv2( iCode );
+        CHECK( pcPPS->getDeblockingFilterCrBetaOffsetDiv2() < -12 ||
+          pcPPS->getDeblockingFilterCrBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
 
-      READ_SVLC( iCode, "pps_cr_tc_offset_div2");                     pcPPS->setDeblockingFilterCrTcOffsetDiv2( iCode );
-      CHECK(  pcPPS->getDeblockingFilterCrTcOffsetDiv2() < -12 ||
-              pcPPS->getDeblockingFilterCrTcOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
+        READ_SVLC( iCode, "pps_cr_tc_offset_div2" );                     pcPPS->setDeblockingFilterCrTcOffsetDiv2( iCode );
+        CHECK(pcPPS->getDeblockingFilterCrTcOffsetDiv2() < -12 ||
+          pcPPS->getDeblockingFilterCrTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+      }
+      else
+      {
+        pcPPS->setDeblockingFilterCbBetaOffsetDiv2 ( pcPPS->getDeblockingFilterBetaOffsetDiv2() );
+        pcPPS->setDeblockingFilterCbTcOffsetDiv2   ( pcPPS->getDeblockingFilterTcOffsetDiv2()   );
+        pcPPS->setDeblockingFilterCrBetaOffsetDiv2 ( pcPPS->getDeblockingFilterBetaOffsetDiv2() );
+        pcPPS->setDeblockingFilterCrTcOffsetDiv2   ( pcPPS->getDeblockingFilterTcOffsetDiv2()   );
+      }
+#endif
     }
   }
   else
@@ -3225,25 +3239,39 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag
         CHECK(  picHeader->getDeblockingFilterTcOffsetDiv2() < -12 ||
                 picHeader->getDeblockingFilterTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
 
-        READ_SVLC( iCode, "ph_cb_beta_offset_div2" );
-        picHeader->setDeblockingFilterCbBetaOffsetDiv2(iCode);
-        CHECK(  picHeader->getDeblockingFilterCbBetaOffsetDiv2() < -12 ||
-                picHeader->getDeblockingFilterCbBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration");
-
-        READ_SVLC( iCode, "ph_cb_tc_offset_div2" );
-        picHeader->setDeblockingFilterCbTcOffsetDiv2(iCode);
-        CHECK(  picHeader->getDeblockingFilterCbTcOffsetDiv2() < -12 ||
-                picHeader->getDeblockingFilterCbTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
-
-        READ_SVLC( iCode, "ph_cr_beta_offset_div2" );
-        picHeader->setDeblockingFilterCrBetaOffsetDiv2(iCode);
-        CHECK(  picHeader->getDeblockingFilterCrBetaOffsetDiv2() < -12 ||
-                picHeader->getDeblockingFilterCrBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration");
-
-        READ_SVLC( iCode, "ph_cr_tc_offset_div2" );
-        picHeader->setDeblockingFilterCrTcOffsetDiv2(iCode);
-        CHECK(  picHeader->getDeblockingFilterCrTcOffsetDiv2() < -12 ||
-                picHeader->getDeblockingFilterCrTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+        if( pps->getPPSChromaToolFlag() )
+        {
+#endif
+          READ_SVLC( iCode, "ph_cb_beta_offset_div2" );
+          picHeader->setDeblockingFilterCbBetaOffsetDiv2(iCode);
+          CHECK(  picHeader->getDeblockingFilterCbBetaOffsetDiv2() < -12 ||
+                  picHeader->getDeblockingFilterCbBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration");
+
+          READ_SVLC( iCode, "ph_cb_tc_offset_div2" );
+          picHeader->setDeblockingFilterCbTcOffsetDiv2(iCode);
+          CHECK(  picHeader->getDeblockingFilterCbTcOffsetDiv2() < -12 ||
+                  picHeader->getDeblockingFilterCbTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
+
+          READ_SVLC( iCode, "ph_cr_beta_offset_div2" );
+          picHeader->setDeblockingFilterCrBetaOffsetDiv2(iCode);
+          CHECK(  picHeader->getDeblockingFilterCrBetaOffsetDiv2() < -12 ||
+                  picHeader->getDeblockingFilterCrBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration");
+
+          READ_SVLC( iCode, "ph_cr_tc_offset_div2" );
+          picHeader->setDeblockingFilterCrTcOffsetDiv2(iCode);
+          CHECK(  picHeader->getDeblockingFilterCrTcOffsetDiv2() < -12 ||
+                  picHeader->getDeblockingFilterCrTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+        }
+        else
+        {
+          picHeader->setDeblockingFilterCbBetaOffsetDiv2 ( picHeader->getDeblockingFilterBetaOffsetDiv2() );
+          picHeader->setDeblockingFilterCbTcOffsetDiv2   ( picHeader->getDeblockingFilterTcOffsetDiv2()   );
+          picHeader->setDeblockingFilterCrBetaOffsetDiv2 ( picHeader->getDeblockingFilterBetaOffsetDiv2() );
+          picHeader->setDeblockingFilterCrTcOffsetDiv2   ( picHeader->getDeblockingFilterTcOffsetDiv2()   );
+        }
+#endif
       }
     }
     else
@@ -4153,19 +4181,33 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, PicHeader* picHeader, Par
           CHECK(  pcSlice->getDeblockingFilterTcOffsetDiv2() < -12 ||
                   pcSlice->getDeblockingFilterTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
 
-          READ_SVLC( iCode, "slice_cb_beta_offset_div2" );                  pcSlice->setDeblockingFilterCbBetaOffsetDiv2( iCode );
-          CHECK(  pcSlice->getDeblockingFilterCbBetaOffsetDiv2() < -12 ||
-                  pcSlice->getDeblockingFilterCbBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration");
-          READ_SVLC( iCode, "slice_cb_tc_offset_div2" );                    pcSlice->setDeblockingFilterCbTcOffsetDiv2( iCode );
-          CHECK(  pcSlice->getDeblockingFilterCbTcOffsetDiv2() < -12 ||
-                  pcSlice->getDeblockingFilterCbTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
-
-          READ_SVLC( iCode, "slice_cr_beta_offset_div2" );                  pcSlice->setDeblockingFilterCrBetaOffsetDiv2( iCode );
-          CHECK(  pcSlice->getDeblockingFilterCrBetaOffsetDiv2() < -12 ||
-                  pcSlice->getDeblockingFilterCrBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration");
-          READ_SVLC( iCode, "slice_cr_tc_offset_div2" );                    pcSlice->setDeblockingFilterCrTcOffsetDiv2( iCode );
-          CHECK(  pcSlice->getDeblockingFilterCrTcOffsetDiv2() < -12 ||
-                  pcSlice->getDeblockingFilterCrTcOffsetDiv2() > 12, "Invalid deblocking filter configuration");
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+          if( pps->getPPSChromaToolFlag() )
+          {
+#endif
+            READ_SVLC( iCode, "slice_cb_beta_offset_div2" );                  pcSlice->setDeblockingFilterCbBetaOffsetDiv2( iCode );
+            CHECK( pcSlice->getDeblockingFilterCbBetaOffsetDiv2() < -12 ||
+              pcSlice->getDeblockingFilterCbBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
+            READ_SVLC( iCode, "slice_cb_tc_offset_div2" );                    pcSlice->setDeblockingFilterCbTcOffsetDiv2( iCode );
+            CHECK( pcSlice->getDeblockingFilterCbTcOffsetDiv2() < -12 ||
+              pcSlice->getDeblockingFilterCbTcOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
+
+            READ_SVLC( iCode, "slice_cr_beta_offset_div2" );                  pcSlice->setDeblockingFilterCrBetaOffsetDiv2( iCode );
+            CHECK( pcSlice->getDeblockingFilterCrBetaOffsetDiv2() < -12 ||
+              pcSlice->getDeblockingFilterCrBetaOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
+            READ_SVLC( iCode, "slice_cr_tc_offset_div2" );                    pcSlice->setDeblockingFilterCrTcOffsetDiv2( iCode );
+            CHECK( pcSlice->getDeblockingFilterCrTcOffsetDiv2() < -12 ||
+              pcSlice->getDeblockingFilterCrTcOffsetDiv2() > 12, "Invalid deblocking filter configuration" );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+          }
+          else
+          {
+            pcSlice->setDeblockingFilterCbBetaOffsetDiv2 ( pcSlice->getDeblockingFilterBetaOffsetDiv2() );
+            pcSlice->setDeblockingFilterCbTcOffsetDiv2   ( pcSlice->getDeblockingFilterTcOffsetDiv2()   );
+            pcSlice->setDeblockingFilterCrBetaOffsetDiv2 ( pcSlice->getDeblockingFilterBetaOffsetDiv2() );
+            pcSlice->setDeblockingFilterCrTcOffsetDiv2   ( pcSlice->getDeblockingFilterTcOffsetDiv2()   );
+          }
+#endif
         }
       }
       else
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index f45be9524f..2de3b3c584 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -1441,10 +1441,12 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps)
     bUseDQP = true;
   }
 #endif
+#if !JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
   if (sps.getChromaFormatIdc() != CHROMA_400)
   {
-    pps.setPPSChromaToolFlag (true);
+    pps.setPPSChromaToolFlag(true);
   }
+#endif
 #if ENABLE_QPA
   if (getUsePerceptQPA() && !bUseDQP)
   {
@@ -1498,7 +1500,11 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps)
     pps.setPicInitQPMinus26( std::min( maxDQP, std::max( minDQP, baseQp ) ));
   }
 
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+  if( sps.getJointCbCrEnabledFlag() == false || getChromaFormatIdc() == CHROMA_400 || m_chromaCbCrQpOffset == 0 )
+#else
   if (sps.getJointCbCrEnabledFlag() == false || getChromaFormatIdc() == CHROMA_400)
+#endif
   {
     pps.setJointCbCrQpOffsetPresentFlag(false);
   }
@@ -1661,6 +1667,24 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps)
   pps.setCabacInitPresentFlag(CABAC_INIT_PRESENT_FLAG);
   pps.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
 
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+  bool bChromaQPOffsetNotZero = false;
+  if( pps.getQpOffset(COMPONENT_Cb) != 0 || pps.getQpOffset(COMPONENT_Cr) != 0 || pps.getJointCbCrQpOffsetPresentFlag() || pps.getSliceChromaQpFlag() || pps.getCuChromaQpOffsetListEnabledFlag() )
+  {
+    bChromaQPOffsetNotZero = true;
+  }
+  bool bChromaDbfOffsetNotSameAsLuma = true;
+  if( pps.getDeblockingFilterCbBetaOffsetDiv2() == pps.getDeblockingFilterBetaOffsetDiv2() && pps.getDeblockingFilterCrBetaOffsetDiv2() == pps.getDeblockingFilterBetaOffsetDiv2()
+     && pps.getDeblockingFilterCbTcOffsetDiv2() == pps.getDeblockingFilterTcOffsetDiv2() && pps.getDeblockingFilterCrTcOffsetDiv2() == pps.getDeblockingFilterTcOffsetDiv2() )
+  {
+    bChromaDbfOffsetNotSameAsLuma = false;
+  }
+  const uint32_t chromaArrayType = (int)sps.getSeparateColourPlaneFlag() ? 0 : sps.getChromaFormatIdc();
+  if( ( chromaArrayType != CHROMA_400 ) && ( bChromaQPOffsetNotZero || bChromaDbfOffsetNotSameAsLuma ) )
+  {
+    pps.setPPSChromaToolFlag(true);
+  }
+#endif
 
   int histogram[MAX_NUM_REF + 1];
   for( int i = 0; i <= MAX_NUM_REF; i++ )
diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp
index 46aa69ba7d..8627f61c25 100644
--- a/source/Lib/EncoderLib/EncSlice.cpp
+++ b/source/Lib/EncoderLib/EncSlice.cpp
@@ -661,10 +661,24 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr
       {
         rpcSlice->setDeblockingFilterBetaOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_betaOffsetDiv2 + m_pcCfg->getLoopFilterBetaOffset()  );
         rpcSlice->setDeblockingFilterTcOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_tcOffsetDiv2 + m_pcCfg->getLoopFilterTcOffset() );
-        rpcSlice->setDeblockingFilterCbBetaOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_CbBetaOffsetDiv2 + m_pcCfg->getLoopFilterCbBetaOffset()  );
-        rpcSlice->setDeblockingFilterCbTcOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_CbTcOffsetDiv2 + m_pcCfg->getLoopFilterCbTcOffset() );
-        rpcSlice->setDeblockingFilterCrBetaOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_CrBetaOffsetDiv2 + m_pcCfg->getLoopFilterCrBetaOffset()  );
-        rpcSlice->setDeblockingFilterCrTcOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_CrTcOffsetDiv2 + m_pcCfg->getLoopFilterCrTcOffset() );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+        if( rpcSlice->getPPS()->getPPSChromaToolFlag() )
+        {
+#endif
+          rpcSlice->setDeblockingFilterCbBetaOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_CbBetaOffsetDiv2 + m_pcCfg->getLoopFilterCbBetaOffset() );
+          rpcSlice->setDeblockingFilterCbTcOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_CbTcOffsetDiv2 + m_pcCfg->getLoopFilterCbTcOffset() );
+          rpcSlice->setDeblockingFilterCrBetaOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_CrBetaOffsetDiv2 + m_pcCfg->getLoopFilterCrBetaOffset() );
+          rpcSlice->setDeblockingFilterCrTcOffsetDiv2( m_pcCfg->getGOPEntry(iGOPid).m_CrTcOffsetDiv2 + m_pcCfg->getLoopFilterCrTcOffset() );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+        }
+        else
+        {
+          rpcSlice->setDeblockingFilterCbBetaOffsetDiv2( rpcSlice->getDeblockingFilterBetaOffsetDiv2() );
+          rpcSlice->setDeblockingFilterCbTcOffsetDiv2( rpcSlice->getDeblockingFilterTcOffsetDiv2() );
+          rpcSlice->setDeblockingFilterCrBetaOffsetDiv2( rpcSlice->getDeblockingFilterBetaOffsetDiv2() );
+          rpcSlice->setDeblockingFilterCrTcOffsetDiv2( rpcSlice->getDeblockingFilterTcOffsetDiv2() );
+        }
+#endif
       }
       else
       {
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index 57da1acfe8..fe290b14ed 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -482,12 +482,18 @@ void HLSWriter::codePPS( const PPS* pcPPS )
     {
       WRITE_SVLC( pcPPS->getDeblockingFilterBetaOffsetDiv2(),             "pps_beta_offset_div2" );
       WRITE_SVLC( pcPPS->getDeblockingFilterTcOffsetDiv2(),               "pps_tc_offset_div2" );
-      WRITE_SVLC( pcPPS->getDeblockingFilterCbBetaOffsetDiv2(),           "pps_cb_beta_offset_div2" );
-      WRITE_SVLC( pcPPS->getDeblockingFilterCbTcOffsetDiv2(),             "pps_cb_tc_offset_div2" );
-      WRITE_SVLC( pcPPS->getDeblockingFilterCrBetaOffsetDiv2(),           "pps_cr_beta_offset_div2" );
-      WRITE_SVLC( pcPPS->getDeblockingFilterCrTcOffsetDiv2(),             "pps_cr_tc_offset_div2" );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+      if( pcPPS->getPPSChromaToolFlag() )
+      {
+#endif
+        WRITE_SVLC( pcPPS->getDeblockingFilterCbBetaOffsetDiv2(),           "pps_cb_beta_offset_div2" );
+        WRITE_SVLC( pcPPS->getDeblockingFilterCbTcOffsetDiv2(),             "pps_cb_tc_offset_div2" );
+        WRITE_SVLC( pcPPS->getDeblockingFilterCrBetaOffsetDiv2(),           "pps_cr_beta_offset_div2" );
+        WRITE_SVLC( pcPPS->getDeblockingFilterCrTcOffsetDiv2(),             "pps_cr_tc_offset_div2" );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+      }
+#endif
     }
-  }
 
 #if JVET_R0113_AND_JVET_R0106_PPS_CLEANUP
   if (!pcPPS->getNoPicPartitionFlag())
@@ -2090,10 +2096,17 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader, bool writeRbspTrailingB
       {
         WRITE_SVLC( picHeader->getDeblockingFilterBetaOffsetDiv2(), "ph_beta_offset_div2" );
         WRITE_SVLC( picHeader->getDeblockingFilterTcOffsetDiv2(), "ph_tc_offset_div2" );
-        WRITE_SVLC( picHeader->getDeblockingFilterCbBetaOffsetDiv2(), "ph_cb_beta_offset_div2" );
-        WRITE_SVLC( picHeader->getDeblockingFilterCbTcOffsetDiv2(), "ph_cb_tc_offset_div2" );
-        WRITE_SVLC( picHeader->getDeblockingFilterCrBetaOffsetDiv2(), "ph_cr_beta_offset_div2" );
-        WRITE_SVLC( picHeader->getDeblockingFilterCrTcOffsetDiv2(), "ph_cr_tc_offset_div2" );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+        if( pps->getPPSChromaToolFlag() )
+        {
+#endif
+          WRITE_SVLC( picHeader->getDeblockingFilterCbBetaOffsetDiv2(), "ph_cb_beta_offset_div2" );
+          WRITE_SVLC( picHeader->getDeblockingFilterCbTcOffsetDiv2(), "ph_cb_tc_offset_div2" );
+          WRITE_SVLC( picHeader->getDeblockingFilterCrBetaOffsetDiv2(), "ph_cr_beta_offset_div2" );
+          WRITE_SVLC( picHeader->getDeblockingFilterCrTcOffsetDiv2(), "ph_cr_tc_offset_div2" );
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+        }
+#endif
       }
     }
     else
@@ -2535,10 +2548,17 @@ void HLSWriter::codeSliceHeader         ( Slice* pcSlice )
         {
           WRITE_SVLC (pcSlice->getDeblockingFilterBetaOffsetDiv2(), "slice_beta_offset_div2");
           WRITE_SVLC (pcSlice->getDeblockingFilterTcOffsetDiv2(),   "slice_tc_offset_div2");
-          WRITE_SVLC (pcSlice->getDeblockingFilterCbBetaOffsetDiv2(), "slice_cb_beta_offset_div2");
-          WRITE_SVLC (pcSlice->getDeblockingFilterCbTcOffsetDiv2(),   "slice_cb_tc_offset_div2");
-          WRITE_SVLC (pcSlice->getDeblockingFilterCrBetaOffsetDiv2(), "slice_cr_beta_offset_div2");
-          WRITE_SVLC (pcSlice->getDeblockingFilterCrTcOffsetDiv2(),   "slice_cr_tc_offset_div2");
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+          if( pcSlice->getPPS()->getPPSChromaToolFlag() )
+          {
+#endif
+            WRITE_SVLC (pcSlice->getDeblockingFilterCbBetaOffsetDiv2(), "slice_cb_beta_offset_div2");
+            WRITE_SVLC (pcSlice->getDeblockingFilterCbTcOffsetDiv2(),   "slice_cb_tc_offset_div2");
+            WRITE_SVLC (pcSlice->getDeblockingFilterCrBetaOffsetDiv2(), "slice_cr_beta_offset_div2");
+            WRITE_SVLC (pcSlice->getDeblockingFilterCrTcOffsetDiv2(),   "slice_cr_tc_offset_div2");
+#if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
+          }
+#endif
         }
       }
       else
-- 
GitLab


From 84f7e9cf9b26e10ebc3e17f3e347afe23762e796 Mon Sep 17 00:00:00 2001
From: Haiwei Sun <haiwei.sun@sg.panasonic.com>
Date: Mon, 11 May 2020 11:27:15 +0200
Subject: [PATCH 2/4] Update VLCWriter.cpp

---
 source/Lib/EncoderLib/VLCWriter.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index fe290b14ed..d245a4d33d 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -494,7 +494,7 @@ void HLSWriter::codePPS( const PPS* pcPPS )
       }
 #endif
     }
-
+  }
 #if JVET_R0113_AND_JVET_R0106_PPS_CLEANUP
   if (!pcPPS->getNoPicPartitionFlag())
   {
-- 
GitLab


From ea511e397fee9731d598b018f13741a38553c45a Mon Sep 17 00:00:00 2001
From: Haiwei Sun <haiwei.sun@sg.panasonic.com>
Date: Sat, 16 May 2020 12:18:04 +0200
Subject: [PATCH 3/4] Update EncLib.cpp by renaming bChromaXXX to chromaXXX

---
 source/Lib/EncoderLib/EncLib.cpp | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index 2de3b3c584..3a47530e64 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -1668,19 +1668,19 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps)
   pps.setLoopFilterAcrossSlicesEnabledFlag( m_bLFCrossSliceBoundaryFlag );
 
 #if JVET_R0078_DISABLE_CHROMA_DBF_OFFSET_SINGALLING
-  bool bChromaQPOffsetNotZero = false;
+  bool chromaQPOffsetNotZero = false;
   if( pps.getQpOffset(COMPONENT_Cb) != 0 || pps.getQpOffset(COMPONENT_Cr) != 0 || pps.getJointCbCrQpOffsetPresentFlag() || pps.getSliceChromaQpFlag() || pps.getCuChromaQpOffsetListEnabledFlag() )
   {
-    bChromaQPOffsetNotZero = true;
+    chromaQPOffsetNotZero = true;
   }
-  bool bChromaDbfOffsetNotSameAsLuma = true;
+  bool chromaDbfOffsetNotSameAsLuma = true;
   if( pps.getDeblockingFilterCbBetaOffsetDiv2() == pps.getDeblockingFilterBetaOffsetDiv2() && pps.getDeblockingFilterCrBetaOffsetDiv2() == pps.getDeblockingFilterBetaOffsetDiv2()
      && pps.getDeblockingFilterCbTcOffsetDiv2() == pps.getDeblockingFilterTcOffsetDiv2() && pps.getDeblockingFilterCrTcOffsetDiv2() == pps.getDeblockingFilterTcOffsetDiv2() )
   {
-    bChromaDbfOffsetNotSameAsLuma = false;
+    chromaDbfOffsetNotSameAsLuma = false;
   }
   const uint32_t chromaArrayType = (int)sps.getSeparateColourPlaneFlag() ? 0 : sps.getChromaFormatIdc();
-  if( ( chromaArrayType != CHROMA_400 ) && ( bChromaQPOffsetNotZero || bChromaDbfOffsetNotSameAsLuma ) )
+  if( ( chromaArrayType != CHROMA_400 ) && ( chromaQPOffsetNotZero || chromaDbfOffsetNotSameAsLuma ) )
   {
     pps.setPPSChromaToolFlag(true);
   }
-- 
GitLab


From f4600b8d6ace7293d5d4fb89afa8eb2bc50ba253 Mon Sep 17 00:00:00 2001
From: Haiwei Sun <haiwei.sun@sg.panasonic.com>
Date: Tue, 19 May 2020 07:54:36 +0200
Subject: [PATCH 4/4] Update EncLib.cpp by adding else {
 pps.setPPSChromaToolFlag(false); }

---
 source/Lib/EncoderLib/EncLib.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index 3a47530e64..e01d08575c 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -1684,6 +1684,10 @@ void EncLib::xInitPPS(PPS &pps, const SPS &sps)
   {
     pps.setPPSChromaToolFlag(true);
   }
+  else
+  {
+    pps.setPPSChromaToolFlag(false);
+  }
 #endif
 
   int histogram[MAX_NUM_REF + 1];
-- 
GitLab