From 8307bc14e0c71fbf44bdff0b5d0f3a4ff7eb1f9f Mon Sep 17 00:00:00 2001
From: jennylai <jenny.lai@mediatek.com>
Date: Wed, 16 Oct 2019 10:23:58 +0800
Subject: [PATCH] integrate JVET-P0164

---
 source/Lib/CommonLib/TypeDef.h                |  2 ++
 source/Lib/DecoderLib/VLCReader.cpp           |  6 ++++
 .../Lib/EncoderLib/EncAdaptiveLoopFilter.cpp  | 36 +++++++++++++++++++
 source/Lib/EncoderLib/EncAdaptiveLoopFilter.h |  4 +++
 source/Lib/EncoderLib/VLCWriter.cpp           |  6 ++++
 5 files changed, 54 insertions(+)

diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h
index 56871e4b7a..15cb896b87 100644
--- a/source/Lib/CommonLib/TypeDef.h
+++ b/source/Lib/CommonLib/TypeDef.h
@@ -50,6 +50,8 @@
 #include <assert.h>
 #include <cassert>
 
+#define JVET_P0164_ALF_SYNTAX_SIMP                        1 // JVET-p0164: simplify alf syntax with method2
+
 #define JVET_O0145_ENTRYPOINT_SIGNALLING                  0 // JVET-O0145: Not signalling num_entry_point_offsets but derive it at decoder
 
 #define JVET_O0625_ALF_PADDING                            1 // JVET-O0625/O0654/O0662: Unified padding method in ALF
diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp
index 3ace78ac3b..0760ec1efe 100644
--- a/source/Lib/DecoderLib/VLCReader.cpp
+++ b/source/Lib/DecoderLib/VLCReader.cpp
@@ -2885,6 +2885,7 @@ int HLSyntaxReader::alfGolombDecode( const int k, const bool signed_val )
 void HLSyntaxReader::alfFilter( AlfParam& alfParam, const bool isChroma, const int altIdx )
 {
   uint32_t code;
+#if !JVET_P0164_ALF_SYNTAX_SIMP
   if( !isChroma )
   {
     READ_FLAG( code, "alf_luma_coeff_delta_flag" );
@@ -2895,6 +2896,7 @@ void HLSyntaxReader::alfFilter( AlfParam& alfParam, const bool isChroma, const i
       std::memset( alfParam.alfLumaCoeffFlag, true, sizeof( alfParam.alfLumaCoeffFlag ) );
     }
   }
+#endif
 
   // derive maxGolombIdx
   AlfFilterShape alfShape( isChroma ? 5 : 7 );
@@ -2902,6 +2904,7 @@ void HLSyntaxReader::alfFilter( AlfParam& alfParam, const bool isChroma, const i
   short* coeff = isChroma ? alfParam.chromaCoeff[altIdx] : alfParam.lumaCoeff;
   short* clipp = isChroma ? alfParam.chromaClipp[altIdx] : alfParam.lumaClipp;
 
+#if !JVET_P0164_ALF_SYNTAX_SIMP
   if( !isChroma )
   {
     if( alfParam.alfLumaCoeffDeltaFlag )
@@ -2913,15 +2916,18 @@ void HLSyntaxReader::alfFilter( AlfParam& alfParam, const bool isChroma, const i
       }
     }
   }
+#endif
 
   // Filter coefficients
   for( int ind = 0; ind < numFilters; ++ind )
   {
+#if !JVET_P0164_ALF_SYNTAX_SIMP
     if( !isChroma && !alfParam.alfLumaCoeffFlag[ind] && alfParam.alfLumaCoeffDeltaFlag )
     {
       memset( coeff + ind * MAX_NUM_ALF_LUMA_COEFF, 0, sizeof( *coeff ) * alfShape.numCoeff );
       continue;
     }
+#endif
 
     for( int i = 0; i < alfShape.numCoeff - 1; i++ )
     {
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
index 7f081af8f7..35aa25c768 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp
@@ -1296,7 +1296,11 @@ double EncAdaptiveLoopFilter::mergeFiltersAndCost( AlfParam& alfParam, AlfFilter
 
 int EncAdaptiveLoopFilter::getNonFilterCoeffRate( AlfParam& alfParam )
 {
+#if JVET_P0164_ALF_SYNTAX_SIMP
+  int len = 0   // alf_coefficients_delta_flag
+#else
   int len = 1   // alf_coefficients_delta_flag
+#endif
           + 2                                          // slice_alf_chroma_idc                     u(2)
           + lengthUvlc (alfParam.numLumaFilters - 1);  // alf_luma_num_filters_signalled_minus1   ue(v)
 
@@ -1314,7 +1318,11 @@ int EncAdaptiveLoopFilter::getNonFilterCoeffRate( AlfParam& alfParam )
 
 int EncAdaptiveLoopFilter::getCostFilterCoeffForce0( AlfFilterShape& alfShape, int **pDiffQFilterCoeffIntPP, const int numFilters, bool* codedVarBins )
 {
+#if JVET_P0164_ALF_SYNTAX_SIMP
+  int len = 0;
+#else
   int len = numFilters; //filter_coefficient_flag[i]
+#endif
   // Filter coefficients
   for( int ind = 0; ind < numFilters; ++ind )
   {
@@ -1325,6 +1333,15 @@ int EncAdaptiveLoopFilter::getCostFilterCoeffForce0( AlfFilterShape& alfShape, i
         len += lengthGolomb( abs( pDiffQFilterCoeffIntPP[ind][i] ), 3 ); // alf_coeff_luma_delta[i][j]
       }
     }
+#if JVET_P0164_ALF_SYNTAX_SIMP
+    else
+    {
+      for (int i = 0; i < alfShape.numCoeff - 1; i++)
+      {
+        len += lengthGolomb(0, 3); // alf_coeff_luma_delta[i][j]
+      }
+    }
+#endif
   }
 
   if( m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA][0] )
@@ -1398,6 +1415,13 @@ double EncAdaptiveLoopFilter::getDistForce0( AlfFilterShape& alfShape, const int
     }
   }
 
+#if JVET_P0164_ALF_SYNTAX_SIMP
+  static int zeroBitsVarBin = 0;
+  for (int i = 0; i < alfShape.numCoeff - 1; i++)
+  {
+    zeroBitsVarBin += lengthGolomb(0, 3);
+  }
+#endif
   if( m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA][0] )
   {
     for (int ind = 0; ind < numFilters; ++ind)
@@ -1412,18 +1436,30 @@ double EncAdaptiveLoopFilter::getDistForce0( AlfFilterShape& alfShape, const int
     }
   }
 
+#if JVET_P0164_ALF_SYNTAX_SIMP
+  double distForce0 = getDistCoeffForce0( codedVarBins, errorTabForce0Coeff, bitsVarBin, zeroBitsVarBin, numFilters);
+#else
   double distForce0 = getDistCoeffForce0( codedVarBins, errorTabForce0Coeff, bitsVarBin, numFilters );
+#endif
 
   return distForce0;
 }
+#if JVET_P0164_ALF_SYNTAX_SIMP
+double EncAdaptiveLoopFilter::getDistCoeffForce0( bool* codedVarBins, double errorForce0CoeffTab[MAX_NUM_ALF_CLASSES][2], int* bitsVarBin, int zeroBitsVarBin, const int numFilters)
+#else
 double EncAdaptiveLoopFilter::getDistCoeffForce0( bool* codedVarBins, double errorForce0CoeffTab[MAX_NUM_ALF_CLASSES][2], int* bitsVarBin, const int numFilters )
+#endif
 {
   double distForce0 = 0;
   std::memset( codedVarBins, 0, sizeof( *codedVarBins ) * MAX_NUM_ALF_CLASSES );
 
   for( int filtIdx = 0; filtIdx < numFilters; filtIdx++ )
   {
+#if JVET_P0164_ALF_SYNTAX_SIMP
+    double costDiff = (errorForce0CoeffTab[filtIdx][0] + m_lambda[COMPONENT_Y] * zeroBitsVarBin) - (errorForce0CoeffTab[filtIdx][1] + m_lambda[COMPONENT_Y] * bitsVarBin[filtIdx]);
+#else
     double costDiff = errorForce0CoeffTab[filtIdx][0] - ( errorForce0CoeffTab[filtIdx][1] + m_lambda[COMPONENT_Y] * bitsVarBin[filtIdx] );
+#endif
     codedVarBins[filtIdx] = costDiff > 0 ? true : false;
     distForce0 += errorForce0CoeffTab[filtIdx][codedVarBins[filtIdx] ? 1 : 0];
   }
diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
index 78fefde71e..4573840ba3 100644
--- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
+++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h
@@ -313,7 +313,11 @@ private:
                                   const int numClasses, const int numCoeff, double& distUnfilter );
   void   roundFiltCoeff( int *filterCoeffQuant, double *filterCoeff, const int numCoeff, const int factor );
 
+#if JVET_P0164_ALF_SYNTAX_SIMP
+  double getDistCoeffForce0( bool* codedVarBins, double errorForce0CoeffTab[MAX_NUM_ALF_CLASSES][2], int* bitsVarBin, int zeroBitsVarBin, const int numFilters);
+#else
   double getDistCoeffForce0( bool* codedVarBins, double errorForce0CoeffTab[MAX_NUM_ALF_CLASSES][2], int* bitsVarBin, const int numFilters );
+#endif
   int    lengthUvlc( int uiCode );
   int    getNonFilterCoeffRate( AlfParam& alfParam );
 
diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp
index e42331ee8f..d0346b12ef 100644
--- a/source/Lib/EncoderLib/VLCWriter.cpp
+++ b/source/Lib/EncoderLib/VLCWriter.cpp
@@ -1836,16 +1836,19 @@ void HLSWriter::alfGolombEncode( int coeff, int k, const bool signed_coeff )
 
 void HLSWriter::alfFilter( const AlfParam& alfParam, const bool isChroma, const int altIdx )
 {
+#if !JVET_P0164_ALF_SYNTAX_SIMP
   if( !isChroma )
   {
     WRITE_FLAG( alfParam.alfLumaCoeffDeltaFlag, "alf_luma_coeff_delta_flag" );
   }
+#endif
   AlfFilterShape alfShape(isChroma ? 5 : 7);
   const short* coeff = isChroma ? alfParam.chromaCoeff[altIdx] : alfParam.lumaCoeff;
   const short* clipp = isChroma ? alfParam.chromaClipp[altIdx] : alfParam.lumaClipp;
   const int numFilters = isChroma ? 1 : alfParam.numLumaFilters;
 
   // vlc for all
+#if !JVET_P0164_ALF_SYNTAX_SIMP
   if( !isChroma )
   {
     if( alfParam.alfLumaCoeffDeltaFlag )
@@ -1856,14 +1859,17 @@ void HLSWriter::alfFilter( const AlfParam& alfParam, const bool isChroma, const
       }
     }
   }
+#endif
 
   // Filter coefficients
   for( int ind = 0; ind < numFilters; ++ind )
   {
+#if !JVET_P0164_ALF_SYNTAX_SIMP
     if( !isChroma && !alfParam.alfLumaCoeffFlag[ind] && alfParam.alfLumaCoeffDeltaFlag )
     {
       continue;
     }
+#endif
 
     for( int i = 0; i < alfShape.numCoeff - 1; i++ )
     {
-- 
GitLab