diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp index 5eb7c0224c430020c585135b660ef213804250bc..631a841fce30a14173cefaa8babe82f1d39e0eb7 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp @@ -104,7 +104,9 @@ void AdaptiveLoopFilter::ALFProcess( CodingStructure& cs, AlfSliceParam& alfSlic { Area blk( xPos, yPos, width, height ); deriveClassification( m_classifier, tmpYuv.get( COMPONENT_Y ), blk ); - +#if JVET_L0664_ALF_REMOVE_LUMA_5x5 + m_filter7x7Blk(m_classifier, recYuv, tmpYuv, blk, COMPONENT_Y, m_coeffFinal, m_clpRngs.comp[COMPONENT_Y]); +#else if( alfSliceParam.lumaFilterType == ALF_FILTER_5 ) { m_filter5x5Blk( m_classifier, recYuv, tmpYuv, blk, COMPONENT_Y, m_coeffFinal, m_clpRngs.comp[COMPONENT_Y] ); @@ -117,6 +119,7 @@ void AdaptiveLoopFilter::ALFProcess( CodingStructure& cs, AlfSliceParam& alfSlic { CHECK( 0, "Wrong ALF filter type" ); } +#endif } for( int compIdx = 1; compIdx < MAX_NUM_COMPONENT; compIdx++ ) @@ -140,8 +143,11 @@ void AdaptiveLoopFilter::ALFProcess( CodingStructure& cs, AlfSliceParam& alfSlic void AdaptiveLoopFilter::reconstructCoeff( AlfSliceParam& alfSliceParam, ChannelType channel, const bool bRedo ) { int factor = ( 1 << ( m_NUM_BITS - 1 ) ); - +#if JVET_L0664_ALF_REMOVE_LUMA_5x5 + AlfFilterType filterType = isLuma( channel ) ? ALF_FILTER_7 : ALF_FILTER_5; +#else AlfFilterType filterType = isLuma( channel ) ? alfSliceParam.lumaFilterType : ALF_FILTER_5; +#endif int numClasses = isLuma( channel ) ? MAX_NUM_ALF_CLASSES : 1; int numCoeff = filterType == ALF_FILTER_5 ? 7 : 13; int numCoeffMinus1 = numCoeff - 1; @@ -205,8 +211,9 @@ void AdaptiveLoopFilter::create( const int picWidth, const int picHeight, const m_numCTUsInWidth = ( m_picWidth / m_maxCUWidth ) + ( ( m_picWidth % m_maxCUWidth ) ? 1 : 0 ); m_numCTUsInHeight = ( m_picHeight / m_maxCUHeight ) + ( ( m_picHeight % m_maxCUHeight ) ? 1 : 0 ); m_numCTUsInPic = m_numCTUsInHeight * m_numCTUsInWidth; - +#if !JVET_L0664_ALF_REMOVE_LUMA_5x5 m_filterShapes[CHANNEL_TYPE_LUMA].push_back( AlfFilterShape( 5 ) ); +#endif m_filterShapes[CHANNEL_TYPE_LUMA].push_back( AlfFilterShape( 7 ) ); m_filterShapes[CHANNEL_TYPE_CHROMA].push_back( AlfFilterShape( 5 ) ); diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 9dd655b78be9685001fa8d8aee7ffb17330e03f5..e8336707e430f784b1c5a80c11e462976915b56a 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -50,6 +50,8 @@ #include <assert.h> #include <cassert> +#define JVET_L0664_ALF_REMOVE_LUMA_5x5 1 + #define JVET_L0083_ALF_FRAC_BIT 1 // Reduce number of ALF fractional bit to 7 #define JVET_L0082_ALF_COEF_BITS 1 // ALF filter coefficient bitwidth constraints @@ -1409,7 +1411,9 @@ struct AlfFilterShape struct AlfSliceParam { bool enabledFlag[MAX_NUM_COMPONENT]; // alf_slice_enable_flag, alf_chroma_idc +#if !JVET_L0664_ALF_REMOVE_LUMA_5x5 AlfFilterType lumaFilterType; // filter_type_flag +#endif bool chromaCtbPresentFlag; // alf_chroma_ctb_present_flag short lumaCoeff[MAX_NUM_ALF_CLASSES * MAX_NUM_ALF_LUMA_COEFF]; // alf_coeff_luma_delta[i][j] short chromaCoeff[MAX_NUM_ALF_CHROMA_COEFF]; // alf_coeff_chroma[i] @@ -1423,7 +1427,9 @@ struct AlfSliceParam void reset() { std::memset( enabledFlag, false, sizeof( enabledFlag ) ); +#if !JVET_L0664_ALF_REMOVE_LUMA_5x5 lumaFilterType = ALF_FILTER_5; +#endif std::memset( lumaCoeff, 0, sizeof( lumaCoeff ) ); std::memset( chromaCoeff, 0, sizeof( chromaCoeff ) ); std::memset( filterCoeffDeltaIdx, 0, sizeof( filterCoeffDeltaIdx ) ); @@ -1437,7 +1443,9 @@ struct AlfSliceParam const AlfSliceParam& operator = ( const AlfSliceParam& src ) { std::memcpy( enabledFlag, src.enabledFlag, sizeof( enabledFlag ) ); +#if !JVET_L0664_ALF_REMOVE_LUMA_5x5 lumaFilterType = src.lumaFilterType; +#endif std::memcpy( lumaCoeff, src.lumaCoeff, sizeof( lumaCoeff ) ); std::memcpy( chromaCoeff, src.chromaCoeff, sizeof( chromaCoeff ) ); std::memcpy( filterCoeffDeltaIdx, src.filterCoeffDeltaIdx, sizeof( filterCoeffDeltaIdx ) ); diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index d6fb31df22c0cc30ce33710a9052b897ee778e5c..de6b9dc231d656fb738fb9e33940f6c0379beb6f 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -2269,10 +2269,10 @@ void HLSyntaxReader::alf( AlfSliceParam& alfSliceParam ) xReadTruncBinCode( code, MAX_NUM_ALF_CLASSES ); //number_of_filters_minus1 alfSliceParam.numLumaFilters = code + 1; - +#if !JVET_L0664_ALF_REMOVE_LUMA_5x5 READ_FLAG( code, "filter_type_flag" ); alfSliceParam.lumaFilterType = code ? ALF_FILTER_5 : ALF_FILTER_7; - +#endif if( alfSliceParam.numLumaFilters > 1 ) { for( int i = 0; i < MAX_NUM_ALF_CLASSES; i++ ) @@ -2369,7 +2369,11 @@ void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChrom } // derive maxGolombIdx +#if JVET_L0664_ALF_REMOVE_LUMA_5x5 + AlfFilterShape alfShape( isChroma ? 5 : 7 ); +#else AlfFilterShape alfShape( isChroma ? 5 : ( alfSliceParam.lumaFilterType == ALF_FILTER_5 ? 5 : 7 ) ); +#endif const int maxGolombIdx = AdaptiveLoopFilter::getMaxGolombIdx( alfShape.filterType ); READ_UVLC( code, "min_golomb_order" ); diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index 2e16517680a0ab88234933460f4ed046d1855845..4be9e927099055a92c6bfb9e773fee7dddfb1877 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -340,11 +340,12 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS for( int iShapeIdx = 0; iShapeIdx < alfFilterShape.size(); iShapeIdx++ ) { m_alfSliceParamTemp = alfSliceParam; +#if !JVET_L0664_ALF_REMOVE_LUMA_5x5 if( isLuma( channel ) ) { m_alfSliceParamTemp.lumaFilterType = alfFilterShape[iShapeIdx].filterType; } - +#endif //1. get unfiltered distortion double cost = getUnfilteredDistortion( m_alfCovarianceFrame[channel][iShapeIdx], channel ); cost /= 1.001; // slight preference for unfiltered choice @@ -382,7 +383,11 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS //3. CTU decision double distUnfilter = 0; +#if JVET_L0664_ALF_REMOVE_LUMA_5x5 + const int iterNum = isLuma(channel) ? (2 * 4 + 1) : (2 * 2 + 1); +#else const int iterNum = 2 * 2 + 1; +#endif for( int iter = 0; iter < iterNum; iter++ ) { @@ -421,7 +426,11 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS int ctuIdx = 0; const int chromaScaleX = getComponentScaleX( compID, recBuf.chromaFormat ); const int chromaScaleY = getComponentScaleY( compID, recBuf.chromaFormat ); +#if JVET_L0664_ALF_REMOVE_LUMA_5x5 + AlfFilterType filterType = isLuma( compID ) ? ALF_FILTER_7 : ALF_FILTER_5; +#else AlfFilterType filterType = isLuma( compID ) ? alfSliceParam.lumaFilterType : ALF_FILTER_5; +#endif short* coeff = isLuma( compID ) ? m_coeffFinal : alfSliceParam.chromaCoeff; for( int yPos = 0; yPos < pcv.lumaHeight; yPos += pcv.maxCUHeight ) @@ -535,7 +544,11 @@ int EncAdaptiveLoopFilter::getCoeffRate( AlfSliceParam& alfSliceParam, bool isCh } memset( m_bitsCoeffScan, 0, sizeof( m_bitsCoeffScan ) ); +#if JVET_L0664_ALF_REMOVE_LUMA_5x5 + AlfFilterShape alfShape( isChroma ? 5 : 7 ); +#else AlfFilterShape alfShape( isChroma ? 5 : ( alfSliceParam.lumaFilterType == ALF_FILTER_5 ? 5 : 7 ) ); +#endif const int maxGolombIdx = AdaptiveLoopFilter::getMaxGolombIdx( alfShape.filterType ); const short* coeff = isChroma ? alfSliceParam.chromaCoeff : alfSliceParam.lumaCoeff; const int numFilters = isChroma ? 1 : alfSliceParam.numLumaFilters; diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 31d205d12e0b73173c23ec2217a0abcb0d107b7c..f29ec0b3f6771e6874f832657be6f58ceab3991f 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -1569,8 +1569,9 @@ void HLSWriter::alf( const AlfSliceParam& alfSliceParam ) truncatedUnaryEqProb( alfChromaIdc, 3 ); // alf_chroma_idc xWriteTruncBinCode( alfSliceParam.numLumaFilters - 1, MAX_NUM_ALF_CLASSES ); //number_of_filters_minus1 +#if !JVET_L0664_ALF_REMOVE_LUMA_5x5 WRITE_FLAG( alfSliceParam.lumaFilterType == ALF_FILTER_5 ? 1 : 0, "filter_type_flag" ); - +#endif if( alfSliceParam.numLumaFilters > 1 ) { for( int i = 0; i < MAX_NUM_ALF_CLASSES; i++ ) @@ -1631,7 +1632,11 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro static int bitsCoeffScan[EncAdaptiveLoopFilter::m_MAX_SCAN_VAL][EncAdaptiveLoopFilter::m_MAX_EXP_GOLOMB]; memset( bitsCoeffScan, 0, sizeof( bitsCoeffScan ) ); +#if JVET_L0664_ALF_REMOVE_LUMA_5x5 + AlfFilterShape alfShape( isChroma ? 5 : 7 ); +#else AlfFilterShape alfShape( isChroma ? 5 : ( alfSliceParam.lumaFilterType == ALF_FILTER_5 ? 5 : 7 ) ); +#endif const int maxGolombIdx = AdaptiveLoopFilter::getMaxGolombIdx( alfShape.filterType ); const short* coeff = isChroma ? alfSliceParam.chromaCoeff : alfSliceParam.lumaCoeff; const int numFilters = isChroma ? 1 : alfSliceParam.numLumaFilters;