diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp index b9a06236b22e20bd939217052dd88179e3ebfd3d..98241b6c9f85259786e6d32ae5f39d2977f9473c 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp @@ -660,7 +660,7 @@ void AdaptiveLoopFilter::reconstructCoeff(AlfParam &alfParam, const ChannelType } for( int classIdx = 0; classIdx < numClasses; classIdx++ ) { - int filterIdx = alfParam.filterCoeffDeltaIdx[classIdx]; + AlfBankIdx filterIdx = alfParam.filterCoeffDeltaIdx[classIdx]; CHECK(!(filterIdx >= 0 && filterIdx < alfParam.numLumaFilters), "Bad coeff delta idx in ALF"); for (int coeffIdx = 0; coeffIdx < numCoeffMinus1; ++coeffIdx) diff --git a/source/Lib/CommonLib/AlfParameters.h b/source/Lib/CommonLib/AlfParameters.h index 653da0115fd66e36948ef3eb32def7d4bbbd9ebf..32d90cb165b5fe1b12abd97ebadfd879e3fd5c3d 100644 --- a/source/Lib/CommonLib/AlfParameters.h +++ b/source/Lib/CommonLib/AlfParameters.h @@ -116,7 +116,7 @@ struct AlfParam int numAlternativesChroma; // alf_chroma_num_alts_minus_one + 1 AlfCoeff chromaCoeff[ALF_MAX_NUM_ALTERNATIVES_CHROMA][MAX_NUM_ALF_CHROMA_COEFF]; // alf_coeff_chroma[i] Pel chromaClipp[ALF_MAX_NUM_ALTERNATIVES_CHROMA][MAX_NUM_ALF_CHROMA_COEFF]; // alf_clipp_chroma[i] - short filterCoeffDeltaIdx[MAX_NUM_ALF_CLASSES]; // filter_coeff_delta[i] + AlfBankIdx filterCoeffDeltaIdx[MAX_NUM_ALF_CLASSES]; // filter_coeff_delta[i] bool alfLumaCoeffFlag[MAX_NUM_ALF_CLASSES]; // alf_luma_coeff_flag[i] int numLumaFilters; // number_of_filters_minus1 + 1 bool alfLumaCoeffDeltaFlag; // alf_luma_coeff_delta_flag diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index deb6b4ae5794657e2ee573883bb688ba32176945..0fdbc52e51767ff6e186f5a2411e0894f84b2d80 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -992,6 +992,7 @@ inline int operator-(AlfMode i, AlfMode j) { return to_underlying(i) - to_un inline bool isAlfLumaFixed(AlfMode m) { return m >= AlfMode::LUMA_FIXED0 && m < AlfMode::LUMA0; } using AlfCoeff = int16_t; +using AlfBankIdx = uint8_t; ////////////////////////////////////////////////////////////////////////// // Encoder modes to try out diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index 9edfbeb2dae0bc262daf720fd8727e8534433723..d745f22653600793c40a0e3b073b0e9f52565422 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -1597,7 +1597,7 @@ double EncAdaptiveLoopFilter::mergeFiltersAndCost( } } - memcpy( alfParam.filterCoeffDeltaIdx, m_filterIndices[numFiltersBest - 1], sizeof( short ) * MAX_NUM_ALF_CLASSES ); + memcpy(alfParam.filterCoeffDeltaIdx, m_filterIndices[numFiltersBest - 1], sizeof(AlfBankIdx) * MAX_NUM_ALF_CLASSES); coeffBitsFinal += getNonFilterCoeffRate(alfParam); return distReturn; } @@ -1785,7 +1785,7 @@ int EncAdaptiveLoopFilter::lengthUvlc(int code) double EncAdaptiveLoopFilter::deriveFilterCoeffs( AlfCovariance* cov, AlfCovariance* covMerged, int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], AlfFilterShape& alfShape, - short* filterIndices, int numFilters, double errorTabForce0Coeff[MAX_NUM_ALF_CLASSES][2], AlfParam& alfParam) + AlfBankIdx* filterIndices, int numFilters, double errorTabForce0Coeff[MAX_NUM_ALF_CLASSES][2], AlfParam& alfParam) { double error = 0.0; AlfCovariance& tmpCov = covMerged[MAX_NUM_ALF_CLASSES]; @@ -1923,7 +1923,10 @@ void EncAdaptiveLoopFilter::roundFiltCoeffCCALF(AlfCoeff* filterCoeffQuant, doub } } -void EncAdaptiveLoopFilter::mergeClasses( const AlfFilterShape& alfShape, AlfCovariance* cov, AlfCovariance* covMerged, int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], const int numClasses, short filterIndices[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES] ) +void EncAdaptiveLoopFilter::mergeClasses( + const AlfFilterShape& alfShape, AlfCovariance* cov, AlfCovariance* covMerged, + int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], const int numClasses, + AlfBankIdx filterIndices[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES]) { int tmpClip[MAX_NUM_ALF_LUMA_COEFF]; int bestMergeClip[MAX_NUM_ALF_LUMA_COEFF]; @@ -1934,7 +1937,7 @@ void EncAdaptiveLoopFilter::mergeClasses( const AlfFilterShape& alfShape, AlfCov uint8_t indexListTemp[MAX_NUM_ALF_CLASSES]; int numRemaining = numClasses; - memset( filterIndices, 0, sizeof( short ) * MAX_NUM_ALF_CLASSES * MAX_NUM_ALF_CLASSES ); + std::fill_n(filterIndices[0], MAX_NUM_ALF_CLASSES * MAX_NUM_ALF_CLASSES, 0); for( int i = 0; i < numClasses; i++ ) { diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h index 686ba4b4c0f43a9cf7bea65162ab3f37b0444d39..a9e592883b0556135df00b3d39dc8334a8a09ae0 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h @@ -249,7 +249,7 @@ private: AlfCoeff** m_filterCoeffSet; // [lumaClassIdx/chromaAltIdx][coeffIdx] int** m_filterClippSet; // [lumaClassIdx/chromaAltIdx][coeffIdx] int** m_diffFilterCoeff; - short m_filterIndices[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES]; + AlfBankIdx m_filterIndices[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES]; EnumArray<unsigned, ChannelType> m_bitsNewFilter; @@ -336,11 +336,16 @@ private: const ComponentID compID, const int yPos); void calcCovarianceCcAlf(Pel ELocal[MAX_NUM_CC_ALF_CHROMA_COEFF][1], const Pel *rec, const ptrdiff_t stride, const AlfFilterShape &shape, int vbDistance); - void mergeClasses(const AlfFilterShape& alfShape, AlfCovariance* cov, AlfCovariance* covMerged, int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], const int numClasses, short filterIndices[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES]); + void mergeClasses(const AlfFilterShape& alfShape, AlfCovariance* cov, AlfCovariance* covMerged, + int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], + const int numClasses, AlfBankIdx filterIndices[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES]); double getFilterCoeffAndCost(CodingStructure &cs, double distUnfilter, ChannelType channel, bool bReCollectStat, int shapeIdx, int &coeffBits, bool onlyFilterCost = false); - double deriveFilterCoeffs(AlfCovariance* cov, AlfCovariance* covMerged, int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], AlfFilterShape& alfShape, short* filterIndices, int numFilters, double errorTabForce0Coeff[MAX_NUM_ALF_CLASSES][2], AlfParam& alfParam); + double deriveFilterCoeffs(AlfCovariance* cov, AlfCovariance* covMerged, + int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], + AlfFilterShape& alfShape, AlfBankIdx* filterIndices, int numFilters, + double errorTabForce0Coeff[MAX_NUM_ALF_CLASSES][2], AlfParam& alfParam); int deriveFilterCoefficientsPredictionMode(AlfFilterShape& alfShape, AlfCoeff** filterSet, int** filterCoeffDiff, const int numFilters); double deriveCoeffQuant(int* filterClipp, AlfCoeff* filterCoeffQuant, const AlfCovariance& cov,