diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp index 95004da3fa7aefed20d4016c0442a62ddd894eba..a93e91fc5f1fe2c4f2a15caed09f0dee4e9afcf3 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.cpp +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.cpp @@ -362,7 +362,7 @@ void AdaptiveLoopFilter::reconstructCoeffAPSs(CodingStructure& cs, bool luma, bo { //luma APS** aps = cs.slice->getAlfAPSs(); - AlfSliceParam alfSliceParamTmp; + AlfParam alfParamTmp; APS* curAPS; if (luma) { @@ -371,8 +371,8 @@ void AdaptiveLoopFilter::reconstructCoeffAPSs(CodingStructure& cs, bool luma, bo int apsIdx = cs.slice->getTileGroupApsIdLuma()[i]; curAPS = aps[apsIdx]; CHECK(curAPS == NULL, "invalid APS"); - alfSliceParamTmp = curAPS->getAlfAPSParam(); - reconstructCoeff(alfSliceParamTmp, CHANNEL_TYPE_LUMA, isRdo, true); + alfParamTmp = curAPS->getAlfAPSParam(); + reconstructCoeff(alfParamTmp, CHANNEL_TYPE_LUMA, isRdo, true); memcpy(m_coeffApsLuma[i], m_coeffFinal, sizeof(m_coeffFinal)); memcpy(m_clippApsLuma[i], m_clippFinal, sizeof(m_clippFinal)); } @@ -383,24 +383,24 @@ void AdaptiveLoopFilter::reconstructCoeffAPSs(CodingStructure& cs, bool luma, bo { int apsIdxChroma = cs.slice->getTileGroupApsIdChroma(); curAPS = aps[apsIdxChroma]; - alfSliceParamTmp = curAPS->getAlfAPSParam(); - reconstructCoeff(alfSliceParamTmp, CHANNEL_TYPE_CHROMA, isRdo, true); + alfParamTmp = curAPS->getAlfAPSParam(); + reconstructCoeff(alfParamTmp, CHANNEL_TYPE_CHROMA, isRdo, true); } } -void AdaptiveLoopFilter::reconstructCoeff( AlfSliceParam& alfSliceParam, ChannelType channel, const bool isRdo, const bool isRedo ) +void AdaptiveLoopFilter::reconstructCoeff( AlfParam& alfParam, ChannelType channel, const bool isRdo, const bool isRedo ) { int factor = isRdo ? 0 : (1 << (m_NUM_BITS - 1)); AlfFilterType filterType = isLuma( channel ) ? ALF_FILTER_7 : ALF_FILTER_5; int numClasses = isLuma( channel ) ? MAX_NUM_ALF_CLASSES : 1; int numCoeff = filterType == ALF_FILTER_5 ? 7 : 13; int numCoeffMinus1 = numCoeff - 1; - int numFilters = isLuma( channel ) ? alfSliceParam.numLumaFilters : 1; - short* coeff = isLuma( channel ) ? alfSliceParam.lumaCoeff : alfSliceParam.chromaCoeff; - short* clipp = isLuma( channel ) ? alfSliceParam.lumaClipp : alfSliceParam.chromaClipp; + int numFilters = isLuma( channel ) ? alfParam.numLumaFilters : 1; + short* coeff = isLuma( channel ) ? alfParam.lumaCoeff : alfParam.chromaCoeff; + short* clipp = isLuma( channel ) ? alfParam.lumaClipp : alfParam.chromaClipp; #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - if( alfSliceParam.alfLumaCoeffDeltaPredictionFlag && isLuma( channel ) ) + if( alfParam.alfLumaCoeffDeltaPredictionFlag && isLuma( channel ) ) { for( int i = 1; i < numFilters; i++ ) { @@ -421,8 +421,8 @@ void AdaptiveLoopFilter::reconstructCoeff( AlfSliceParam& alfSliceParam, Channel { for( int coeffIdx = 0; coeffIdx < numCoeffMinus1; ++coeffIdx ) { - m_chromaCoeffFinal[coeffIdx] = alfSliceParam.chromaCoeff[coeffIdx]; - int clipIdx = alfSliceParam.nonLinearFlag[channel] ? clipp[coeffIdx] : 0; + m_chromaCoeffFinal[coeffIdx] = alfParam.chromaCoeff[coeffIdx]; + int clipIdx = alfParam.nonLinearFlag[channel] ? clipp[coeffIdx] : 0; m_chromaClippFinal[coeffIdx] = isRdo ? clipIdx : m_alfClippingValues[channel][clipIdx]; } m_chromaCoeffFinal[numCoeffMinus1] = factor; @@ -433,10 +433,10 @@ void AdaptiveLoopFilter::reconstructCoeff( AlfSliceParam& alfSliceParam, Channel for( int classIdx = 0; classIdx < numClasses; classIdx++ ) { - int filterIdx = alfSliceParam.filterCoeffDeltaIdx[classIdx]; + int filterIdx = alfParam.filterCoeffDeltaIdx[classIdx]; #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - int fixedFilterIdx = alfSliceParam.fixedFilterSetIndex; - if (fixedFilterIdx > 0 && alfSliceParam.fixedFilterIdx[classIdx] > 0) + int fixedFilterIdx = alfParam.fixedFilterSetIndex; + if (fixedFilterIdx > 0 && alfParam.fixedFilterIdx[classIdx] > 0) { fixedFilterIdx = m_classToFilterMapping[fixedFilterIdx - 1][classIdx]; } @@ -460,13 +460,13 @@ void AdaptiveLoopFilter::reconstructCoeff( AlfSliceParam& alfSliceParam, Channel m_clippFinal[classIdx* MAX_NUM_ALF_LUMA_COEFF + numCoeffMinus1] = isRdo ? 0 : m_alfClippingValues[channel][0]; for( int coeffIdx = 0; coeffIdx < numCoeffMinus1; ++coeffIdx ) { - int clipIdx = alfSliceParam.nonLinearFlag[channel] ? (clipp + filterIdx * MAX_NUM_ALF_LUMA_COEFF)[coeffIdx] : 0; + int clipIdx = alfParam.nonLinearFlag[channel] ? (clipp + filterIdx * MAX_NUM_ALF_LUMA_COEFF)[coeffIdx] : 0; (m_clippFinal + classIdx * MAX_NUM_ALF_LUMA_COEFF)[coeffIdx] = isRdo ? clipIdx : m_alfClippingValues[channel][clipIdx]; } } #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - if(isRedo && alfSliceParam.alfLumaCoeffDeltaPredictionFlag ) + if(isRedo && alfParam.alfLumaCoeffDeltaPredictionFlag ) { for( int i = numFilters - 1; i > 0; i-- ) { diff --git a/source/Lib/CommonLib/AdaptiveLoopFilter.h b/source/Lib/CommonLib/AdaptiveLoopFilter.h index 16c0a9e0bcb7c9fc65005e79d430c60d2c335dc3..19bd8ca25fdd7c0d46d7aa4b32e83598255ca9e4 100644 --- a/source/Lib/CommonLib/AdaptiveLoopFilter.h +++ b/source/Lib/CommonLib/AdaptiveLoopFilter.h @@ -83,7 +83,7 @@ public: AdaptiveLoopFilter(); virtual ~AdaptiveLoopFilter() {} void reconstructCoeffAPSs(CodingStructure& cs, bool luma, bool chroma, bool isRdo); - void reconstructCoeff(AlfSliceParam& alfSliceParam, ChannelType channel, const bool isRdo, const bool isRedo = false); + void reconstructCoeff(AlfParam& alfParam, ChannelType channel, const bool isRdo, const bool isRedo = false); void ALFProcess(CodingStructure& cs); void create( const int picWidth, const int picHeight, const ChromaFormat format, const int maxCUWidth, const int maxCUHeight, const int maxCUDepth, const int inputBitDepth[MAX_NUM_CHANNEL_TYPE] ); void destroy(); diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 19d77128a931869d30df3c57696e21ac7a0f6d3d..a136798f31cb0828c6a6facc1955dadd9ee3a88f 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -1379,7 +1379,7 @@ class APS private: int m_APSId; // adaptation_parameter_set_id int m_APSType; // aps_params_type - AlfSliceParam m_alfAPSParam; + AlfParam m_alfAPSParam; SliceReshapeInfo m_reshapeAPSInfo; public: @@ -1392,10 +1392,10 @@ public: int getAPSType() const { return m_APSType; } void setAPSType(int type) { m_APSType = type; } - void setAlfAPSParam(AlfSliceParam& alfAPSParam) { m_alfAPSParam = alfAPSParam; } + void setAlfAPSParam(AlfParam& alfAPSParam) { m_alfAPSParam = alfAPSParam; } void setTemporalId(int i) { m_alfAPSParam.tLayer = i; } int getTemporalId() { return m_alfAPSParam.tLayer; } - AlfSliceParam& getAlfAPSParam() { return m_alfAPSParam; } + AlfParam& getAlfAPSParam() { return m_alfAPSParam; } void setReshaperAPSInfo(SliceReshapeInfo& reshapeAPSInfo) { m_reshapeAPSInfo = reshapeAPSInfo; } SliceReshapeInfo& getReshaperAPSInfo() { return m_reshapeAPSInfo; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 5cbc8d6a413b0a7bc4b86707191964ba206a6d1c..26398d7a6e4638fe6f5a87fec7b915e7641c9a81 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -1506,7 +1506,7 @@ struct AlfFilterShape #endif }; -struct AlfSliceParam +struct AlfParam { bool enabledFlag[MAX_NUM_COMPONENT]; // alf_slice_enable_flag, alf_chroma_idc bool nonLinearFlag[MAX_NUM_CHANNEL_TYPE]; // alf_nonlinear_enable_flag[Luma/Chroma] @@ -1530,7 +1530,7 @@ struct AlfSliceParam int fixedFilterSetIndex; #endif - AlfSliceParam() + AlfParam() { reset(); } @@ -1559,7 +1559,7 @@ struct AlfSliceParam #endif } - const AlfSliceParam& operator = ( const AlfSliceParam& src ) + const AlfParam& operator = ( const AlfParam& src ) { std::memcpy( enabledFlag, src.enabledFlag, sizeof( enabledFlag ) ); std::memcpy( nonLinearFlag, src.nonLinearFlag, sizeof( nonLinearFlag ) ); diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 1a8ecc240ce99ccff93803610af269b32335afc3..a4061656505593a644e4d5bafe1af69895881b91 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -798,7 +798,7 @@ void HLSyntaxReader::parseAlfAps( APS* aps ) { uint32_t code; - AlfSliceParam param = aps->getAlfAPSParam(); + AlfParam param = aps->getAlfAPSParam(); param.enabledFlag[COMPONENT_Y] = param.enabledFlag[COMPONENT_Cb] = param.enabledFlag[COMPONENT_Cr] = true; READ_FLAG(code, "alf_luma_new_filter"); param.newFilterFlag[CHANNEL_TYPE_LUMA] = code; @@ -2634,33 +2634,33 @@ int HLSyntaxReader::alfGolombDecode( const int k, const bool signed_val ) return nr; } -void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChroma ) +void HLSyntaxReader::alfFilter( AlfParam& alfParam, const bool isChroma ) { uint32_t code; if( !isChroma ) { READ_FLAG( code, "alf_luma_coeff_delta_flag" ); - alfSliceParam.alfLumaCoeffDeltaFlag = code; + alfParam.alfLumaCoeffDeltaFlag = code; - if( !alfSliceParam.alfLumaCoeffDeltaFlag ) + if( !alfParam.alfLumaCoeffDeltaFlag ) { - std::memset( alfSliceParam.alfLumaCoeffFlag, true, sizeof( alfSliceParam.alfLumaCoeffFlag ) ); + std::memset( alfParam.alfLumaCoeffFlag, true, sizeof( alfParam.alfLumaCoeffFlag ) ); #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - if( alfSliceParam.numLumaFilters > 1 ) + if( alfParam.numLumaFilters > 1 ) { READ_FLAG( code, "alf_luma_coeff_delta_prediction_flag" ); - alfSliceParam.alfLumaCoeffDeltaPredictionFlag = code; + alfParam.alfLumaCoeffDeltaPredictionFlag = code; } else { - alfSliceParam.alfLumaCoeffDeltaPredictionFlag = 0; + alfParam.alfLumaCoeffDeltaPredictionFlag = 0; } #endif } #if !JVET_O0669_REMOVE_ALF_COEFF_PRED else { - alfSliceParam.alfLumaCoeffDeltaPredictionFlag = 0; + alfParam.alfLumaCoeffDeltaPredictionFlag = 0; } #endif } @@ -2677,9 +2677,9 @@ void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChrom int kMin = code + 1; static int kMinTab[MAX_NUM_ALF_COEFF]; #endif - const int numFilters = isChroma ? 1 : alfSliceParam.numLumaFilters; - short* coeff = isChroma ? alfSliceParam.chromaCoeff : alfSliceParam.lumaCoeff; - short* clipp = isChroma ? alfSliceParam.chromaClipp : alfSliceParam.lumaClipp; + const int numFilters = isChroma ? 1 : alfParam.numLumaFilters; + short* coeff = isChroma ? alfParam.chromaCoeff : alfParam.lumaCoeff; + short* clipp = isChroma ? alfParam.chromaClipp : alfParam.lumaClipp; #if !JVET_O0216_ALF_COEFF_EG3 for( int idx = 0; idx < maxGolombIdx; idx++ ) { @@ -2691,12 +2691,12 @@ void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChrom #endif if( !isChroma ) { - if( alfSliceParam.alfLumaCoeffDeltaFlag ) + if( alfParam.alfLumaCoeffDeltaFlag ) { - for( int ind = 0; ind < alfSliceParam.numLumaFilters; ++ind ) + for( int ind = 0; ind < alfParam.numLumaFilters; ++ind ) { READ_FLAG( code, "alf_luma_coeff_flag[i]" ); - alfSliceParam.alfLumaCoeffFlag[ind] = code; + alfParam.alfLumaCoeffFlag[ind] = code; } } } @@ -2704,7 +2704,7 @@ void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChrom // Filter coefficients for( int ind = 0; ind < numFilters; ++ind ) { - if( !isChroma && !alfSliceParam.alfLumaCoeffFlag[ind] && alfSliceParam.alfLumaCoeffDeltaFlag ) + if( !isChroma && !alfParam.alfLumaCoeffFlag[ind] && alfParam.alfLumaCoeffDeltaFlag ) { memset( coeff + ind * MAX_NUM_ALF_LUMA_COEFF, 0, sizeof( *coeff ) * alfShape.numCoeff ); continue; @@ -2721,7 +2721,7 @@ void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChrom } // Clipping values coding - if ( alfSliceParam.nonLinearFlag[isChroma] ) + if ( alfParam.nonLinearFlag[isChroma] ) { #if !JVET_O0064_SIMP_ALF_CLIP_CODING READ_UVLC( code, "clip_min_golomb_order" ); @@ -2745,7 +2745,7 @@ void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChrom { memcpy( recCoeff, coeff, sizeof(short) * numFilters * MAX_NUM_ALF_LUMA_COEFF ); #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - if( alfSliceParam.alfLumaCoeffDeltaPredictionFlag ) + if( alfParam.alfLumaCoeffDeltaPredictionFlag ) { for( int i = 1; i < numFilters; i++ ) { @@ -2763,7 +2763,7 @@ void HLSyntaxReader::alfFilter( AlfSliceParam& alfSliceParam, const bool isChrom for( int ind = 0; ind < numFilters; ++ind ) { #if !JVET_O0064_SIMP_ALF_CLIP_CODING - if( !isChroma && !alfSliceParam.alfLumaCoeffFlag[ind] && alfSliceParam.alfLumaCoeffDeltaFlag ) + if( !isChroma && !alfParam.alfLumaCoeffFlag[ind] && alfParam.alfLumaCoeffDeltaFlag ) { std::fill_n( clipp + ind * MAX_NUM_ALF_LUMA_COEFF, alfShape.numCoeff, 0 ); continue; diff --git a/source/Lib/DecoderLib/VLCReader.h b/source/Lib/DecoderLib/VLCReader.h index 1ff98fa3b148294e999b6f2df491ef2328b8828e..7483c84093bd9197d51c818c01f9c72221dadd73 100644 --- a/source/Lib/DecoderLib/VLCReader.h +++ b/source/Lib/DecoderLib/VLCReader.h @@ -165,7 +165,7 @@ public: void parseScalingList ( ScalingList* scalingList ); void decodeScalingList ( ScalingList *scalingList, uint32_t sizeId, uint32_t listId); void parseReshaper ( SliceReshapeInfo& sliceReshaperInfo, const SPS* pcSPS, const bool isIntra ); - void alfFilter( AlfSliceParam& alfSliceParam, const bool isChroma ); + void alfFilter( AlfParam& alfParam, const bool isChroma ); private: int truncatedUnaryEqProb( const int maxSymbol ); diff --git a/source/Lib/EncoderLib/CABACWriter.cpp b/source/Lib/EncoderLib/CABACWriter.cpp index 636f6f0ab05e82cadd472379d5d70c8d0e5f117b..730d6d348698f9d745685a98de9b4928d9f42de5 100644 --- a/source/Lib/EncoderLib/CABACWriter.cpp +++ b/source/Lib/EncoderLib/CABACWriter.cpp @@ -3334,7 +3334,7 @@ void CABACWriter::exp_golomb_eqprob( unsigned symbol, unsigned count ) m_BinEncoder.encodeBinsEP( bins, numBins ); } -void CABACWriter::codeAlfCtuEnableFlags( CodingStructure& cs, ChannelType channel, AlfSliceParam* alfParam) +void CABACWriter::codeAlfCtuEnableFlags( CodingStructure& cs, ChannelType channel, AlfParam* alfParam) { if( isLuma( channel ) ) { @@ -3349,7 +3349,7 @@ void CABACWriter::codeAlfCtuEnableFlags( CodingStructure& cs, ChannelType channe codeAlfCtuEnableFlags( cs, COMPONENT_Cr, alfParam ); } } -void CABACWriter::codeAlfCtuEnableFlags( CodingStructure& cs, ComponentID compID, AlfSliceParam* alfParam) +void CABACWriter::codeAlfCtuEnableFlags( CodingStructure& cs, ComponentID compID, AlfParam* alfParam) { uint32_t numCTUs = cs.pcv->sizeInCtus; @@ -3359,7 +3359,7 @@ void CABACWriter::codeAlfCtuEnableFlags( CodingStructure& cs, ComponentID compID } } -void CABACWriter::codeAlfCtuEnableFlag( CodingStructure& cs, uint32_t ctuRsAddr, const int compIdx, AlfSliceParam* alfParam) +void CABACWriter::codeAlfCtuEnableFlag( CodingStructure& cs, uint32_t ctuRsAddr, const int compIdx, AlfParam* alfParam) { const bool alfComponentEnabled = (alfParam != NULL) ? alfParam->enabledFlag[compIdx] : cs.slice->getTileGroupAlfEnabledFlag((ComponentID)compIdx); diff --git a/source/Lib/EncoderLib/CABACWriter.h b/source/Lib/EncoderLib/CABACWriter.h index 46cc2b033c282c4af99f658ba6e1e8da72709bb5..ac52c33f78483456236181f99e4c5c72630bad75 100644 --- a/source/Lib/EncoderLib/CABACWriter.h +++ b/source/Lib/EncoderLib/CABACWriter.h @@ -171,9 +171,9 @@ public: // cross component prediction (clause 7.3.8.12) void cross_comp_pred ( const TransformUnit& tu, ComponentID compID ); - void codeAlfCtuEnableFlags ( CodingStructure& cs, ChannelType channel, AlfSliceParam* alfParam); - void codeAlfCtuEnableFlags ( CodingStructure& cs, ComponentID compID, AlfSliceParam* alfParam); - void codeAlfCtuEnableFlag ( CodingStructure& cs, uint32_t ctuRsAddr, const int compIdx, AlfSliceParam* alfParam ); + void codeAlfCtuEnableFlags ( CodingStructure& cs, ChannelType channel, AlfParam* alfParam); + void codeAlfCtuEnableFlags ( CodingStructure& cs, ComponentID compID, AlfParam* alfParam); + void codeAlfCtuEnableFlag ( CodingStructure& cs, uint32_t ctuRsAddr, const int compIdx, AlfParam* alfParam ); void codeAlfCtuFilterIndex(CodingStructure& cs, uint32_t ctuRsAddr, bool alfEnableLuma); private: diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index 893b55eab536c7f9dd646af49792981089859904..461a0782410add0b6dfb7a16b947cd9f44563aad 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -630,11 +630,11 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda alfAPS = nullptr; } } - AlfSliceParam alfSliceParam; - alfSliceParam.reset(); + AlfParam alfParam; + alfParam.reset(); const TempCtx ctxStart(m_CtxCache, AlfCtx(m_CABACEstimator->getCtx())); // set available filter shapes - alfSliceParam.filterShapes = m_filterShapes; + alfParam.filterShapes = m_filterShapes; // set clipping range m_clpRngs = cs.slice->getClpRngs(); @@ -646,7 +646,7 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda } // reset ALF parameters - alfSliceParam.reset(); + alfParam.reset(); int shiftLuma = 2 * DISTORTION_PRECISION_ADJUSTMENT(m_inputBitDepth[CHANNEL_TYPE_LUMA]); int shiftChroma = 2 * DISTORTION_PRECISION_ADJUSTMENT(m_inputBitDepth[CHANNEL_TYPE_CHROMA]); m_lambda[COMPONENT_Y] = lambdas[COMPONENT_Y] * double(1 << shiftLuma); @@ -724,7 +724,7 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda deriveStatsForFiltering( orgYuv, recYuv, cs ); // derive filter (luma) - alfEncoder( cs, alfSliceParam, orgYuv, recYuv, cs.getRecoBuf(), CHANNEL_TYPE_LUMA + alfEncoder( cs, alfParam, orgYuv, recYuv, cs.getRecoBuf(), CHANNEL_TYPE_LUMA #if ENABLE_QPA , lambdaChromaWeight #endif @@ -732,7 +732,7 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda // derive filter (chroma) { - alfEncoder( cs, alfSliceParam, orgYuv, recYuv, cs.getRecoBuf(), CHANNEL_TYPE_CHROMA + alfEncoder( cs, alfParam, orgYuv, recYuv, cs.getRecoBuf(), CHANNEL_TYPE_CHROMA #if ENABLE_QPA , lambdaChromaWeight #endif @@ -740,7 +740,7 @@ void EncAdaptiveLoopFilter::ALFProcess(CodingStructure& cs, const double *lambda } m_CABACEstimator->getCtx() = AlfCtx(ctxStart); - alfEncoderCtb(cs, alfSliceParam + alfEncoderCtb(cs, alfParam #if ENABLE_QPA , lambdaChromaWeight #endif @@ -763,12 +763,12 @@ double EncAdaptiveLoopFilter::deriveCtbAlfEnableFlags( CodingStructure& cs, cons double cost = 0; distUnfilter = 0; - setEnableFlag(m_alfSliceParamTemp, channel, true); + setEnableFlag(m_alfParamTemp, channel, true); #if ENABLE_QPA CHECK ((chromaWeight > 0.0) && (cs.slice->getSliceCurStartCtuTsAddr() != 0), "incompatible start CTU address, must be 0"); #endif - reconstructCoeff(m_alfSliceParamTemp, channel, true, isLuma(channel)); + reconstructCoeff(m_alfParamTemp, channel, true, isLuma(channel)); for (int classIdx = 0; classIdx < (isLuma(channel) ? MAX_NUM_ALF_CLASSES : 1); classIdx++) { for (int i = 0; i < (isLuma(channel) ? MAX_NUM_ALF_LUMA_COEFF : MAX_NUM_ALF_CHROMA_COEFF); i++) @@ -787,8 +787,8 @@ double EncAdaptiveLoopFilter::deriveCtbAlfEnableFlags( CodingStructure& cs, cons ctxTempStart = AlfCtx( m_CABACEstimator->getCtx() ); m_CABACEstimator->resetBits(); m_ctuEnableFlag[compID][ctuIdx] = 1; - m_CABACEstimator->codeAlfCtuEnableFlag( cs, ctuIdx, compID, &m_alfSliceParamTemp ); - double costOn = distUnfilterCtu + getFilteredDistortion( m_alfCovariance[compID][iShapeIdx][ctuIdx], numClasses, m_alfSliceParamTemp.numLumaFilters - 1, numCoeff ); + m_CABACEstimator->codeAlfCtuEnableFlag( cs, ctuIdx, compID, &m_alfParamTemp ); + double costOn = distUnfilterCtu + getFilteredDistortion( m_alfCovariance[compID][iShapeIdx][ctuIdx], numClasses, m_alfParamTemp.numLumaFilters - 1, numCoeff ); #if ENABLE_QPA const double ctuLambda = chromaWeight > 0.0 ? (isLuma (channel) ? cs.picture->m_uEnerHpCtu[ctuIdx] : cs.picture->m_uEnerHpCtu[ctuIdx] / chromaWeight) : m_lambda[compID]; #else @@ -800,7 +800,7 @@ double EncAdaptiveLoopFilter::deriveCtbAlfEnableFlags( CodingStructure& cs, cons m_CABACEstimator->getCtx() = AlfCtx( ctxTempStart ); m_CABACEstimator->resetBits(); m_ctuEnableFlag[compID][ctuIdx] = 0; - m_CABACEstimator->codeAlfCtuEnableFlag( cs, ctuIdx, compID, &m_alfSliceParamTemp); + m_CABACEstimator->codeAlfCtuEnableFlag( cs, ctuIdx, compID, &m_alfParamTemp); double costOff = distUnfilterCtu + ctuLambda * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); if( costOn < costOff ) @@ -820,15 +820,15 @@ double EncAdaptiveLoopFilter::deriveCtbAlfEnableFlags( CodingStructure& cs, cons if( isChroma( channel ) ) { - setEnableFlag(m_alfSliceParamTemp, channel, m_ctuEnableFlag); - const int alfChromaIdc = m_alfSliceParamTemp.enabledFlag[COMPONENT_Cb] * 2 + m_alfSliceParamTemp.enabledFlag[COMPONENT_Cr]; + setEnableFlag(m_alfParamTemp, channel, m_ctuEnableFlag); + const int alfChromaIdc = m_alfParamTemp.enabledFlag[COMPONENT_Cb] * 2 + m_alfParamTemp.enabledFlag[COMPONENT_Cr]; cost += lengthTruncatedUnary(alfChromaIdc, 3) * m_lambda[channel]; } return cost; } -void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfSliceParam, const PelUnitBuf& orgUnitBuf, const PelUnitBuf& recExtBuf, const PelUnitBuf& recBuf, const ChannelType channel +void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfParam& alfParam, const PelUnitBuf& orgUnitBuf, const PelUnitBuf& recExtBuf, const PelUnitBuf& recBuf, const ChannelType channel #if ENABLE_QPA , const double lambdaChromaWeight // = 0.0 #endif @@ -839,14 +839,14 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS double costMin = MAX_DOUBLE; - std::vector<AlfFilterShape>& alfFilterShape = alfSliceParam.filterShapes[channel]; + std::vector<AlfFilterShape>& alfFilterShape = alfParam.filterShapes[channel]; m_bitsNewFilter[channel] = 0; const int numClasses = isLuma( channel ) ? MAX_NUM_ALF_CLASSES : 1; int uiCoeffBits = 0; for( int iShapeIdx = 0; iShapeIdx < alfFilterShape.size(); iShapeIdx++ ) { - m_alfSliceParamTemp = alfSliceParam; + m_alfParamTemp = alfParam; //1. get unfiltered distortion double cost = getUnfilteredDistortion( m_alfCovarianceFrame[channel][iShapeIdx], channel ); cost /= 1.001; // slight preference for unfiltered choice @@ -854,7 +854,7 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS if( cost < costMin ) { costMin = cost; - setEnableFlag( alfSliceParam, channel, false ); + setEnableFlag( alfParam, channel, false ); // no CABAC signalling ctxBest = AlfCtx( ctxStart ); setCtuEnableFlag( m_ctuEnableFlagTmp, channel, 0 ); @@ -867,8 +867,8 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS for( int nonLinearFlag = 0; nonLinearFlag < nonLinearFlagMax; nonLinearFlag++ ) { //2. all CTUs are on - setEnableFlag( m_alfSliceParamTemp, channel, true ); - m_alfSliceParamTemp.nonLinearFlag[channel] = nonLinearFlag; + setEnableFlag( m_alfParamTemp, channel, true ); + m_alfParamTemp.nonLinearFlag[channel] = nonLinearFlag; m_CABACEstimator->getCtx() = AlfCtx( ctxStart ); setCtuEnableFlag( m_ctuEnableFlag, channel, 1 ); cost = getFilterCoeffAndCost( cs, 0, channel, nonLinearFlag != 0, iShapeIdx, uiCoeffBits ); @@ -877,7 +877,7 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS { m_bitsNewFilter[channel] = uiCoeffBits; costMin = cost; - copyAlfSliceParam( alfSliceParam, m_alfSliceParamTemp, channel ); + copyAlfParam( alfParam, m_alfParamTemp, channel ); ctxBest = AlfCtx( m_CABACEstimator->getCtx() ); setCtuEnableFlag( m_ctuEnableFlagTmp, channel, 1 ); } @@ -903,7 +903,7 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS costMin = cost; ctxBest = AlfCtx(m_CABACEstimator->getCtx()); copyCtuEnableFlag(m_ctuEnableFlagTmp, m_ctuEnableFlag, channel); - copyAlfSliceParam(alfSliceParam, m_alfSliceParamTemp, channel); + copyAlfParam(alfParam, m_alfParamTemp, channel); } } else @@ -917,19 +917,19 @@ void EncAdaptiveLoopFilter::alfEncoder( CodingStructure& cs, AlfSliceParam& alfS m_CABACEstimator->getCtx() = AlfCtx( ctxBest ); } -void EncAdaptiveLoopFilter::copyAlfSliceParam( AlfSliceParam& alfSliceParamDst, AlfSliceParam& alfSliceParamSrc, ChannelType channel ) +void EncAdaptiveLoopFilter::copyAlfParam( AlfParam& alfParamDst, AlfParam& alfParamSrc, ChannelType channel ) { if( isLuma( channel ) ) { - memcpy( &alfSliceParamDst, &alfSliceParamSrc, sizeof( AlfSliceParam ) ); + memcpy( &alfParamDst, &alfParamSrc, sizeof( AlfParam ) ); } else { - alfSliceParamDst.nonLinearFlag[channel] = alfSliceParamSrc.nonLinearFlag[channel]; - alfSliceParamDst.enabledFlag[COMPONENT_Cb] = alfSliceParamSrc.enabledFlag[COMPONENT_Cb]; - alfSliceParamDst.enabledFlag[COMPONENT_Cr] = alfSliceParamSrc.enabledFlag[COMPONENT_Cr]; - memcpy( alfSliceParamDst.chromaCoeff, alfSliceParamSrc.chromaCoeff, sizeof( alfSliceParamDst.chromaCoeff ) ); - memcpy( alfSliceParamDst.chromaClipp, alfSliceParamSrc.chromaClipp, sizeof( alfSliceParamDst.chromaClipp ) ); + alfParamDst.nonLinearFlag[channel] = alfParamSrc.nonLinearFlag[channel]; + alfParamDst.enabledFlag[COMPONENT_Cb] = alfParamSrc.enabledFlag[COMPONENT_Cb]; + alfParamDst.enabledFlag[COMPONENT_Cr] = alfParamSrc.enabledFlag[COMPONENT_Cr]; + memcpy( alfParamDst.chromaCoeff, alfParamSrc.chromaCoeff, sizeof( alfParamDst.chromaCoeff ) ); + memcpy( alfParamDst.chromaClipp, alfParamSrc.chromaClipp, sizeof( alfParamDst.chromaClipp ) ); } } double EncAdaptiveLoopFilter::getFilterCoeffAndCost( CodingStructure& cs, double distUnfilter, ChannelType channel, bool bReCollectStat, int iShapeIdx, int& uiCoeffBits, bool onlyFilterCost ) @@ -943,31 +943,31 @@ double EncAdaptiveLoopFilter::getFilterCoeffAndCost( CodingStructure& cs, double double dist = distUnfilter; uiCoeffBits = 0; int uiSliceFlag = 0; - AlfFilterShape& alfFilterShape = m_alfSliceParamTemp.filterShapes[channel][iShapeIdx]; + AlfFilterShape& alfFilterShape = m_alfParamTemp.filterShapes[channel][iShapeIdx]; //get filter coeff if( isLuma( channel ) ) { - std::fill_n(m_alfClipMerged[iShapeIdx][0][0], MAX_NUM_ALF_LUMA_COEFF*MAX_NUM_ALF_CLASSES*MAX_NUM_ALF_CLASSES, m_alfSliceParamTemp.nonLinearFlag[channel] ? AlfNumClippingValues[CHANNEL_TYPE_LUMA] / 2 : 0); + std::fill_n(m_alfClipMerged[iShapeIdx][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); // Reset Merge Tmp Cov m_alfCovarianceMerged[iShapeIdx][MAX_NUM_ALF_CLASSES].reset(AlfNumClippingValues[channel]); m_alfCovarianceMerged[iShapeIdx][MAX_NUM_ALF_CLASSES + 1].reset(AlfNumClippingValues[channel]); //distortion - dist += mergeFiltersAndCost( m_alfSliceParamTemp, alfFilterShape, m_alfCovarianceFrame[channel][iShapeIdx], m_alfCovarianceMerged[iShapeIdx], m_alfClipMerged[iShapeIdx], uiCoeffBits ); + dist += mergeFiltersAndCost( m_alfParamTemp, alfFilterShape, m_alfCovarianceFrame[channel][iShapeIdx], m_alfCovarianceMerged[iShapeIdx], m_alfClipMerged[iShapeIdx], uiCoeffBits ); } else { //distortion assert(alfFilterShape.numCoeff == m_alfCovarianceFrame[channel][iShapeIdx][0].numCoeff); - std::fill_n(m_filterClippSet[0], MAX_NUM_ALF_CHROMA_COEFF, m_alfSliceParamTemp.nonLinearFlag[channel] ? AlfNumClippingValues[CHANNEL_TYPE_CHROMA] / 2 : 0); - dist += m_alfCovarianceFrame[channel][iShapeIdx][0].pixAcc + deriveCoeffQuant( m_filterClippSet[0], m_filterCoeffSet[0], m_alfCovarianceFrame[channel][iShapeIdx][0], alfFilterShape, m_NUM_BITS, m_alfSliceParamTemp.nonLinearFlag[channel] ); - //setEnableFlag( m_alfSliceParamTemp, channel, m_ctuEnableFlag ); - const int alfChromaIdc = m_alfSliceParamTemp.enabledFlag[COMPONENT_Cb] * 2 + m_alfSliceParamTemp.enabledFlag[COMPONENT_Cr]; + std::fill_n(m_filterClippSet[0], MAX_NUM_ALF_CHROMA_COEFF, m_alfParamTemp.nonLinearFlag[channel] ? AlfNumClippingValues[CHANNEL_TYPE_CHROMA] / 2 : 0); + dist += m_alfCovarianceFrame[channel][iShapeIdx][0].pixAcc + deriveCoeffQuant( m_filterClippSet[0], m_filterCoeffSet[0], m_alfCovarianceFrame[channel][iShapeIdx][0], alfFilterShape, m_NUM_BITS, m_alfParamTemp.nonLinearFlag[channel] ); + //setEnableFlag( m_alfParamTemp, channel, m_ctuEnableFlag ); + const int alfChromaIdc = m_alfParamTemp.enabledFlag[COMPONENT_Cb] * 2 + m_alfParamTemp.enabledFlag[COMPONENT_Cr]; for( int i = 0; i < MAX_NUM_ALF_CHROMA_COEFF; i++ ) { - m_alfSliceParamTemp.chromaCoeff[i] = m_filterCoeffSet[0][i]; - m_alfSliceParamTemp.chromaClipp[i] = m_filterClippSet[0][i]; + m_alfParamTemp.chromaCoeff[i] = m_filterCoeffSet[0][i]; + m_alfParamTemp.chromaClipp[i] = m_filterClippSet[0][i]; } - uiCoeffBits += getCoeffRate( m_alfSliceParamTemp, true ); + uiCoeffBits += getCoeffRate( m_alfParamTemp, true ); uiSliceFlag = lengthTruncatedUnary(alfChromaIdc, 3); } if (onlyFilterCost) @@ -976,12 +976,12 @@ double EncAdaptiveLoopFilter::getFilterCoeffAndCost( CodingStructure& cs, double } double rate = uiCoeffBits + uiSliceFlag; m_CABACEstimator->resetBits(); - m_CABACEstimator->codeAlfCtuEnableFlags( cs, channel, &m_alfSliceParamTemp); + m_CABACEstimator->codeAlfCtuEnableFlags( cs, channel, &m_alfParamTemp); rate += FracBitsScale * (double)m_CABACEstimator->getEstFracBits(); return dist + m_lambda[channel] * rate; } -int EncAdaptiveLoopFilter::getCoeffRate( AlfSliceParam& alfSliceParam, bool isChroma ) +int EncAdaptiveLoopFilter::getCoeffRate( AlfParam& alfParam, bool isChroma ) { int iBits = 0; assert( isChroma ); @@ -995,7 +995,7 @@ int EncAdaptiveLoopFilter::getCoeffRate( AlfSliceParam& alfSliceParam, bool isCh // vlc for all for( int i = 0; i < alfShape.numCoeff - 1; i++ ) { - int coeffVal = abs( alfSliceParam.chromaCoeff[i] ); + int coeffVal = abs( alfParam.chromaCoeff[i] ); for( int k = 1; k < 15; k++ ) { @@ -1021,20 +1021,20 @@ int EncAdaptiveLoopFilter::getCoeffRate( AlfSliceParam& alfSliceParam, bool isCh for( int i = 0; i < alfShape.numCoeff - 1; i++ ) { #if JVET_O0216_ALF_COEFF_EG3 - iBits += lengthGolomb( alfSliceParam.chromaCoeff[i], 3 ); // alf_coeff_chroma[i], alf_coeff_luma_delta[i][j] + iBits += lengthGolomb( alfParam.chromaCoeff[i], 3 ); // alf_coeff_chroma[i], alf_coeff_luma_delta[i][j] #else - iBits += lengthGolomb( alfSliceParam.chromaCoeff[i], m_kMinTab[alfShape.golombIdx[i]] ); // alf_coeff_chroma[i], alf_coeff_luma_delta[i][j] + iBits += lengthGolomb( alfParam.chromaCoeff[i], m_kMinTab[alfShape.golombIdx[i]] ); // alf_coeff_chroma[i], alf_coeff_luma_delta[i][j] #endif } - if( m_alfSliceParamTemp.nonLinearFlag[isChroma] ) + if( m_alfParamTemp.nonLinearFlag[isChroma] ) { #if JVET_O0064_SIMP_ALF_CLIP_CODING for (int i = 0; i < alfShape.numCoeff - 1; i++) { - if (!abs(alfSliceParam.chromaCoeff[i])) + if (!abs(alfParam.chromaCoeff[i])) { - alfSliceParam.chromaClipp[i] = 0; + alfParam.chromaClipp[i] = 0; } } iBits += ((alfShape.numCoeff - 1) << 1); @@ -1043,9 +1043,9 @@ int EncAdaptiveLoopFilter::getCoeffRate( AlfSliceParam& alfSliceParam, bool isCh // vlc for all for( int i = 0; i < alfShape.numCoeff - 1; i++ ) { - if( !abs( alfSliceParam.chromaCoeff[i] ) ) + if( !abs( alfParam.chromaCoeff[i] ) ) continue; - int coeffVal = abs( alfSliceParam.chromaClipp[i] ); + int coeffVal = abs( alfParam.chromaClipp[i] ); for( int k = 1; k < 15; k++ ) { @@ -1077,9 +1077,9 @@ int EncAdaptiveLoopFilter::getCoeffRate( AlfSliceParam& alfSliceParam, bool isCh // Filter coefficients for( int i = 0; i < alfShape.numCoeff - 1; i++ ) { - if( !abs( alfSliceParam.chromaCoeff[i] ) ) + if( !abs( alfParam.chromaCoeff[i] ) ) continue; - iBits += lengthGolomb( alfSliceParam.chromaClipp[i], m_kMinTab[alfShape.golombIdx[i]], false ); // alf_coeff_chroma[i], alf_coeff_luma_delta[i][j] + iBits += lengthGolomb( alfParam.chromaClipp[i], m_kMinTab[alfShape.golombIdx[i]], false ); // alf_coeff_chroma[i], alf_coeff_luma_delta[i][j] } #endif } @@ -1122,7 +1122,7 @@ double EncAdaptiveLoopFilter::getFilteredDistortion( AlfCovariance* cov, const i return dist; } -double EncAdaptiveLoopFilter::mergeFiltersAndCost( AlfSliceParam& alfSliceParam, AlfFilterShape& alfShape, AlfCovariance* covFrame, AlfCovariance* covMerged, int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], int& uiCoeffBits ) +double EncAdaptiveLoopFilter::mergeFiltersAndCost( AlfParam& alfParam, AlfFilterShape& alfShape, AlfCovariance* covFrame, AlfCovariance* covMerged, int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], int& uiCoeffBits ) { int numFiltersBest = 0; int numFilters = MAX_NUM_ALF_CLASSES; @@ -1140,7 +1140,7 @@ double EncAdaptiveLoopFilter::mergeFiltersAndCost( AlfSliceParam& alfSliceParam, while( numFilters >= 1 ) { - dist = deriveFilterCoeffs(covFrame, covMerged, clipMerged, alfShape, m_filterIndices[numFilters - 1], numFilters, errorForce0CoeffTab, alfSliceParam); + dist = deriveFilterCoeffs(covFrame, covMerged, clipMerged, alfShape, m_filterIndices[numFilters - 1], numFilters, errorForce0CoeffTab, alfParam); // filter coeffs are stored in m_filterCoeffSet distForce0 = getDistForce0( alfShape, numFilters, errorForce0CoeffTab, codedVarBins ); #if JVET_O0669_REMOVE_ALF_COEFF_PRED @@ -1158,12 +1158,12 @@ double EncAdaptiveLoopFilter::mergeFiltersAndCost( AlfSliceParam& alfSliceParam, cost = cost0; } #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - if (alfSliceParam.fixedFilterSetIndex > 0) + if (alfParam.fixedFilterSetIndex > 0) { int len = 0; - len += getTBlength(alfSliceParam.fixedFilterSetIndex - 1, NUM_FIXED_FILTER_SETS); + len += getTBlength(alfParam.fixedFilterSetIndex - 1, NUM_FIXED_FILTER_SETS); len += 1; //fixed filter flag pattern - if (alfSliceParam.fixedFilterPattern > 0) + if (alfParam.fixedFilterPattern > 0) { len += MAX_NUM_ALF_CLASSES; //"fixed_filter_flag" for each class } @@ -1182,7 +1182,7 @@ double EncAdaptiveLoopFilter::mergeFiltersAndCost( AlfSliceParam& alfSliceParam, numFilters--; } - dist = deriveFilterCoeffs( covFrame, covMerged, clipMerged, alfShape, m_filterIndices[numFiltersBest - 1], numFiltersBest, errorForce0CoeffTab, alfSliceParam ); + dist = deriveFilterCoeffs( covFrame, covMerged, clipMerged, alfShape, m_filterIndices[numFiltersBest - 1], numFiltersBest, errorForce0CoeffTab, alfParam ); #if JVET_O0669_REMOVE_ALF_COEFF_PRED coeffBits = deriveFilterCoefficientsPredictionMode( alfShape, m_filterCoeffSet, m_diffFilterCoeff, numFiltersBest ); #else @@ -1194,25 +1194,25 @@ double EncAdaptiveLoopFilter::mergeFiltersAndCost( AlfSliceParam& alfSliceParam, cost = dist + m_lambda[COMPONENT_Y] * coeffBits; cost0 = distForce0 + m_lambda[COMPONENT_Y] * coeffBitsForce0; - alfSliceParam.numLumaFilters = numFiltersBest; + alfParam.numLumaFilters = numFiltersBest; double distReturn; if (cost <= cost0) { distReturn = dist; - alfSliceParam.alfLumaCoeffDeltaFlag = 0; + alfParam.alfLumaCoeffDeltaFlag = 0; uiCoeffBits = coeffBits; #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - alfSliceParam.alfLumaCoeffDeltaPredictionFlag = bestPredMode; + alfParam.alfLumaCoeffDeltaPredictionFlag = bestPredMode; #endif } else { distReturn = distForce0; - alfSliceParam.alfLumaCoeffDeltaFlag = 1; + alfParam.alfLumaCoeffDeltaFlag = 1; uiCoeffBits = coeffBitsForce0; - memcpy( alfSliceParam.alfLumaCoeffFlag, codedVarBins, sizeof( codedVarBins ) ); + memcpy( alfParam.alfLumaCoeffFlag, codedVarBins, sizeof( codedVarBins ) ); #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - alfSliceParam.alfLumaCoeffDeltaPredictionFlag = 0; + alfParam.alfLumaCoeffDeltaPredictionFlag = 0; #endif for( int varInd = 0; varInd < numFiltersBest; varInd++ ) @@ -1225,51 +1225,51 @@ double EncAdaptiveLoopFilter::mergeFiltersAndCost( AlfSliceParam& alfSliceParam, } } - for( int ind = 0; ind < alfSliceParam.numLumaFilters; ++ind ) + for( int ind = 0; ind < alfParam.numLumaFilters; ++ind ) { for( int i = 0; i < alfShape.numCoeff; i++ ) { #if JVET_O0669_REMOVE_ALF_COEFF_PRED - alfSliceParam.lumaCoeff[ind * MAX_NUM_ALF_LUMA_COEFF + i] = m_filterCoeffSet[ind][i]; + alfParam.lumaCoeff[ind * MAX_NUM_ALF_LUMA_COEFF + i] = m_filterCoeffSet[ind][i]; #else - if( alfSliceParam.alfLumaCoeffDeltaPredictionFlag ) + if( alfParam.alfLumaCoeffDeltaPredictionFlag ) { - alfSliceParam.lumaCoeff[ind * MAX_NUM_ALF_LUMA_COEFF + i] = m_diffFilterCoeff[ind][i]; + alfParam.lumaCoeff[ind * MAX_NUM_ALF_LUMA_COEFF + i] = m_diffFilterCoeff[ind][i]; } else { - alfSliceParam.lumaCoeff[ind * MAX_NUM_ALF_LUMA_COEFF + i] = m_filterCoeffSet[ind][i]; + alfParam.lumaCoeff[ind * MAX_NUM_ALF_LUMA_COEFF + i] = m_filterCoeffSet[ind][i]; } #endif - alfSliceParam.lumaClipp[ind * MAX_NUM_ALF_LUMA_COEFF + i] = m_filterClippSet[ind][i]; + alfParam.lumaClipp[ind * MAX_NUM_ALF_LUMA_COEFF + i] = m_filterClippSet[ind][i]; } } - memcpy( alfSliceParam.filterCoeffDeltaIdx, m_filterIndices[numFiltersBest - 1], sizeof( short ) * MAX_NUM_ALF_CLASSES ); - uiCoeffBits += getNonFilterCoeffRate( alfSliceParam ); + memcpy( alfParam.filterCoeffDeltaIdx, m_filterIndices[numFiltersBest - 1], sizeof( short ) * MAX_NUM_ALF_CLASSES ); + uiCoeffBits += getNonFilterCoeffRate( alfParam ); return distReturn; } -int EncAdaptiveLoopFilter::getNonFilterCoeffRate( AlfSliceParam& alfSliceParam ) +int EncAdaptiveLoopFilter::getNonFilterCoeffRate( AlfParam& alfParam ) { int len = 1 // alf_coefficients_delta_flag + lengthTruncatedUnary( 0, 3 ) // chroma_idc = 0, it is signalled when ALF is enabled for luma - + getTBlength( alfSliceParam.numLumaFilters - 1, MAX_NUM_ALF_CLASSES ); //numLumaFilters + + getTBlength( alfParam.numLumaFilters - 1, MAX_NUM_ALF_CLASSES ); //numLumaFilters - if( alfSliceParam.numLumaFilters > 1 ) + if( alfParam.numLumaFilters > 1 ) { for( int i = 0; i < MAX_NUM_ALF_CLASSES; i++ ) { - len += getTBlength( (int)alfSliceParam.filterCoeffDeltaIdx[i], alfSliceParam.numLumaFilters ); //filter_coeff_delta[i] + len += getTBlength( (int)alfParam.filterCoeffDeltaIdx[i], alfParam.numLumaFilters ); //filter_coeff_delta[i] } } #if !JVET_O0669_REMOVE_ALF_COEFF_PRED len++; //fixed filter set flag - if (alfSliceParam.fixedFilterSetIndex > 0) + if (alfParam.fixedFilterSetIndex > 0) { - len += getTBlength(alfSliceParam.fixedFilterSetIndex - 1, NUM_FIXED_FILTER_SETS); + len += getTBlength(alfParam.fixedFilterSetIndex - 1, NUM_FIXED_FILTER_SETS); len += 1; //fixed filter flag pattern - if (alfSliceParam.fixedFilterPattern > 0) + if (alfParam.fixedFilterPattern > 0) len += MAX_NUM_ALF_CLASSES; //"fixed_filter_flag" for each class } #endif @@ -1380,7 +1380,7 @@ int EncAdaptiveLoopFilter::getCostFilterCoeffForce0( AlfFilterShape& alfShape, i } } - if( m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ) + if( m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ) { #if JVET_O0064_SIMP_ALF_CLIP_CODING for (int ind = 0; ind < numFilters; ++ind) @@ -1447,7 +1447,7 @@ int EncAdaptiveLoopFilter::getCostFilterCoeffForce0( AlfFilterShape& alfShape, i #if JVET_O0669_REMOVE_ALF_COEFF_PRED int EncAdaptiveLoopFilter::deriveFilterCoefficientsPredictionMode( AlfFilterShape& alfShape, int **filterSet, int** filterCoeffDiff, const int numFilters ) { - return (m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? getCostFilterClipp(alfShape, filterSet, numFilters) : 0) + getCostFilterCoeff(alfShape, filterSet, numFilters); + return (m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? getCostFilterClipp(alfShape, filterSet, numFilters) : 0) + getCostFilterCoeff(alfShape, filterSet, numFilters); #else int EncAdaptiveLoopFilter::deriveFilterCoefficientsPredictionMode( AlfFilterShape& alfShape, int **filterSet, int** filterCoeffDiff, const int numFilters, int& predMode ) { @@ -1472,7 +1472,7 @@ int EncAdaptiveLoopFilter::deriveFilterCoefficientsPredictionMode( AlfFilterShap predMode = ( ratePredMode1 < ratePredMode0 && numFilters > 1 ) ? 1 : 0; - int rateClipp = m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? getCostFilterClipp( alfShape, filterSet, numFilters ) : 0; + int rateClipp = m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? getCostFilterClipp( alfShape, filterSet, numFilters ) : 0; return ( numFilters > 1 ? 1 : 0 ) // coeff_delta_pred_mode_flag + rateClipp @@ -1625,7 +1625,7 @@ double EncAdaptiveLoopFilter::getDistForce0( AlfFilterShape& alfShape, const int } #if JVET_O0064_SIMP_ALF_CLIP_CODING - if (m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA]) + if (m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA]) { for (int ind = 0; ind < numFilters; ++ind) { @@ -1639,7 +1639,7 @@ double EncAdaptiveLoopFilter::getDistForce0( AlfFilterShape& alfShape, const int } } #else - if( m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ) + if( m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ) { memset( m_bitsCoeffScan, 0, sizeof( m_bitsCoeffScan ) ); for( int ind = 0; ind < numFilters; ++ind ) @@ -1770,13 +1770,13 @@ int EncAdaptiveLoopFilter::lengthGolomb( int coeffVal, int k, bool signed_coeff } } -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], AlfSliceParam& alfSliceParam ) +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 ) { double error = 0.0; AlfCovariance& tmpCov = covMerged[MAX_NUM_ALF_CLASSES]; #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - alfSliceParam.fixedFilterSetIndex = 0; + alfParam.fixedFilterSetIndex = 0; AlfCovariance& tmpCovFf = covMerged[MAX_NUM_ALF_CLASSES + 1]; double factor = 1 << (m_NUM_BITS - 1); double errorMin = 0; @@ -1784,9 +1784,9 @@ double EncAdaptiveLoopFilter::deriveFilterCoeffs( AlfCovariance* cov, AlfCovaria double errorCurSetPerClass[MAX_NUM_ALF_CLASSES] = { 0 }; int fixedFilterFlagPerClass[MAX_NUM_ALF_CLASSES] = { 0 }; - if (!alfSliceParam.nonLinearFlag[CHANNEL_TYPE_LUMA]) + if (!alfParam.nonLinearFlag[CHANNEL_TYPE_LUMA]) { - alfSliceParam.fixedFilterSetIndex = 0; + alfParam.fixedFilterSetIndex = 0; for (int filterSetIdx = 0; filterSetIdx < NUM_FIXED_FILTER_SETS; filterSetIdx++) { double errorCur = 0; @@ -1809,21 +1809,21 @@ double EncAdaptiveLoopFilter::deriveFilterCoeffs( AlfCovariance* cov, AlfCovaria if (errorCur < errorMin) { - memcpy(alfSliceParam.fixedFilterIdx, fixedFilterFlagPerClass, sizeof(fixedFilterFlagPerClass)); - alfSliceParam.fixedFilterSetIndex = filterSetIdx + 1; + memcpy(alfParam.fixedFilterIdx, fixedFilterFlagPerClass, sizeof(fixedFilterFlagPerClass)); + alfParam.fixedFilterSetIndex = filterSetIdx + 1; errorMin = errorCur; std::memcpy(errorMinPerClass, errorCurSetPerClass, sizeof(errorMinPerClass)); } } - alfSliceParam.fixedFilterPattern = 0; - if (alfSliceParam.fixedFilterSetIndex > 0) + alfParam.fixedFilterPattern = 0; + if (alfParam.fixedFilterSetIndex > 0) { for (int classIdx = 0; classIdx < MAX_NUM_ALF_CLASSES; classIdx++) { - if (alfSliceParam.fixedFilterIdx[classIdx] == 0) + if (alfParam.fixedFilterIdx[classIdx] == 0) { - alfSliceParam.fixedFilterPattern = 1; + alfParam.fixedFilterPattern = 1; break; } } @@ -1844,11 +1844,11 @@ double EncAdaptiveLoopFilter::deriveFilterCoeffs( AlfCovariance* cov, AlfCovaria #else //adjust stat tmpCovFf = cov[classIdx]; - if (alfSliceParam.fixedFilterSetIndex > 0 && alfSliceParam.fixedFilterIdx[classIdx] > 0 - && alfSliceParam.nonLinearFlag[CHANNEL_TYPE_LUMA] == false + if (alfParam.fixedFilterSetIndex > 0 && alfParam.fixedFilterIdx[classIdx] > 0 + && alfParam.nonLinearFlag[CHANNEL_TYPE_LUMA] == false ) { - int fixedFilterIdx = m_classToFilterMapping[alfSliceParam.fixedFilterSetIndex - 1][classIdx]; + int fixedFilterIdx = m_classToFilterMapping[alfParam.fixedFilterSetIndex - 1][classIdx]; tmpCovFf.pixAcc += errorMinPerClass[classIdx]; for (int i = 0; i < MAX_NUM_ALF_LUMA_COEFF; i++) { @@ -1964,20 +1964,20 @@ void EncAdaptiveLoopFilter::mergeClasses( const AlfFilterShape& alfShape, AlfCov indexList[i] = i; availableClass[i] = true; covMerged[i] = cov[i]; - covMerged[i].numBins = m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[COMPONENT_Y] : 1; + covMerged[i].numBins = m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[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_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[COMPONENT_Y] : 1; + tmpCov.numBins = m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[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_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[CHANNEL_TYPE_LUMA] / 2 : 0); - if ( m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ) + std::fill_n(clipMerged[numRemaining-1][i], MAX_NUM_ALF_LUMA_COEFF, m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? AlfNumClippingValues[CHANNEL_TYPE_LUMA] / 2 : 0); + if ( m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ) { err[i] = covMerged[i].optimizeFilterClip( alfShape, clipMerged[numRemaining-1][i] ); } @@ -2008,7 +2008,7 @@ void EncAdaptiveLoopFilter::mergeClasses( const AlfFilterShape& alfShape, AlfCov { tmpClip[l] = (clipMerged[numRemaining-1][i][l] + clipMerged[numRemaining-1][j][l] + 1 ) >> 1; } - double errorMerged = m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? tmpCov.optimizeFilterClip( alfShape, tmpClip ) : tmpCov.calculateError( tmpClip ); + double errorMerged = m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] ? tmpCov.optimizeFilterClip( alfShape, tmpClip ) : tmpCov.calculateError( tmpClip ); double error = errorMerged - error1 - error2; if( error < errorMin ) @@ -2492,7 +2492,7 @@ void EncAdaptiveLoopFilter::calcCovariance(int ELocal[MAX_NUM_ALF_LUMA_COEFF][Ma -void EncAdaptiveLoopFilter::setEnableFlag( AlfSliceParam& alfSlicePara, ChannelType channel, bool val ) +void EncAdaptiveLoopFilter::setEnableFlag( AlfParam& alfSlicePara, ChannelType channel, bool val ) { if( channel == CHANNEL_TYPE_LUMA ) { @@ -2504,7 +2504,7 @@ void EncAdaptiveLoopFilter::setEnableFlag( AlfSliceParam& alfSlicePara, ChannelT } } -void EncAdaptiveLoopFilter::setEnableFlag( AlfSliceParam& alfSlicePara, ChannelType channel, uint8_t** ctuFlags ) +void EncAdaptiveLoopFilter::setEnableFlag( AlfParam& alfSlicePara, ChannelType channel, uint8_t** ctuFlags ) { const ComponentID compIDFirst = isLuma( channel ) ? COMPONENT_Y : COMPONENT_Cb; const ComponentID compIDLast = isLuma( channel ) ? COMPONENT_Y : COMPONENT_Cr; @@ -2592,7 +2592,7 @@ void EncAdaptiveLoopFilter::initDistortion() } } } -void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& alfSliceParamNewFilters +void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfParamNewFilters #if ENABLE_QPA , const double lambdaChromaWeight #endif @@ -2602,10 +2602,10 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a TempCtx ctxBest(m_CtxCache); TempCtx ctxTempStart(m_CtxCache); TempCtx ctxTempBest(m_CtxCache); - AlfSliceParam alfSliceParamNewFiltersBest = alfSliceParamNewFilters; + AlfParam alfParamNewFiltersBest = alfParamNewFilters; APS** apss = cs.slice->getAlfAPSs(); short* alfCtbFilterSetIndex = cs.picture->getAlfCtbFilterIndex(); - bool hasNewFilters[2] = { alfSliceParamNewFilters.enabledFlag[COMPONENT_Y] , alfSliceParamNewFilters.enabledFlag[COMPONENT_Cb] || alfSliceParamNewFilters.enabledFlag[COMPONENT_Cr] }; + bool hasNewFilters[2] = { alfParamNewFilters.enabledFlag[COMPONENT_Y] , alfParamNewFilters.enabledFlag[COMPONENT_Cb] || alfParamNewFilters.enabledFlag[COMPONENT_Cr] }; initDistortion(); //luma @@ -2633,7 +2633,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a else { bitsNewFilter = m_bitsNewFilter[CHANNEL_TYPE_LUMA]; - reconstructCoeff(alfSliceParamNewFilters, CHANNEL_TYPE_LUMA, true, true); + reconstructCoeff(alfParamNewFilters, CHANNEL_TYPE_LUMA, true, true); } } int numIter = useNewFilter ? 2 : 1; @@ -2647,8 +2647,8 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a } for (int iter = 0; iter < numIter; iter++) { - m_alfSliceParamTemp = alfSliceParamNewFilters; - m_alfSliceParamTemp.enabledFlag[CHANNEL_TYPE_LUMA] = true; + m_alfParamTemp = alfParamNewFilters; + m_alfParamTemp.enabledFlag[CHANNEL_TYPE_LUMA] = true; double curCost = getTBlength(numTemporalAps + useNewFilter, ALF_CTB_MAX_NUM_APS + 1) * m_lambda[CHANNEL_TYPE_LUMA]; if (iter > 0) //re-derive new filter-set { @@ -2681,17 +2681,17 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a { int bitNL[2] = { 0, 0 }; double errNL[2] = { 0.0, 0.0 }; - m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] = 1; + m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] = 1; if (m_encCfg->getUseNonLinearAlfLuma()) { errNL[1] = getFilterCoeffAndCost(cs, 0, CHANNEL_TYPE_LUMA, true, 0, bitNL[1], true); - m_alfSliceParamTempNL = m_alfSliceParamTemp; + m_alfParamTempNL = m_alfParamTemp; } else { errNL[1] = MAX_DOUBLE; } - m_alfSliceParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] = 0; + m_alfParamTemp.nonLinearFlag[CHANNEL_TYPE_LUMA] = 0; errNL[0] = getFilterCoeffAndCost(cs, 0, CHANNEL_TYPE_LUMA, true, 0, bitNL[0], true); int bitsNewFilterTempLuma = bitNL[0]; @@ -2700,13 +2700,13 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a { err = errNL[1]; bitsNewFilterTempLuma = bitNL[1]; - m_alfSliceParamTemp = m_alfSliceParamTempNL; + m_alfParamTemp = m_alfParamTempNL; } if (dDistOrgNewFilter + m_lambda[CHANNEL_TYPE_LUMA] * m_bitsNewFilter[CHANNEL_TYPE_LUMA] < err) //re-derived filter is not good, skip { continue; } - reconstructCoeff(m_alfSliceParamTemp, CHANNEL_TYPE_LUMA, true, true); + reconstructCoeff(m_alfParamTemp, CHANNEL_TYPE_LUMA, true, true); bitsNewFilter = bitsNewFilterTempLuma; } else //no blocks using new filter, skip @@ -2729,9 +2729,9 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a //rate m_CABACEstimator->getCtx() = AlfCtx(ctxTempStart); m_CABACEstimator->resetBits(); - m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, COMPONENT_Y, &m_alfSliceParamTemp); + m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, COMPONENT_Y, &m_alfParamTemp); alfCtbFilterSetIndex[ctbIdx] = filterSetIdx; - m_CABACEstimator->codeAlfCtuFilterIndex(cs, ctbIdx, &m_alfSliceParamTemp.enabledFlag[COMPONENT_Y]); + m_CABACEstimator->codeAlfCtuFilterIndex(cs, ctbIdx, &m_alfParamTemp.enabledFlag[COMPONENT_Y]); double rateOn = FracBitsScale *(double)m_CABACEstimator->getEstFracBits(); //distortion double dist = distUnfilterCtb; @@ -2783,7 +2783,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a //rate m_CABACEstimator->getCtx() = AlfCtx(ctxTempStart); m_CABACEstimator->resetBits(); - m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, COMPONENT_Y, &m_alfSliceParamTemp); + m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, COMPONENT_Y, &m_alfParamTemp); //cost double costOff = distUnfilterCtb + m_lambda[COMPONENT_Y] * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); if (costOn < costOff) @@ -2820,14 +2820,14 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a bestApsIds[i] = apsIds[i - useNewFilter]; } } - alfSliceParamNewFiltersBest = m_alfSliceParamTemp; + alfParamNewFiltersBest = m_alfParamTemp; ctxBest = AlfCtx(m_CABACEstimator->getCtx()); copyCtuEnableFlag(m_ctuEnableFlagTmp, m_ctuEnableFlag, CHANNEL_TYPE_LUMA); for (int ctuIdx = 0; ctuIdx < m_numCTUsInPic; ctuIdx++) { m_alfCtbFilterSetIndexTmp[ctuIdx] = alfCtbFilterSetIndex[ctuIdx]; } - alfSliceParamNewFiltersBest.newFilterFlag[CHANNEL_TYPE_LUMA] = useNewFilter; + alfParamNewFiltersBest.newFilterFlag[CHANNEL_TYPE_LUMA] = useNewFilter; } }//for (int iter = 0; iter < numIter; iter++) }// for (int numTemporalAps = 0; numTemporalAps < apsIds.size(); numTemporalAps++) @@ -2843,7 +2843,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a } else { - alfSliceParamNewFiltersBest.tLayer = cs.slice->getTLayer(); + alfParamNewFiltersBest.tLayer = cs.slice->getTLayer(); cs.slice->setTileGroupAlfEnabledFlag(COMPONENT_Y, true); cs.slice->setTileGroupNumAps((int)bestApsIds.size()); cs.slice->setAlfAPSs(bestApsIds); @@ -2852,7 +2852,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a { alfCtbFilterSetIndex[ctuIdx] = m_alfCtbFilterSetIndexTmp[ctuIdx]; } - if (alfSliceParamNewFiltersBest.newFilterFlag[CHANNEL_TYPE_LUMA]) + if (alfParamNewFiltersBest.newFilterFlag[CHANNEL_TYPE_LUMA]) { APS* newAPS = m_apsMap->getPS((newApsId << NUM_APS_TYPE_LEN) + ALF_APS); if (newAPS == NULL) @@ -2861,7 +2861,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a newAPS->setAPSId(newApsId); newAPS->setAPSType(ALF_APS); } - newAPS->setAlfAPSParam(alfSliceParamNewFiltersBest); + newAPS->setAlfAPSParam(alfParamNewFiltersBest); m_apsMap->setChangedFlag((newApsId << NUM_APS_TYPE_LEN) + ALF_APS); m_apsIdStart = newApsId; } @@ -2881,11 +2881,11 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a m_CABACEstimator->getCtx() = AlfCtx(ctxBest); ctxStart = AlfCtx(m_CABACEstimator->getCtx()); int newApsIdChroma = -1; - if (alfSliceParamNewFiltersBest.newFilterFlag[CHANNEL_TYPE_LUMA] && (alfSliceParamNewFiltersBest.enabledFlag[COMPONENT_Cb] || alfSliceParamNewFiltersBest.enabledFlag[COMPONENT_Cr])) + if (alfParamNewFiltersBest.newFilterFlag[CHANNEL_TYPE_LUMA] && (alfParamNewFiltersBest.enabledFlag[COMPONENT_Cb] || alfParamNewFiltersBest.enabledFlag[COMPONENT_Cr])) { newApsIdChroma = newApsId; } - else if (alfSliceParamNewFiltersBest.enabledFlag[COMPONENT_Cb] || alfSliceParamNewFiltersBest.enabledFlag[COMPONENT_Cr]) + else if (alfParamNewFiltersBest.enabledFlag[COMPONENT_Cb] || alfParamNewFiltersBest.enabledFlag[COMPONENT_Cr]) { int curId = m_apsIdStart; while (newApsIdChroma < 0) @@ -2915,22 +2915,22 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a #endif if (curApsId == newApsIdChroma) { - m_alfSliceParamTemp = alfSliceParamNewFilters; + m_alfParamTemp = alfParamNewFilters; curCost += m_lambda[CHANNEL_TYPE_CHROMA] * m_bitsNewFilter[CHANNEL_TYPE_CHROMA]; } else if (curAPS && curAPS->getTemporalId() <= cs.slice->getTLayer() && curAPS->getAlfAPSParam().newFilterFlag[CHANNEL_TYPE_CHROMA]) { - m_alfSliceParamTemp = curAPS->getAlfAPSParam(); + m_alfParamTemp = curAPS->getAlfAPSParam(); } else { continue; } - reconstructCoeff(m_alfSliceParamTemp, CHANNEL_TYPE_CHROMA, true, true); + reconstructCoeff(m_alfParamTemp, CHANNEL_TYPE_CHROMA, true, true); m_CABACEstimator->getCtx() = AlfCtx(ctxStart); for (int compId = 1; compId < MAX_NUM_COMPONENT; compId++) { - m_alfSliceParamTemp.enabledFlag[compId] = true; + m_alfParamTemp.enabledFlag[compId] = true; for (int ctbIdx = 0; ctbIdx < m_numCTUsInPic; ctbIdx++) { double distUnfilterCtu = m_ctbDistortionUnfilter[compId][ctbIdx]; @@ -2941,7 +2941,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a m_CABACEstimator->getCtx() = AlfCtx(ctxTempStart); m_CABACEstimator->resetBits(); //ctb flag - m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, compId, &m_alfSliceParamTemp); + m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, compId, &m_alfParamTemp); double rateOn = FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); //distortion for (int i = 0; i < MAX_NUM_ALF_CHROMA_COEFF; i++) @@ -2957,7 +2957,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a //rate m_CABACEstimator->getCtx() = AlfCtx(ctxTempStart); m_CABACEstimator->resetBits(); - m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, compId, &m_alfSliceParamTemp); + m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, compId, &m_alfParamTemp); //cost double costOff = distUnfilterCtu + m_lambda[compId] * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); if (costOn < costOff) @@ -2974,16 +2974,16 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a } } //chroma idc - setEnableFlag(m_alfSliceParamTemp, CHANNEL_TYPE_CHROMA, m_ctuEnableFlag); - const int alfChromaIdc = m_alfSliceParamTemp.enabledFlag[COMPONENT_Cb] * 2 + m_alfSliceParamTemp.enabledFlag[COMPONENT_Cr]; + setEnableFlag(m_alfParamTemp, CHANNEL_TYPE_CHROMA, m_ctuEnableFlag); + const int alfChromaIdc = m_alfParamTemp.enabledFlag[COMPONENT_Cb] * 2 + m_alfParamTemp.enabledFlag[COMPONENT_Cr]; curCost += lengthTruncatedUnary(alfChromaIdc, 3) * m_lambda[CHANNEL_TYPE_CHROMA]; if (curCost < costMin) { costMin = curCost; cs.slice->setTileGroupApsIdChroma(curApsId); - cs.slice->setTileGroupAlfEnabledFlag(COMPONENT_Cb, m_alfSliceParamTemp.enabledFlag[COMPONENT_Cb]); - cs.slice->setTileGroupAlfEnabledFlag(COMPONENT_Cr, m_alfSliceParamTemp.enabledFlag[COMPONENT_Cr]); + cs.slice->setTileGroupAlfEnabledFlag(COMPONENT_Cb, m_alfParamTemp.enabledFlag[COMPONENT_Cb]); + cs.slice->setTileGroupAlfEnabledFlag(COMPONENT_Cr, m_alfParamTemp.enabledFlag[COMPONENT_Cr]); copyCtuEnableFlag(m_ctuEnableFlagTmp, m_ctuEnableFlag, CHANNEL_TYPE_CHROMA); } } @@ -3007,12 +3007,12 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfSliceParam& a newAPS->getAlfAPSParam().reset(); } newAPS->getAlfAPSParam().newFilterFlag[CHANNEL_TYPE_CHROMA] = true; - newAPS->getAlfAPSParam().nonLinearFlag[CHANNEL_TYPE_CHROMA] = alfSliceParamNewFilters.nonLinearFlag[CHANNEL_TYPE_CHROMA]; + newAPS->getAlfAPSParam().nonLinearFlag[CHANNEL_TYPE_CHROMA] = alfParamNewFilters.nonLinearFlag[CHANNEL_TYPE_CHROMA]; newAPS->getAlfAPSParam().tLayer = cs.slice->getTLayer(); for (int i = 0; i < MAX_NUM_ALF_CHROMA_COEFF; i++) { - newAPS->getAlfAPSParam().chromaCoeff[i] = alfSliceParamNewFilters.chromaCoeff[i]; - newAPS->getAlfAPSParam().chromaClipp[i] = alfSliceParamNewFilters.chromaClipp[i]; + newAPS->getAlfAPSParam().chromaCoeff[i] = alfParamNewFilters.chromaCoeff[i]; + newAPS->getAlfAPSParam().chromaClipp[i] = alfParamNewFilters.chromaClipp[i]; } m_apsMap->setChangedFlag((newApsIdChroma << NUM_APS_TYPE_LEN) + ALF_APS); m_apsIdStart = newApsIdChroma; diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h index 59b1bdb956502419945d75c10b706775e2a8a9f1..1d2b91763f196f6ad3e6a8b54beb2c76bec773c2 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h @@ -235,7 +235,7 @@ private: uint8_t* m_ctuEnableFlagTmp[MAX_NUM_COMPONENT]; //for RDO - AlfSliceParam m_alfSliceParamTemp; + AlfParam m_alfParamTemp; ParameterSetMap<APS>* m_apsMap; AlfCovariance m_alfCovarianceMerged[ALF_NUM_OF_FILTER_TYPES][MAX_NUM_ALF_CLASSES + 2]; int m_alfClipMerged[ALF_NUM_OF_FILTER_TYPES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF]; @@ -257,7 +257,7 @@ private: double *m_ctbDistortionFixedFilter; double *m_ctbDistortionUnfilter[MAX_NUM_COMPONENT]; std::vector<short> m_alfCtbFilterSetIndexTmp; - AlfSliceParam m_alfSliceParamTempNL; + AlfParam m_alfParamTempNL; int m_clipDefaultEnc[MAX_NUM_ALF_LUMA_COEFF]; int m_filterTmp[MAX_NUM_ALF_LUMA_COEFF]; int m_clipTmp[MAX_NUM_ALF_LUMA_COEFF]; @@ -267,7 +267,7 @@ public: virtual ~EncAdaptiveLoopFilter() {} void initDistortion(); std::vector<int> getAvaiApsIdsLuma(CodingStructure& cs, int &newApsId); - void alfEncoderCtb(CodingStructure& cs, AlfSliceParam& alfSliceParamNewFilters + void alfEncoderCtb(CodingStructure& cs, AlfParam& alfParamNewFilters #if ENABLE_QPA , const double lambdaChromaWeight #endif @@ -287,14 +287,14 @@ public: #endif private: - void alfEncoder( CodingStructure& cs, AlfSliceParam& alfSliceParam, const PelUnitBuf& orgUnitBuf, const PelUnitBuf& recExtBuf, const PelUnitBuf& recBuf, const ChannelType channel + void alfEncoder( CodingStructure& cs, AlfParam& alfParam, const PelUnitBuf& orgUnitBuf, const PelUnitBuf& recExtBuf, const PelUnitBuf& recBuf, const ChannelType channel #if ENABLE_QPA , const double lambdaChromaWeight = 0.0 #endif ); - void copyAlfSliceParam( AlfSliceParam& alfSliceParamDst, AlfSliceParam& alfSliceParamSrc, ChannelType channel ); - double mergeFiltersAndCost( AlfSliceParam& alfSliceParam, AlfFilterShape& alfShape, AlfCovariance* covFrame, AlfCovariance* covMerged, int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], int& uiCoeffBits ); + void copyAlfParam( AlfParam& alfParamDst, AlfParam& alfParamSrc, ChannelType channel ); + double mergeFiltersAndCost( AlfParam& alfParam, AlfFilterShape& alfShape, AlfCovariance* covFrame, AlfCovariance* covMerged, int clipMerged[MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_CLASSES][MAX_NUM_ALF_LUMA_COEFF], int& uiCoeffBits ); void getFrameStats( ChannelType channel, int iShapeIdx ); void getFrameStat( AlfCovariance* frameCov, AlfCovariance** ctbCov, uint8_t* ctbEnableFlags, const int numClasses ); @@ -305,7 +305,7 @@ private: double getFilterCoeffAndCost( CodingStructure& cs, double distUnfilter, ChannelType channel, bool bReCollectStat, int iShapeIdx, int& uiCoeffBits, 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], AlfSliceParam& alfSliceParam); + 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); #if JVET_O0669_REMOVE_ALF_COEFF_PRED int deriveFilterCoefficientsPredictionMode( AlfFilterShape& alfShape, int **filterSet, int** filterCoeffDiff, const int numFilters ); #else @@ -322,7 +322,7 @@ private: double getDistCoeffForce0( bool* codedVarBins, double errorForce0CoeffTab[MAX_NUM_ALF_CLASSES][2], int* bitsVarBin, const int numFilters ); int lengthTruncatedUnary( int symbol, int maxSymbol ); int lengthUvlc( int uiCode ); - int getNonFilterCoeffRate( AlfSliceParam& alfSliceParam ); + int getNonFilterCoeffRate( AlfParam& alfParam ); int getTBlength( int uiSymbol, const int uiMaxSymbol ); int getCostFilterCoeffForce0( AlfFilterShape& alfShape, int **pDiffQFilterCoeffIntPP, const int numFilters, bool* codedVarBins ); @@ -337,14 +337,14 @@ private: int lengthFilterClipps( AlfFilterShape& alfShape, const int numFilters, int **FilterCoeff, int* kMinTab ); #endif double getDistForce0( AlfFilterShape& alfShape, const int numFilters, double errorTabForce0Coeff[MAX_NUM_ALF_CLASSES][2], bool* codedVarBins ); - int getCoeffRate( AlfSliceParam& alfSliceParam, bool isChroma ); + int getCoeffRate( AlfParam& alfParam, bool isChroma ); double getUnfilteredDistortion( AlfCovariance* cov, ChannelType channel ); double getUnfilteredDistortion( AlfCovariance* cov, const int numClasses ); double getFilteredDistortion( AlfCovariance* cov, const int numClasses, const int numFiltersMinus1, const int numCoeff ); - void setEnableFlag( AlfSliceParam& alfSlicePara, ChannelType channel, bool val ); - void setEnableFlag( AlfSliceParam& alfSlicePara, ChannelType channel, uint8_t** ctuFlags ); + void setEnableFlag( AlfParam& alfSlicePara, ChannelType channel, bool val ); + void setEnableFlag( AlfParam& alfSlicePara, ChannelType channel, uint8_t** ctuFlags ); void setCtuEnableFlag( uint8_t** ctuFlags, ChannelType channel, uint8_t val ); void copyCtuEnableFlag( uint8_t** ctuFlagsDst, uint8_t** ctuFlagsSrc, ChannelType channel ); }; diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 76fedd8078b7e7967309bbc696dff6e02fd9783d..237808b2942ed31ec36c73658aa899f0678256e4 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -486,7 +486,7 @@ void HLSWriter::codeAPS( APS* pcAPS ) void HLSWriter::codeAlfAps( APS* pcAPS ) { - AlfSliceParam param = pcAPS->getAlfAPSParam(); + AlfParam param = pcAPS->getAlfAPSParam(); WRITE_FLAG(param.newFilterFlag[CHANNEL_TYPE_LUMA], "alf_luma_new_filter"); WRITE_FLAG(param.newFilterFlag[CHANNEL_TYPE_CHROMA], "alf_chroma_new_filter"); @@ -1801,17 +1801,17 @@ void HLSWriter::alfGolombEncode( int coeff, int k, const bool signed_coeff ) } } -void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChroma ) +void HLSWriter::alfFilter( const AlfParam& alfParam, const bool isChroma ) { if( !isChroma ) { - WRITE_FLAG( alfSliceParam.alfLumaCoeffDeltaFlag, "alf_luma_coeff_delta_flag" ); + WRITE_FLAG( alfParam.alfLumaCoeffDeltaFlag, "alf_luma_coeff_delta_flag" ); #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - if( !alfSliceParam.alfLumaCoeffDeltaFlag ) + if( !alfParam.alfLumaCoeffDeltaFlag ) { - if( alfSliceParam.numLumaFilters > 1 ) + if( alfParam.numLumaFilters > 1 ) { - WRITE_FLAG( alfSliceParam.alfLumaCoeffDeltaPredictionFlag, "alf_luma_coeff_delta_prediction_flag" ); + WRITE_FLAG( alfParam.alfLumaCoeffDeltaPredictionFlag, "alf_luma_coeff_delta_prediction_flag" ); } } #endif @@ -1822,15 +1822,15 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro memset( bitsCoeffScan, 0, sizeof( bitsCoeffScan ) ); const int maxGolombIdx = AdaptiveLoopFilter::getMaxGolombIdx( alfShape.filterType ); #endif - const short* coeff = isChroma ? alfSliceParam.chromaCoeff : alfSliceParam.lumaCoeff; - const short* clipp = isChroma ? alfSliceParam.chromaClipp : alfSliceParam.lumaClipp; - const int numFilters = isChroma ? 1 : alfSliceParam.numLumaFilters; + const short* coeff = isChroma ? alfParam.chromaCoeff : alfParam.lumaCoeff; + const short* clipp = isChroma ? alfParam.chromaClipp : alfParam.lumaClipp; + const int numFilters = isChroma ? 1 : alfParam.numLumaFilters; // vlc for all #if !JVET_O0216_ALF_COEFF_EG3 for( int ind = 0; ind < numFilters; ++ind ) { - if( isChroma || !alfSliceParam.alfLumaCoeffDeltaFlag || alfSliceParam.alfLumaCoeffFlag[ind] ) + if( isChroma || !alfParam.alfLumaCoeffDeltaFlag || alfParam.alfLumaCoeffFlag[ind] ) { for( int i = 0; i < alfShape.numCoeff - 1; i++ ) { @@ -1862,11 +1862,11 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro #endif if( !isChroma ) { - if( alfSliceParam.alfLumaCoeffDeltaFlag ) + if( alfParam.alfLumaCoeffDeltaFlag ) { for( int ind = 0; ind < numFilters; ++ind ) { - WRITE_FLAG( alfSliceParam.alfLumaCoeffFlag[ind], "alf_luma_coeff_flag[i]" ); + WRITE_FLAG( alfParam.alfLumaCoeffFlag[ind], "alf_luma_coeff_flag[i]" ); } } } @@ -1874,7 +1874,7 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro // Filter coefficients for( int ind = 0; ind < numFilters; ++ind ) { - if( !isChroma && !alfSliceParam.alfLumaCoeffFlag[ind] && alfSliceParam.alfLumaCoeffDeltaFlag ) + if( !isChroma && !alfParam.alfLumaCoeffFlag[ind] && alfParam.alfLumaCoeffDeltaFlag ) { continue; } @@ -1890,7 +1890,7 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro } // Clipping values coding - if( alfSliceParam.nonLinearFlag[isChroma] ) + if( alfParam.nonLinearFlag[isChroma] ) { #if JVET_O0064_SIMP_ALF_CLIP_CODING for (int ind = 0; ind < numFilters; ++ind) @@ -1912,7 +1912,7 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro { memcpy( recCoeff, coeff, sizeof(short) * numFilters * MAX_NUM_ALF_LUMA_COEFF ); #if !JVET_O0669_REMOVE_ALF_COEFF_PRED - if( alfSliceParam.alfLumaCoeffDeltaPredictionFlag ) + if( alfParam.alfLumaCoeffDeltaPredictionFlag ) { for( int i = 1; i < numFilters; i++ ) { @@ -1927,7 +1927,7 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro // vlc for all for( int ind = 0; ind < numFilters; ++ind ) { - if( isChroma || !alfSliceParam.alfLumaCoeffDeltaFlag || alfSliceParam.alfLumaCoeffFlag[ind] ) + if( isChroma || !alfParam.alfLumaCoeffDeltaFlag || alfParam.alfLumaCoeffFlag[ind] ) { for( int i = 0; i < alfShape.numCoeff - 1; i++ ) { @@ -1962,7 +1962,7 @@ void HLSWriter::alfFilter( const AlfSliceParam& alfSliceParam, const bool isChro // Filter coefficients for( int ind = 0; ind < numFilters; ++ind ) { - if( !isChroma && !alfSliceParam.alfLumaCoeffFlag[ind] && alfSliceParam.alfLumaCoeffDeltaFlag ) + if( !isChroma && !alfParam.alfLumaCoeffFlag[ind] && alfParam.alfLumaCoeffDeltaFlag ) { continue; } diff --git a/source/Lib/EncoderLib/VLCWriter.h b/source/Lib/EncoderLib/VLCWriter.h index 2fd162f2391b0412f6077439c2808603d3ed5e63..7c8c345496ebe7b1a600897f5a80e1017c75a78e 100644 --- a/source/Lib/EncoderLib/VLCWriter.h +++ b/source/Lib/EncoderLib/VLCWriter.h @@ -137,7 +137,7 @@ public: void codeTilesWPPEntryPoint ( Slice* pSlice ); void codeScalingList ( const ScalingList &scalingList ); - void alfFilter( const AlfSliceParam& alfSliceParam, const bool isChroma ); + void alfFilter( const AlfParam& alfParam, const bool isChroma ); private: void xWriteTruncBinCode( uint32_t uiSymbol, const int uiMaxSymbol );