From b4ae8bceba3f74c9a9485e96641961a55f19f156 Mon Sep 17 00:00:00 2001
From: Yue Yu <yue.yu@oppo.com>
Date: Thu, 28 Oct 2021 16:52:29 +0000
Subject: [PATCH] JVET-X0128 method 2, WPP

---
 source/Lib/CommonLib/TypeDef.h     |  3 +++
 source/Lib/DecoderLib/DecSlice.cpp |  3 +++
 source/Lib/EncoderLib/EncSlice.cpp | 10 ++++++++++
 3 files changed, 16 insertions(+)

diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index b5fc0c048..2c5a8993f 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -53,6 +53,9 @@
 // clang-format off
 
 //########### place macros to be removed in next cycle below this line ###############
+
+#define JVET_X0128_V2_WPP                                 1 // JVET-X0128 method 2, VVC v2 WPP
+
 #define JVET_X0079_MODIFIED_BITRATE                       1 // JVET-X0079v3 (changes to JVET-W2005)
 
 #define JVET_X0106_INTRA_CONSTRAINT                       1 // JVET-X0106 Constraint on non I=frames in Intra profiles
diff --git a/source/Lib/DecoderLib/DecSlice.cpp b/source/Lib/DecoderLib/DecSlice.cpp
index df27bae1c..81bca9782 100644
--- a/source/Lib/DecoderLib/DecSlice.cpp
+++ b/source/Lib/DecoderLib/DecSlice.cpp
@@ -203,6 +203,9 @@ void DecSlice::decompressSlice( Slice* slice, InputBitstream* bitstream, int deb
       {
         // Top is available, so use it.
         cabacReader.getCtx() = m_entropyCodingSyncContextState;
+#if JVET_X0128_V2_WPP
+        cabacReader.getCtx().riceStatReset(slice->getSPS()->getBitDepth(CHANNEL_TYPE_LUMA), slice->getSPS()->getSpsRangeExtension().getPersistentRiceAdaptationEnabledFlag());
+#endif
         cs.setPrevPLT(m_palettePredictorSyncState);
       }
       pic->m_prevQP[0] = pic->m_prevQP[1] = slice->getSliceQp();
diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp
index f640dd112..8c0560d07 100644
--- a/source/Lib/EncoderLib/EncSlice.cpp
+++ b/source/Lib/EncoderLib/EncSlice.cpp
@@ -1774,6 +1774,11 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons
       {
         // Top is available, we use it.
         pCABACWriter->getCtx() = pEncLib->m_entropyCodingSyncContextState;
+#if JVET_X0128_V2_WPP
+        pCABACWriter->getCtx().riceStatReset(
+          pcSlice->getSPS()->getBitDepth(CHANNEL_TYPE_LUMA),
+          pcSlice->getSPS()->getSpsRangeExtension().getPersistentRiceAdaptationEnabledFlag());
+#endif
         cs.setPrevPLT(pEncLib->m_palettePredictorSyncState);
       }
       prevQP[0] = prevQP[1] = pcSlice->getSliceQp();
@@ -2054,6 +2059,11 @@ void EncSlice::encodeSlice   ( Picture* pcPic, OutputBitstream* pcSubstreams, ui
       {
         // Top is available, so use it.
         m_CABACWriter->getCtx() = m_entropyCodingSyncContextState;
+#if JVET_X0128_V2_WPP
+        m_CABACWriter->getCtx().riceStatReset(
+          pcSlice->getSPS()->getBitDepth(CHANNEL_TYPE_LUMA),
+          pcSlice->getSPS()->getSpsRangeExtension().getPersistentRiceAdaptationEnabledFlag());
+#endif
         cs.setPrevPLT(m_palettePredictorSyncState);
       }
     }
-- 
GitLab