diff --git a/source/App/EncoderApp/EncAppCfg.cpp b/source/App/EncoderApp/EncAppCfg.cpp index fe4895621f66f3eb47e00d1209f8ed5b4d1a72f5..60ee1bc90d77bac2bfa534f62c3e9077086f7999 100644 --- a/source/App/EncoderApp/EncAppCfg.cpp +++ b/source/App/EncoderApp/EncAppCfg.cpp @@ -1616,7 +1616,7 @@ bool EncAppCfg::parseCfg( int argc, char* argv[] ) ("DebugCTU", m_debugCTU, -1, "If DebugBitstream is present, load frames up to this POC from this bitstream. Starting with DebugPOC-frame at CTUline containin debug CTU.") ("AlfTrueOrg", m_alfTrueOrg, true, "Using true original samples for ALF optimization when MCTF is enabled\n") ( "ALF", m_alf, true, "Adaptive Loop Filter\n" ) - ("MaxNumALFAPS", m_maxNumAlfAps, 8, "Maximum number of ALF APSs" ) + ("MaxNumALFAPS", m_maxNumAlfAps, ALF_CTB_MAX_NUM_APS, "Maximum number of ALF APSs" ) ("ConstantJointCbCrSignFlag", m_constantJointCbCrSignFlag, 0, "Constant JointCbCr sign flag" ) ("ALFStrengthLuma", m_alfStrengthLuma, 1.0, "Adaptive Loop Filter strength for luma. The parameter scales the magnitudes of the ALF filter coefficients for luma. Valid range is 0.0 <= ALFStrengthLuma <= 1.0") ("ALFAllowPredefinedFilters", m_alfAllowPredefinedFilters, true, "Allow use of predefined filters for ALF") diff --git a/source/App/EncoderApp/EncAppCfg.h b/source/App/EncoderApp/EncAppCfg.h index e3f016493cf448820eb8f774c659f381d1d384e0..5069dab0552af65c432257606a29232d4a8752d0 100644 --- a/source/App/EncoderApp/EncAppCfg.h +++ b/source/App/EncoderApp/EncAppCfg.h @@ -898,7 +898,7 @@ protected: bool m_bs2ModPOCAndType; bool m_forceDecodeBitstream1; - int m_maxNumAlfAps; + int m_maxNumAlfAps{ ALF_CTB_MAX_NUM_APS }; int m_constantJointCbCrSignFlag; bool m_alf; ///< Adaptive Loop Filter bool m_alfTrueOrg; diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp index 4e754f3e960105b9493e692f910b6a67ea49df33..d1d1604c2b3ef06f57604610f2de0b43fd01a922 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp @@ -42,7 +42,7 @@ #include <array> #include <cmath> -constexpr int AdaptiveLoopFilter::AlfNumClippingValues[]; +constexpr int AdaptiveLoopFilter::ALF_NUM_CLIP_VALS[]; AdaptiveLoopFilter::AdaptiveLoopFilter() : m_classifier( nullptr ) @@ -696,7 +696,7 @@ void AdaptiveLoopFilter::reconstructCoeff( AlfParam& alfParam, ChannelType chann for( int coeffIdx = 0; coeffIdx < numCoeffMinus1; ++coeffIdx ) { int clipIdx = alfParam.nonLinearFlag[channel] ? clipp[filterIdx * MAX_NUM_ALF_LUMA_COEFF + coeffIdx] : 0; - CHECK(!(clipIdx >= 0 && clipIdx < MaxAlfNumClippingValues), "Bad clip idx in ALF"); + CHECK(!(clipIdx >= 0 && clipIdx < MAX_ALF_NUM_CLIP_VALS), "Bad clip idx in ALF"); m_clippFinal[classIdx * MAX_NUM_ALF_LUMA_COEFF + coeffIdx] = isRdo ? clipIdx : m_alfClippingValues[channel][clipIdx]; } m_clippFinal[classIdx* MAX_NUM_ALF_LUMA_COEFF + numCoeffMinus1] = @@ -730,17 +730,18 @@ void AdaptiveLoopFilter::create( const int picWidth, const int picHeight, const m_alfVBLumaCTUHeight = m_maxCUHeight; m_alfVBChmaCTUHeight = (m_maxCUHeight >> ((m_chromaFormat == CHROMA_420) ? 1 : 0)); - static_assert( AlfNumClippingValues[CHANNEL_TYPE_LUMA] > 0, "AlfNumClippingValues[CHANNEL_TYPE_LUMA] must be at least one" ); + static_assert(ALF_NUM_CLIP_VALS[CHANNEL_TYPE_LUMA] > 0, "ALF_NUM_CLIP_VALS[CHANNEL_TYPE_LUMA] must be at least one"); m_alfClippingValues[CHANNEL_TYPE_LUMA][0] = 1 << m_inputBitDepth[CHANNEL_TYPE_LUMA]; int shiftLuma = m_inputBitDepth[CHANNEL_TYPE_LUMA] - 8; - for (int i = 1; i < AlfNumClippingValues[CHANNEL_TYPE_LUMA]; ++i) + for (int i = 1; i < ALF_NUM_CLIP_VALS[CHANNEL_TYPE_LUMA]; ++i) { m_alfClippingValues[CHANNEL_TYPE_LUMA][i] = 1 << (7 - 2 * i + shiftLuma); } - static_assert( AlfNumClippingValues[CHANNEL_TYPE_CHROMA] > 0, "AlfNumClippingValues[CHANNEL_TYPE_CHROMA] must be at least one" ); + static_assert(ALF_NUM_CLIP_VALS[CHANNEL_TYPE_CHROMA] > 0, + "ALF_NUM_CLIP_VALS[CHANNEL_TYPE_CHROMA] must be at least one"); m_alfClippingValues[CHANNEL_TYPE_CHROMA][0] = 1 << m_inputBitDepth[CHANNEL_TYPE_CHROMA]; int shiftChroma = m_inputBitDepth[CHANNEL_TYPE_CHROMA] - 8; - for (int i = 1; i < AlfNumClippingValues[CHANNEL_TYPE_CHROMA]; ++i) + for (int i = 1; i < ALF_NUM_CLIP_VALS[CHANNEL_TYPE_CHROMA]; ++i) { m_alfClippingValues[CHANNEL_TYPE_CHROMA][i] = 1 << (7 - 2 * i + shiftChroma); } diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.h b/source/Lib/CommonLib/AdaptiveLoopFilter.h index 154130867581871740252cb9c4b22774e74369c8..7b522b896989c95a25b2fc55e4619e969f7975b9 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.h +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.h @@ -72,13 +72,11 @@ public: return Clip3<Pel>(-clip, +clip, val0-ref) + Clip3<Pel>(-clip, +clip, val1-ref); } - static constexpr int AlfNumClippingValues[MAX_NUM_CHANNEL_TYPE] = { 4, 4 }; - static constexpr int MaxAlfNumClippingValues = 4; + static constexpr int ALF_NUM_CLIP_VALS[MAX_NUM_CHANNEL_TYPE] = { 4, 4 }; + static constexpr int MAX_ALF_NUM_CLIP_VALS = 4; static constexpr int m_NUM_BITS = 8; - static constexpr int m_CLASSIFICATION_BLK_SIZE = 32; //non-normative, local buffer size - static constexpr int m_ALF_UNUSED_CLASSIDX = 255; - static constexpr int m_ALF_UNUSED_TRANSPOSIDX = 255; + static constexpr int m_CLASSIFICATION_BLK_SIZE = 32; // non-normative, local buffer size AdaptiveLoopFilter(); virtual ~AdaptiveLoopFilter() {} @@ -143,7 +141,7 @@ protected: bool m_created = false; short m_chromaCoeffFinal[MAX_NUM_ALF_ALTERNATIVES_CHROMA][MAX_NUM_ALF_CHROMA_COEFF]; AlfParam* m_alfParamChroma; - Pel m_alfClippingValues[MAX_NUM_CHANNEL_TYPE][MaxAlfNumClippingValues]; + Pel m_alfClippingValues[MAX_NUM_CHANNEL_TYPE][MAX_ALF_NUM_CLIP_VALS]; std::vector<AlfFilterShape> m_filterShapesCcAlf[2]; std::vector<AlfFilterShape> m_filterShapes[MAX_NUM_CHANNEL_TYPE]; AlfClassifier** m_classifier; diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index b1516d707f144181ecd533aed26b29df25410122..5f3a05a0f094336af8720afbbc5c0896f19d3662 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -1397,10 +1397,10 @@ double EncAdaptiveLoopFilter::getFilterCoeffAndCost(CodingStructure &cs, double if( isLuma( channel ) ) { std::fill_n(m_alfClipMerged[shapeIdx][0][0], MAX_NUM_ALF_LUMA_COEFF * MAX_NUM_ALF_CLASSES * MAX_NUM_ALF_CLASSES, - m_alfParamTemp.nonLinearFlag[channel] ? AlfNumClippingValues[CHANNEL_TYPE_LUMA] / 2 : 0); + m_alfParamTemp.nonLinearFlag[channel] ? ALF_NUM_CLIP_VALS[CHANNEL_TYPE_LUMA] / 2 : 0); // Reset Merge Tmp Cov - m_alfCovarianceMerged[shapeIdx][MAX_NUM_ALF_CLASSES].reset(AlfNumClippingValues[channel]); - m_alfCovarianceMerged[shapeIdx][MAX_NUM_ALF_CLASSES + 1].reset(AlfNumClippingValues[channel]); + m_alfCovarianceMerged[shapeIdx][MAX_NUM_ALF_CLASSES].reset(ALF_NUM_CLIP_VALS[channel]); + m_alfCovarianceMerged[shapeIdx][MAX_NUM_ALF_CLASSES + 1].reset(ALF_NUM_CLIP_VALS[channel]); //distortion dist += mergeFiltersAndCost(m_alfParamTemp, alfFilterShape, m_alfCovarianceFrame[channel][shapeIdx], m_alfCovarianceMerged[shapeIdx], m_alfClipMerged[shapeIdx], coeffBits); @@ -1425,7 +1425,8 @@ double EncAdaptiveLoopFilter::getFilterCoeffAndCost(CodingStructure &cs, double continue; } - std::fill_n(m_filterClippSet[altIdx], MAX_NUM_ALF_CHROMA_COEFF, nonLinearFlag ? AlfNumClippingValues[CHANNEL_TYPE_CHROMA] / 2 : 0 ); + std::fill_n(m_filterClippSet[altIdx], MAX_NUM_ALF_CHROMA_COEFF, + nonLinearFlag ? ALF_NUM_CLIP_VALS[CHANNEL_TYPE_CHROMA] / 2 : 0); double dist = m_alfCovarianceFrame[channel][shapeIdx][altIdx].pixAcc + deriveCoeffQuant(m_filterClippSet[altIdx], m_filterCoeffSet[altIdx], m_alfCovarianceFrame[channel][shapeIdx][altIdx], alfFilterShape, m_NUM_BITS, @@ -1946,19 +1947,20 @@ void EncAdaptiveLoopFilter::mergeClasses( const AlfFilterShape& alfShape, AlfCov indexList[i] = i; availableClass[i] = true; covMerged[i] = cov[i]; - covMerged[i].numBins = m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[COMPONENT_Y] : 1; + covMerged[i].numBins = m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? ALF_NUM_CLIP_VALS[COMPONENT_Y] : 1; } // Try merging different covariance matrices // temporal AlfCovariance structure is allocated as the last element in covMerged array, the size of covMerged is MAX_NUM_ALF_CLASSES + 1 AlfCovariance& tmpCov = covMerged[MAX_NUM_ALF_CLASSES]; - tmpCov.numBins = m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[COMPONENT_Y] : 1; + tmpCov.numBins = m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? ALF_NUM_CLIP_VALS[COMPONENT_Y] : 1; // init Clip for( int i = 0; i < numClasses; i++ ) { - std::fill_n(clipMerged[numRemaining-1][i], MAX_NUM_ALF_LUMA_COEFF, m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[CHANNEL_TYPE_LUMA] / 2 : 0); + std::fill_n(clipMerged[numRemaining - 1][i], MAX_NUM_ALF_LUMA_COEFF, + m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? ALF_NUM_CLIP_VALS[CHANNEL_TYPE_LUMA] / 2 : 0); if ( m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ) { err[i] = covMerged[i].optimizeFilterClip( alfShape, clipMerged[numRemaining-1][i] ); @@ -2067,7 +2069,7 @@ void EncAdaptiveLoopFilter::getFrameStats(ChannelType channel, int shapeIdx) { for( int i = 0; i < numClasses; i++ ) { - m_alfCovarianceFrame[channel][shapeIdx][isLuma(channel) ? i : altIdx].reset(AlfNumClippingValues[channel]); + m_alfCovarianceFrame[channel][shapeIdx][isLuma(channel) ? i : altIdx].reset(ALF_NUM_CLIP_VALS[channel]); } if( isLuma( channel ) ) { @@ -2119,7 +2121,7 @@ void EncAdaptiveLoopFilter::deriveStatsForFiltering( PelUnitBuf& orgYuv, PelUnit { for( int ctuIdx = 0; ctuIdx < m_numCTUsInPic; ctuIdx++ ) { - m_alfCovariance[compIdx][shape][ctuIdx][classIdx].reset(AlfNumClippingValues[toChannelType( compID )]); + m_alfCovariance[compIdx][shape][ctuIdx][classIdx].reset(ALF_NUM_CLIP_VALS[toChannelType(compID)]); } } } @@ -2140,7 +2142,7 @@ void EncAdaptiveLoopFilter::deriveStatsForFiltering( PelUnitBuf& orgYuv, PelUnit for (int classIdx = 0; classIdx < numClasses; classIdx++) { m_alfCovarianceFrame[channelIdx][shape][isLuma(channelID) ? classIdx : altIdx].reset( - AlfNumClippingValues[channelID]); + ALF_NUM_CLIP_VALS[channelID]); } } } @@ -2281,11 +2283,9 @@ void EncAdaptiveLoopFilter::deriveStatsForFiltering( PelUnitBuf& orgYuv, PelUnit void EncAdaptiveLoopFilter::getBlkStats(AlfCovariance* alfCovariance, const AlfFilterShape& shape, AlfClassifier** classifier, Pel* org, const int orgStride, Pel* rec, const int recStride, const CompArea& areaDst, const CompArea& area, const ChannelType channel, int vbCTUHeight, int vbPos) { - Pel ELocal[MAX_NUM_ALF_LUMA_COEFF][MaxAlfNumClippingValues]; + Pel ELocal[MAX_NUM_ALF_LUMA_COEFF][MAX_ALF_NUM_CLIP_VALS]; - const int numBins = AlfNumClippingValues[channel]; - int transposeIdx = 0; - int classIdx = 0; + const int numBins = ALF_NUM_CLIP_VALS[channel]; const double strength = isLuma(channel) ? m_encCfg->getALFStrengthTargetLuma() : m_encCfg->getALFStrengthTargetChroma(); @@ -2293,14 +2293,13 @@ void EncAdaptiveLoopFilter::getBlkStats(AlfCovariance* alfCovariance, const AlfF for( int i = 0; i < area.height; i++ ) { - int vbDistance = ((areaDst.y + i) % vbCTUHeight) - vbPos; + const int vbDistance = ((areaDst.y + i) % vbCTUHeight) - vbPos; for( int j = 0; j < area.width; j++ ) { - if( classifier && classifier[areaDst.y + i][areaDst.x + j].classIdx == m_ALF_UNUSED_CLASSIDX && classifier[areaDst.y + i][areaDst.x + j].transposeIdx == m_ALF_UNUSED_TRANSPOSIDX ) - { - continue; - } - std::memset( ELocal, 0, sizeof( ELocal ) ); + std::fill_n(ELocal[0], MAX_NUM_ALF_LUMA_COEFF * MAX_ALF_NUM_CLIP_VALS, 0); + + int transposeIdx = 0; + int classIdx = 0; if( classifier ) { AlfClassifier& cl = classifier[areaDst.y + i][areaDst.x + j]; @@ -2313,7 +2312,7 @@ void EncAdaptiveLoopFilter::getBlkStats(AlfCovariance* alfCovariance, const AlfF const double weight = m_alfWSSD ? m_lumaLevelToWeightPLUT[org[j]] : 1.0; const double yLocal = org[j] - rec[j]; - double e[MaxAlfNumClippingValues][MAX_NUM_ALF_LUMA_COEFF]; + double e[MAX_ALF_NUM_CLIP_VALS][MAX_NUM_ALF_LUMA_COEFF]; for (int b = 0; b < numBins; b++) { @@ -2345,8 +2344,8 @@ void EncAdaptiveLoopFilter::getBlkStats(AlfCovariance* alfCovariance, const AlfF rec += recStride; } - int numClasses = classifier ? MAX_NUM_ALF_CLASSES : 1; - for( classIdx = 0; classIdx < numClasses; classIdx++ ) + const int numClasses = classifier ? MAX_NUM_ALF_CLASSES : 1; + for (int classIdx = 0; classIdx < numClasses; classIdx++) { for (int k = 1; k < shape.numCoeff; k++) { @@ -2364,7 +2363,9 @@ void EncAdaptiveLoopFilter::getBlkStats(AlfCovariance* alfCovariance, const AlfF } } -void EncAdaptiveLoopFilter::calcCovariance(Pel ELocal[MAX_NUM_ALF_LUMA_COEFF][MaxAlfNumClippingValues], const Pel *rec, const int stride, const AlfFilterShape& shape, const int transposeIdx, const ChannelType channel, int vbDistance) +void EncAdaptiveLoopFilter::calcCovariance(Pel ELocal[MAX_NUM_ALF_LUMA_COEFF][MAX_ALF_NUM_CLIP_VALS], const Pel *rec, + const int stride, const AlfFilterShape &shape, const int transposeIdx, + const ChannelType channel, int vbDistance) { int clipTopRow = -4; int clipBotRow = 4; @@ -2381,7 +2382,8 @@ void EncAdaptiveLoopFilter::calcCovariance(Pel ELocal[MAX_NUM_ALF_LUMA_COEFF][Ma const int *filterPattern = shape.pattern.data(); const int halfFilterLength = shape.filterLength >> 1; const Pel* clip = m_alfClippingValues[channel]; - const int numBins = AlfNumClippingValues[channel]; + + const int numBins = ALF_NUM_CLIP_VALS[channel]; int k = 0; diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h index 98403fe42ea37dc8aa63720deebdb5b7ced06386..9144a8c9e9f29d06287420dfd428141c8b57c80a 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h @@ -46,11 +46,11 @@ struct AlfCovariance { - static constexpr int MaxAlfNumClippingValues = AdaptiveLoopFilter::MaxAlfNumClippingValues; + static constexpr int MAX_ALF_NUM_CLIP_VALS = AdaptiveLoopFilter::MAX_ALF_NUM_CLIP_VALS; using TE = double[MAX_NUM_ALF_LUMA_COEFF][MAX_NUM_ALF_LUMA_COEFF]; using Ty = double[MAX_NUM_ALF_LUMA_COEFF]; - using TKE = TE[AdaptiveLoopFilter::MaxAlfNumClippingValues][AdaptiveLoopFilter::MaxAlfNumClippingValues]; - using TKy = Ty[AdaptiveLoopFilter::MaxAlfNumClippingValues]; + using TKE = TE[AdaptiveLoopFilter::MAX_ALF_NUM_CLIP_VALS][AdaptiveLoopFilter::MAX_ALF_NUM_CLIP_VALS]; + using TKy = Ty[AdaptiveLoopFilter::MAX_ALF_NUM_CLIP_VALS]; int numCoeff; int numBins; @@ -61,10 +61,10 @@ struct AlfCovariance AlfCovariance() {} ~AlfCovariance() {} - void create( int size, int num_bins = MaxAlfNumClippingValues ) + void create(int size, int _numBins = MAX_ALF_NUM_CLIP_VALS) { numCoeff = size; - numBins = num_bins; + numBins = _numBins; std::memset( y, 0, sizeof( y ) ); std::memset( E, 0, sizeof( E ) ); } @@ -73,10 +73,12 @@ struct AlfCovariance { } - void reset( int num_bins = -1 ) + void reset(int _numBins = -1) { - if ( num_bins > 0 ) - numBins = num_bins; + if (_numBins > 0) + { + numBins = _numBins; + } pixAcc = 0; std::memset( y, 0, sizeof( y ) ); std::memset( E, 0, sizeof( E ) ); @@ -317,7 +319,8 @@ private: void getFrameStat( AlfCovariance* frameCov, AlfCovariance** ctbCov, uint8_t* ctbEnableFlags, uint8_t* ctbAltIdx, const int numClasses, int altIdx ); void deriveStatsForFiltering( PelUnitBuf& orgYuv, PelUnitBuf& recYuv, CodingStructure& cs ); void getBlkStats(AlfCovariance* alfCovariace, const AlfFilterShape& shape, AlfClassifier** classifier, Pel* org, const int orgStride, Pel* rec, const int recStride, const CompArea& areaDst, const CompArea& area, const ChannelType channel, int vbCTUHeight, int vbPos); - void calcCovariance(Pel ELocal[MAX_NUM_ALF_LUMA_COEFF][MaxAlfNumClippingValues], const Pel *rec, const int stride, const AlfFilterShape& shape, const int transposeIdx, const ChannelType channel, int vbDistance); + void calcCovariance(Pel ELocal[MAX_NUM_ALF_LUMA_COEFF][MAX_ALF_NUM_CLIP_VALS], const Pel *rec, const int stride, + const AlfFilterShape &shape, const int transposeIdx, const ChannelType channel, int vbDistance); void deriveStatsForCcAlfFiltering(const PelUnitBuf &orgYuv, const PelUnitBuf &recYuv, const int compIdx, const int maskStride, const uint8_t filterIdc, CodingStructure &cs); void getBlkStatsCcAlf(AlfCovariance &alfCovariance, const AlfFilterShape &shape, const PelUnitBuf &orgYuv, diff --git a/source/Lib/EncoderLib/EncCfg.h b/source/Lib/EncoderLib/EncCfg.h index cdb346027f5af142a870bb3a6de0efc0ecc908d0..f07e33be1e9fc24e7b73cb07b2863cc0ed533911 100644 --- a/source/Lib/EncoderLib/EncCfg.h +++ b/source/Lib/EncoderLib/EncCfg.h @@ -943,7 +943,7 @@ protected: EncCfgParam::CfgVPSParameters m_cfgVPSParameters; - int m_maxNumAlfAps; + int m_maxNumAlfAps{ ALF_CTB_MAX_NUM_APS }; bool m_constantJointCbCrSignFlag; bool m_alf; ///< Adaptive Loop Filter bool m_alfTrueOrg;