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