diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index b168a1e33f177bdafe045d0aa12d4c78fac7a646..c063f710319dcdb9e10246e76ca21c7df91eacfd 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -3386,11 +3386,22 @@ void EncAdaptiveLoopFilter::deriveStatsForFiltering( PelUnitBuf& orgYuv, PelUnit } } - initDistortion( + if (m_alfWSSD) + { + initDistortion<true>( #if ALF_IMPROVEMENT - cs + cs #endif - ); + ); + } + else + { + initDistortion<false>( +#if ALF_IMPROVEMENT + cs +#endif + ); + } } #if ALF_IMPROVEMENT @@ -3837,6 +3848,8 @@ std::vector<int> EncAdaptiveLoopFilter::getAvaiApsIdsLuma(CodingStructure& cs, i CHECK(newApsId >= ALF_CTB_MAX_NUM_APS, "Wrong APS index assignment in getAvaiApsIdsLuma"); return result; } + +template<bool alfWSSD> void EncAdaptiveLoopFilter::initDistortion( #if ALF_IMPROVEMENT CodingStructure& cs @@ -3896,11 +3909,19 @@ void EncAdaptiveLoopFilter::initDistortion( { for (int x = 0; x < width; x++) { - m_ctbDistortionFixedFilter[classifierIdx][filterSetIdx][ctbIdx] += (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]) * (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]); + if (alfWSSD) + { + double weight = m_lumaLevelToWeightPLUT[org[x]]; + m_ctbDistortionFixedFilter[classifierIdx][filterSetIdx][ctbIdx] += weight * (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]) * (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]); + } + else + { + m_ctbDistortionFixedFilter[classifierIdx][filterSetIdx][ctbIdx] += (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]) * (org[x] - m_fixFilterResult[fixedFilter][y + yPos][x + xPos]); + } } org += orgStride; } -} + } } ctbIdx++; } diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h index 7b738f6a4d7776c6994213884f1d1d33997250a8..a664c756827a9c53cada83423e184419b2318bf9 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h @@ -311,6 +311,8 @@ private: public: EncAdaptiveLoopFilter( int& apsIdStart ); virtual ~EncAdaptiveLoopFilter() {} + + template<bool alfWSSD> void initDistortion( #if ALF_IMPROVEMENT CodingStructure& cs