From 11cfea0049824c888b9a8f47d716189dd478dd33 Mon Sep 17 00:00:00 2001
From: hobingzhang <hobingzhang@tencent.com>
Date: Mon, 3 Feb 2020 21:21:13 +0800
Subject: [PATCH] Q0505-Disabling chroma scaling list signaling for 400 color
 format

---
 source/Lib/CommonLib/Quant.cpp      |  7 +++++++
 source/Lib/CommonLib/Slice.cpp      |  3 +++
 source/Lib/CommonLib/Slice.h        |  8 +++++++-
 source/Lib/CommonLib/TypeDef.h      |  2 ++
 source/Lib/DecoderLib/VLCReader.cpp | 15 +++++++++++++++
 source/Lib/EncoderLib/EncLib.cpp    |  9 +++++++++
 source/Lib/EncoderLib/VLCWriter.cpp | 10 ++++++++++
 7 files changed, 53 insertions(+), 1 deletion(-)

diff --git a/source/Lib/CommonLib/Quant.cpp b/source/Lib/CommonLib/Quant.cpp
index 90c526ab9..f57a415a6 100644
--- a/source/Lib/CommonLib/Quant.cpp
+++ b/source/Lib/CommonLib/Quant.cpp
@@ -544,6 +544,13 @@ void Quant::setScalingList(ScalingList *scalingList, const int maxLog2TrDynamicR
     {
       if ((size == SCALING_LIST_2x2 && list < 4) || (size == SCALING_LIST_64x64 && list % (SCALING_LIST_NUM / SCALING_LIST_PRED_MODES) != 0))   // skip 2x2 luma
         continue;
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+      if (!(scalingList->getChromaScalingListPresentFlag() || list % (SCALING_LIST_NUM / SCALING_LIST_PRED_MODES) == 0 || (size ==SCALING_LIST_64x64)))// skip chroma QM for 400
+      {
+        scalingList->processDefaultMatrix(scalingListId);
+        scalingListId++; continue;
+      }
+#endif
       for(int qp = minimumQp; qp < maximumQp; qp++)
       {
         xSetScalingListEnc(scalingList, list, size, qp, scalingListId);
diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp
index ca189b08a..bfca6c174 100644
--- a/source/Lib/CommonLib/Slice.cpp
+++ b/source/Lib/CommonLib/Slice.cpp
@@ -2891,6 +2891,9 @@ void ReferencePictureList::printRefPicInfo() const
 ScalingList::ScalingList()
 {
   m_disableScalingMatrixForLfnstBlks = true;
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+  m_chromaScalingListPresentFlag = true;
+#endif
   for (uint32_t scalingListId = 0; scalingListId < 28; scalingListId++)
   {
     int matrixSize = (scalingListId < SCALING_LIST_1D_START_4x4) ? 2 : (scalingListId < SCALING_LIST_1D_START_8x8) ? 4 : 8;
diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h
index 97025ddb4..44256e01f 100644
--- a/source/Lib/CommonLib/Slice.h
+++ b/source/Lib/CommonLib/Slice.h
@@ -191,7 +191,10 @@ public:
   void       codeScalingList(int* scalingList, int scalingListDC, int scalinListId, int& bitsCost);
   void       setScalingListPreditorModeFlag(uint32_t scalingListId, bool bIsPred) { m_scalingListPreditorModeFlag[scalingListId] = bIsPred; }
   bool       getScalingListPreditorModeFlag(uint32_t scalingListId) const { return m_scalingListPreditorModeFlag[scalingListId]; }
-
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+  bool       getChromaScalingListPresentFlag() const {return m_chromaScalingListPresentFlag;}
+  void       setChromaScalingListPresentFlag( bool flag) { m_chromaScalingListPresentFlag = flag;}
+  #endif
   void       checkDcOfMatrix();
   bool       xParseScalingList(const std::string &fileName);
   void       setDefaultScalingList();
@@ -232,6 +235,9 @@ private:
   uint32_t         m_refMatrixId                   [30]; //!< RefMatrixID
   bool             m_scalingListPreditorModeFlag   [30]; //!< reference list index
   std::vector<int> m_scalingListCoef               [30]; //!< quantization matrix
+  #if JVET_Q0505_CHROAM_QM_SIGNALING_400
+  bool             m_chromaScalingListPresentFlag;
+  #endif
 };
 
 class ConstraintInfo
diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 4d4e3e183..16ba237c5 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -50,6 +50,8 @@
 #include <assert.h>
 #include <cassert>
 
+#define JVET_Q0505_CHROAM_QM_SIGNALING_400                1  //JVET-Q0505: Cleanup of chroma quantization matrix signaling for 400 color format
+
 #define JVET_Q0468_Q0469_MIN_LUMA_CB_AND_MIN_QT_FIX       1 // JVET-Q0468: add support of min Luma coding block size; JVET-Q0469: fix for signaling of Intra Chroma Min QT size
 
 #define JVET_Q0210_UEK_REMOVAL                            1 // JVET-Q0210 Aspect 8: Replace uek signalling in alf_data with ue(v).
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 850a5383c..b4d3044e7 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -4522,8 +4522,16 @@ void HLSyntaxReader::parseScalingList(ScalingList* scalingList)
   uint32_t  code;
   bool scalingListCopyModeFlag;
   READ_FLAG(code, "scaling_matrix_for_lfnst_disabled_flag"); scalingList->setDisableScalingMatrixForLfnstBlks(code ? true : false);
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+  READ_FLAG(code, "scaling_list_chroma_present_flag");
+  scalingList->setChromaScalingListPresentFlag(code ? true : false);
+#endif
   for (int scalingListId = 0; scalingListId < 28; scalingListId++)
   {
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+  if(scalingList->getChromaScalingListPresentFlag()|| scalingListId % 3 == 2 || scalingListId == 27)
+   {
+#endif
     READ_FLAG(code, "scaling_list_copy_mode_flag");
     scalingListCopyModeFlag = (code) ? true : false;
     scalingList->setScalingListCopyModeFlag(scalingListId, scalingListCopyModeFlag);
@@ -4558,6 +4566,13 @@ void HLSyntaxReader::parseScalingList(ScalingList* scalingList)
     {
       decodeScalingList(scalingList, scalingListId, scalingList->getScalingListPreditorModeFlag(scalingListId));
     }
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+    }
+  else
+  {
+     scalingList->processDefaultMatrix(scalingListId);
+  }
+#endif
   }
 
   return;
diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp
index bbadea5e4..8212adc02 100644
--- a/source/Lib/EncoderLib/EncLib.cpp
+++ b/source/Lib/EncoderLib/EncLib.cpp
@@ -573,6 +573,9 @@ void EncLib::xInitScalingLists( SPS &sps, APS &aps )
     {
       setUseScalingListId( SCALING_LIST_DEFAULT );
     }
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+    aps.getScalingList().setChromaScalingListPresentFlag((sps.getChromaFormatIdc()!=CHROMA_400));
+#endif
     quant->setScalingList( &( aps.getScalingList() ), maxLog2TrDynamicRange, sps.getBitDepths() );
     quant->setUseScalingList(true);
 #if ENABLE_SPLIT_PARALLELISM
@@ -593,7 +596,13 @@ void EncLib::xInitScalingLists( SPS &sps, APS &aps )
     // Prepare delta's:
     for (uint32_t scalingListId = 0; scalingListId < 28; scalingListId++)
     {
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+      if (aps.getScalingList().getChromaScalingListPresentFlag()|| scalingListId % 3 == 2 || scalingListId == 27){
+#endif
         aps.getScalingList().checkPredMode(scalingListId);
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+      }
+#endif
     }
   }
 }
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index fdbb056f8..53cbcbc1c 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -3090,8 +3090,15 @@ void HLSWriter::codeScalingList( const ScalingList &scalingList )
 {
   //for each size
   WRITE_FLAG(scalingList.getDisableScalingMatrixForLfnstBlks(), "scaling_matrix_for_lfnst_disabled_flag"); 
+  #if JVET_Q0505_CHROAM_QM_SIGNALING_400
+  WRITE_FLAG(scalingList.getChromaScalingListPresentFlag(), "scaling_list_chroma_present_flag");
+  #endif
   for (uint32_t scalingListId = 0; scalingListId < 28; scalingListId++)
   {
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+    if(scalingList.getChromaScalingListPresentFlag()|| scalingListId % 3 == 2 || scalingListId == 27)
+   {
+#endif
     bool scalingListCopyModeFlag = scalingList.getScalingListCopyModeFlag(scalingListId);
     WRITE_FLAG(scalingListCopyModeFlag, "scaling_list_copy_mode_flag"); //copy mode
     if (!scalingListCopyModeFlag)// Copy Mode
@@ -3107,6 +3114,9 @@ void HLSWriter::codeScalingList( const ScalingList &scalingList )
       //DPCM
       xCodeScalingList(&scalingList, scalingListId, scalingList.getScalingListPreditorModeFlag(scalingListId));
     }
+#if JVET_Q0505_CHROAM_QM_SIGNALING_400
+   }
+#endif
   }
   return;
 }
-- 
GitLab