From e1af3f03472a137b4d7f63033e43ab96a03e59e7 Mon Sep 17 00:00:00 2001
From: ywchen <yiwenchen@kuaishou.com>
Date: Mon, 4 May 2020 12:36:41 -0700
Subject: [PATCH] Integration of R0324 to modfy PH syntax condition

---
 source/Lib/CommonLib/TypeDef.h      |  2 +
 source/Lib/DecoderLib/VLCReader.cpp | 64 ++++++++++++++++++++++++++++-
 source/Lib/EncoderLib/VLCWriter.cpp | 26 +++++++++++-
 3 files changed, 90 insertions(+), 2 deletions(-)

diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 4b8af774b..b7468eab0 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 R0324_PH_SYNTAX_CONDITION_MODIFY                  1 // JVET-R0324 add conditions on PH syntax to conder whether current pic is bi-predictive picture
+
 #define JVET_R0330_CRS_CLIP_REM                           1 // JVET-R0330: Remove redundant clipping in chroma residual scaling factor derivation
 
 #define JVET_R0059_RPL_CLEANUP                            1 // JVET-R0059 aspect 2: Condition the signalling of ltrp_in_header_flag[ listIdx ][ rplsIdx ].
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 550b5e23d..e6bf1df10 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -2771,8 +2771,11 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag
     {
       picHeader->setEnableTMVPFlag(false);
     }
-
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+    if (picHeader->getEnableTMVPFlag() && pps->getRplInfoInPhFlag() && picHeader->getRPL(1)->getNumRefEntries() > 0)
+#else
     if (picHeader->getEnableTMVPFlag() && pps->getRplInfoInPhFlag())
+#endif
     {
       READ_CODE( 1, uiCode, "ph_collocated_from_l0_flag");
       picHeader->setPicColFromL0Flag(uiCode);
@@ -2787,13 +2790,31 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag
         picHeader->setColRefIdx(0);
       }
     }
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+    else if (picHeader->getEnableTMVPFlag() && pps->getRplInfoInPhFlag() && picHeader->getRPL(1)->getNumRefEntries() == 0)
+    {
+      picHeader->setPicColFromL0Flag(1);
+    }
+#else
     else
     {
       picHeader->setPicColFromL0Flag(0);
     }
+#endif
 
   // mvd L1 zero flag
+    #if R0324_PH_SYNTAX_CONDITION_MODIFY
+    if (!pps->getRplInfoInPhFlag() || picHeader->getRPL(1)->getNumRefEntries() > 0)
+    {
+      READ_FLAG(uiCode, "pic_mvd_l1_zero_flag");
+    }
+    else
+    {
+      uiCode = 1;
+    }
+#else
     READ_FLAG(uiCode, "mvd_l1_zero_flag");
+#endif
     picHeader->setMvdL1ZeroFlag( uiCode != 0 );
 
   // merge candidate list size
@@ -2819,23 +2840,53 @@ void HLSyntaxReader::parsePictureHeader( PicHeader* picHeader, ParameterSetManag
     }
 
   // picture level BDOF disable flags
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+    if (sps->getBdofControlPresentFlag() && (!pps->getRplInfoInPhFlag() || picHeader->getRPL(1)->getNumRefEntries() > 0))
+#else
     if (sps->getBdofControlPresentFlag())
+#endif
     {
       READ_FLAG(uiCode, "ph_disable_bdof_flag");  picHeader->setDisBdofFlag(uiCode != 0);
     }
     else
     {
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+      if (sps->getBdofControlPresentFlag() == 0)
+      {
+        picHeader->setDisBdofFlag(1 - (int)(sps->getBDOFEnabledFlag()));
+      }
+      else
+      {
+        picHeader->setDisBdofFlag(1);
+      }
+#else
       picHeader->setDisBdofFlag(0);
+#endif
     }
 
   // picture level DMVR disable flags
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+    if (sps->getDmvrControlPresentFlag() && (!pps->getRplInfoInPhFlag() || picHeader->getRPL(1)->getNumRefEntries() > 0))
+#else
     if (sps->getDmvrControlPresentFlag())
+#endif
     {
       READ_FLAG(uiCode, "ph_disable_dmvr_flag");  picHeader->setDisDmvrFlag(uiCode != 0);
     }
     else
     {
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+      if (sps->getDmvrControlPresentFlag() == 0)
+      {
+        picHeader->setDisDmvrFlag(1 - (int)(sps->getUseDMVR()));
+      }
+      else
+      {
+        picHeader->setDisDmvrFlag(1);
+      }
+#else
       picHeader->setDisDmvrFlag(0);
+#endif
     }
 
   // picture level PROF disable flags
@@ -4533,7 +4584,18 @@ void HLSyntaxReader::parsePredWeightTable(PicHeader *picHeader, const SPS *sps)
 
     if (numRef == 0)
     {
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+      if (picHeader->getRPL(1)->getNumRefEntries() > 0)
+      {
+        READ_UVLC(numLxWeights, "num_l1_weights");
+      }
+      else
+      {
+        numLxWeights = 0;
+      }
+#else
       READ_UVLC(numLxWeights, "num_l1_weights");
+#endif
       moreSyntaxToBeParsed = (numLxWeights == 0) ? false : true;
       picHeader->setNumL1Weights(numLxWeights);
     }
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index ab444f215..e80c66254 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -1778,7 +1778,11 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader, bool writeRbspTrailingB
     if (sps->getSPSTemporalMVPEnabledFlag())
     {
       WRITE_FLAG( picHeader->getEnableTMVPFlag(), "ph_temporal_mvp_enabled_flag" );
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+      if (picHeader->getEnableTMVPFlag() && pps->getRplInfoInPhFlag() && picHeader->getRPL(1)->getNumRefEntries() > 0)
+#else
       if (picHeader->getEnableTMVPFlag() && pps->getRplInfoInPhFlag())
+#endif
       {
         WRITE_CODE(picHeader->getPicColFromL0Flag(), 1, "ph_collocated_from_l0_flag");
         if ((picHeader->getPicColFromL0Flag() && picHeader->getRPL(0)->getNumRefEntries() > 1) ||
@@ -1794,8 +1798,14 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader, bool writeRbspTrailingB
     }
 
   // mvd L1 zero flag
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+    if (!pps->getRplInfoInPhFlag() || picHeader->getRPL(1)->getNumRefEntries() > 0)
+    {
+      WRITE_FLAG(picHeader->getMvdL1ZeroFlag(), "pic_mvd_l1_zero_flag");
+    }
+#else
     WRITE_FLAG(picHeader->getMvdL1ZeroFlag(), "mvd_l1_zero_flag");
-
+#endif
   // merge candidate list size
   // subblock merge candidate list size
     if ( sps->getUseAffine() )
@@ -1818,7 +1828,11 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader, bool writeRbspTrailingB
     }
 
   // picture level BDOF disable flags
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+    if (sps->getBdofControlPresentFlag() && (!pps->getRplInfoInPhFlag() || picHeader->getRPL(1)->getNumRefEntries() > 0))
+#else
     if (sps->getBdofControlPresentFlag())
+#endif
     {
       WRITE_FLAG(picHeader->getDisBdofFlag(), "ph_disable_bdof_flag");
     }
@@ -1828,7 +1842,11 @@ void HLSWriter::codePictureHeader( PicHeader* picHeader, bool writeRbspTrailingB
     }
 
   // picture level DMVR disable flags
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+    if (sps->getDmvrControlPresentFlag() && (!pps->getRplInfoInPhFlag() || picHeader->getRPL(1)->getNumRefEntries() > 0))
+#else
     if (sps->getDmvrControlPresentFlag())
+#endif
     {
       WRITE_FLAG(picHeader->getDisDmvrFlag(), "ph_disable_dmvr_flag");
     }
@@ -2767,6 +2785,12 @@ void HLSWriter::xCodePredWeightTable(PicHeader *picHeader, const SPS *sps)
     if (numRef == 0)
     {
       numLxWeights         = picHeader->getNumL1Weights();
+#if R0324_PH_SYNTAX_CONDITION_MODIFY
+      if (picHeader->getRPL(1)->getNumRefEntries() > 0)
+      {
+        WRITE_UVLC(numLxWeights, "num_l1_weights");
+      }
+#endif
       moreSyntaxToBeParsed = (numLxWeights == 0) ? false : true;
     }
   }
-- 
GitLab