diff --git a/source/Lib/CommonLib/CommonDef.h b/source/Lib/CommonLib/CommonDef.h index eaffcb0dddf0e4a465470cf4234c12a8db62d63c..2ad1eddde381dd29da7bb3afb8b119f3fdd9bae5 100644 --- a/source/Lib/CommonLib/CommonDef.h +++ b/source/Lib/CommonLib/CommonDef.h @@ -329,7 +329,9 @@ static const int SCALING_LIST_REM_NUM = 6; static const int QUANT_SHIFT = 14; ///< Q(4) = 2^14 static const int IQUANT_SHIFT = 6; -static const int SCALE_BITS = 15; ///< Precision for fractional bit estimates + +static constexpr int SCALE_BITS = 15; // Precision for fractional bit estimates +static constexpr double FRAC_BITS_SCALE = 1.0 / (1 << SCALE_BITS); static const int SCALING_LIST_NUM = MAX_NUM_COMPONENT * (NUMBER_OF_PREDICTION_MODES - 1); ///< list number for quantization matrix diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp index 06341c3b6e3a8f6deb1e59e97e06f7a81293e5d5..97956172c11aea7968071fdc8191c530a11b7eed 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.cpp @@ -879,7 +879,7 @@ double EncAdaptiveLoopFilter::deriveCtbAlfEnableFlags( CodingStructure& cs, cons assert( cs.slice->getTileGroupNumAps() == 1 ); m_CABACEstimator->codeAlfCtuFilterIndex(cs, ctuIdx, &m_alfParamTemp.enabledFlag[COMPONENT_Y]); } - double costOn = distUnfilterCtu + ctuLambda * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + double costOn = distUnfilterCtu + ctuLambda * FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); #else double costOn = distUnfilterCtu + getFilteredDistortion( m_alfCovariance[compID][iShapeIdx][ctuIdx], numClasses, m_alfParamTemp.numLumaFilters - 1, numCoeff ); @@ -888,7 +888,7 @@ double EncAdaptiveLoopFilter::deriveCtbAlfEnableFlags( CodingStructure& cs, cons #else const double ctuLambda = m_lambda[compID]; #endif - costOn += ctuLambda * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + costOn += ctuLambda * FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); #endif ctxTempBest = AlfCtx( m_CABACEstimator->getCtx() ); #if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB @@ -908,7 +908,7 @@ double EncAdaptiveLoopFilter::deriveCtbAlfEnableFlags( CodingStructure& cs, cons m_CABACEstimator->resetBits(); m_ctuAlternative[compID][ctuIdx] = altIdx; m_CABACEstimator->codeAlfCtuAlternative( cs, ctuIdx, compID, &m_alfParamTemp ); - double r_altCost = ctuLambda * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + double r_altCost = ctuLambda * FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); double altDist = 0.; altDist += m_alfCovariance[compID][iShapeIdx][ctuIdx][0].calcErrorForCoeffs( m_filterClippSet[altIdx], m_filterCoeffSet[altIdx], numCoeff, m_NUM_BITS ); @@ -930,7 +930,7 @@ double EncAdaptiveLoopFilter::deriveCtbAlfEnableFlags( CodingStructure& cs, cons m_CABACEstimator->resetBits(); m_ctuEnableFlag[compID][ctuIdx] = 0; m_CABACEstimator->codeAlfCtuEnableFlag( cs, ctuIdx, compID, &m_alfParamTemp); - double costOff = distUnfilterCtu + ctuLambda * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + double costOff = distUnfilterCtu + ctuLambda * FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); if( costOn < costOff ) { @@ -1240,7 +1240,7 @@ double EncAdaptiveLoopFilter::getFilterCoeffAndCost( CodingStructure& cs, double } m_CABACEstimator->codeAlfCtuAlternatives( cs, channel, &m_alfParamTemp ); #endif - rate += FracBitsScale * (double)m_CABACEstimator->getEstFracBits(); + rate += FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); return dist + m_lambda[channel] * rate; } @@ -3160,7 +3160,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, COMPONENT_Y, &m_alfParamTemp); alfCtbFilterSetIndex[ctbIdx] = filterSetIdx; m_CABACEstimator->codeAlfCtuFilterIndex(cs, ctbIdx, &m_alfParamTemp.enabledFlag[COMPONENT_Y]); - double rateOn = FracBitsScale *(double)m_CABACEstimator->getEstFracBits(); + double rateOn = FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); //distortion double dist = distUnfilterCtb; for (int classIdx = 0; classIdx < MAX_NUM_ALF_CLASSES; classIdx++) @@ -3213,7 +3213,8 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar m_CABACEstimator->resetBits(); m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, COMPONENT_Y, &m_alfParamTemp); //cost - double costOff = distUnfilterCtb + m_lambda[COMPONENT_Y] * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + double costOff = + distUnfilterCtb + m_lambda[COMPONENT_Y] * FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); if (costOn < costOff) { m_CABACEstimator->getCtx() = AlfCtx(ctxTempBest); @@ -3378,7 +3379,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar m_CABACEstimator->resetBits(); //ctb flag m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, compId, &m_alfParamTemp); - double rateOn = FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + double rateOn = FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); #if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB #if ENABLE_QPA const double ctuLambda = lambdaChromaWeight > 0.0 ? cs.picture->m_uEnerHpCtu[ctbIdx] / lambdaChromaWeight : m_lambda[compId]; @@ -3399,7 +3400,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar m_CABACEstimator->resetBits(); m_ctuAlternative[compId][ctbIdx] = altIdx; m_CABACEstimator->codeAlfCtuAlternative( cs, ctbIdx, compId, &m_alfParamTemp ); - double altRate = FracBitsScale *(double)m_CABACEstimator->getEstFracBits(); + double altRate = FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); double r_altCost = ctuLambda * altRate; //distortion @@ -3442,7 +3443,7 @@ void EncAdaptiveLoopFilter::alfEncoderCtb(CodingStructure& cs, AlfParam& alfPar m_CABACEstimator->resetBits(); m_CABACEstimator->codeAlfCtuEnableFlag(cs, ctbIdx, compId, &m_alfParamTemp); //cost - double costOff = distUnfilterCtu + m_lambda[compId] * FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + double costOff = distUnfilterCtu + m_lambda[compId] * FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); if (costOn < costOff) { m_CABACEstimator->getCtx() = AlfCtx(ctxTempBest); diff --git a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h index 42dc89c3fc7c49ea7558f2820301213d65a0b72a..ffe5913604727b773b2a2115b4ce9da93d1905d2 100644 --- a/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h +++ b/source/Lib/EncoderLib/EncAdaptiveLoopFilter.h @@ -249,7 +249,6 @@ private: CABACWriter* m_CABACEstimator; CtxCache* m_CtxCache; double m_lambda[MAX_NUM_COMPONENT]; - const double FracBitsScale = 1.0 / double( 1 << SCALE_BITS ); #if JVET_O0090_ALF_CHROMA_FILTER_ALTERNATIVES_CTB int** m_filterCoeffSet; // [lumaClassIdx/chromaAltIdx][coeffIdx] diff --git a/source/Lib/EncoderLib/EncCu.cpp b/source/Lib/EncoderLib/EncCu.cpp index a753f7d396eb1ce5e864309c1eae3eda25f4575b..22440a4b6bbc9dabb9dd0b7d154d5061fceeee53 100644 --- a/source/Lib/EncoderLib/EncCu.cpp +++ b/source/Lib/EncoderLib/EncCu.cpp @@ -2021,7 +2021,7 @@ void EncCu::xCheckRDCostMerge2Nx2N( CodingStructure *&tempCS, CodingStructure *& const TempCtx ctxStart(m_CtxCache, m_CABACEstimator->getCtx()); CodingUnit &cu = tempCS->addCU( tempCS->area, partitioner.chType ); - const double sqrtLambdaForFirstPassIntra = m_pcRdCost->getMotionLambda(cu.transQuantBypass) / double(1 << SCALE_BITS); + const double sqrtLambdaForFirstPassIntra = m_pcRdCost->getMotionLambda(cu.transQuantBypass) * FRAC_BITS_SCALE; partitioner.setCUData( cu ); cu.slice = tempCS->slice; cu.tileIdx = tempCS->picture->brickMap->getBrickIdxRsMap( tempCS->area.lumaPos() ); diff --git a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp index e0a29f765178ef10880045959a132165035fc948..711cfdf0f4b3ebb832b9b7bf70e3434b63467864 100644 --- a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp +++ b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.cpp @@ -621,7 +621,7 @@ void EncSampleAdaptiveOffset::deriveModeNewRDO(const BitDepths &bitDepths, int c m_CABACEstimator->resetBits(); m_CABACEstimator->sao_offset_pars( modeParam[compIdx], compIdx, sliceEnabled[compIdx], bitDepths.recon[CHANNEL_TYPE_LUMA] ); modeDist[compIdx] = 0; - minCost= m_lambda[compIdx]*(FracBitsScale*(double)m_CABACEstimator->getEstFracBits()); + minCost = m_lambda[compIdx] * (FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits()); ctxBestLuma = SAOCtx( m_CABACEstimator->getCtx() ); if(sliceEnabled[compIdx]) { @@ -643,7 +643,7 @@ void EncSampleAdaptiveOffset::deriveModeNewRDO(const BitDepths &bitDepths, int c m_CABACEstimator->getCtx() = SAOCtx( ctxStartLuma ); m_CABACEstimator->resetBits(); m_CABACEstimator->sao_offset_pars( testOffset[compIdx], compIdx, sliceEnabled[compIdx], bitDepths.recon[CHANNEL_TYPE_LUMA] ); - double rate = FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + double rate = FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); cost = (double)dist[compIdx] + m_lambda[compIdx]*rate; if(cost < minCost) { @@ -670,7 +670,7 @@ void EncSampleAdaptiveOffset::deriveModeNewRDO(const BitDepths &bitDepths, int c modeDist [component] = 0; m_CABACEstimator->sao_offset_pars( modeParam[component], component, sliceEnabled[component], bitDepths.recon[CHANNEL_TYPE_CHROMA] ); const uint64_t currentFracBits = m_CABACEstimator->getEstFracBits(); - cost += m_lambda[component] * FracBitsScale * double( currentFracBits - previousFracBits ); + cost += m_lambda[component] * FRAC_BITS_SCALE * (currentFracBits - previousFracBits); previousFracBits = currentFracBits; } @@ -703,7 +703,7 @@ void EncSampleAdaptiveOffset::deriveModeNewRDO(const BitDepths &bitDepths, int c dist[component] = getDistortion(bitDepths.recon[CHANNEL_TYPE_CHROMA], typeIdc, testOffset[component].typeAuxInfo, invQuantOffset, blkStats[ctuRsAddr][component][typeIdc]); m_CABACEstimator->sao_offset_pars( testOffset[component], component, sliceEnabled[component], bitDepths.recon[CHANNEL_TYPE_CHROMA] ); const uint64_t currentFracBits = m_CABACEstimator->getEstFracBits(); - cost += dist[component] + (m_lambda[component] * FracBitsScale * double(currentFracBits - previousFracBits)); + cost += dist[component] + (m_lambda[component] * FRAC_BITS_SCALE * (currentFracBits - previousFracBits)); previousFracBits = currentFracBits; } @@ -729,7 +729,7 @@ void EncSampleAdaptiveOffset::deriveModeNewRDO(const BitDepths &bitDepths, int c m_CABACEstimator->getCtx() = SAOCtx( ctxStartBlk ); m_CABACEstimator->resetBits(); m_CABACEstimator->sao_block_pars( modeParam, bitDepths, sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), false ); - modeNormCost += FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + modeNormCost += FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); } void EncSampleAdaptiveOffset::deriveModeMergeRDO(const BitDepths &bitDepths, int ctuRsAddr, SAOBlkParam* mergeList[NUM_SAO_MERGE_TYPES], bool* sliceEnabled, std::vector<SAOStatData**>& blkStats, SAOBlkParam& modeParam, double& modeNormCost ) @@ -772,7 +772,7 @@ void EncSampleAdaptiveOffset::deriveModeMergeRDO(const BitDepths &bitDepths, int m_CABACEstimator->getCtx() = SAOCtx( ctxStart ); m_CABACEstimator->resetBits(); m_CABACEstimator->sao_block_pars( testBlkParam, bitDepths, sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), false ); - double rate = FracBitsScale*(double)m_CABACEstimator->getEstFracBits(); + double rate = FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); cost = normDist+rate; if(cost < modeNormCost) @@ -981,7 +981,7 @@ void EncSampleAdaptiveOffset::decideBlkParams(CodingStructure& cs, bool* sliceEn testBlkParam[COMPONENT_Y].typeIdc = SAO_MERGE_LEFT; m_CABACEstimator->resetBits(); m_CABACEstimator->sao_block_pars(testBlkParam, cs.sps->getBitDepths(), sliceEnabled, true, false, true); - double rate = FracBitsScale * (double)m_CABACEstimator->getEstFracBits(); + double rate = FRAC_BITS_SCALE * m_CABACEstimator->getEstFracBits(); modeCost += rate * groupSize; if (modeCost < minCost2) { diff --git a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.h b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.h index b882a0519c40baed87e8b3c5c5c463a3d8ffedb6..f9b9f9214872bf2c7dce3480e2a6479c0b531242 100644 --- a/source/Lib/EncoderLib/EncSampleAdaptiveOffset.h +++ b/source/Lib/EncoderLib/EncSampleAdaptiveOffset.h @@ -130,7 +130,6 @@ private: //members CABACWriter* m_CABACEstimator; CtxCache* m_CtxCache; double m_lambda[MAX_NUM_COMPONENT]; - const double FracBitsScale = 1.0 / double( 1 << SCALE_BITS ); //statistics std::vector<SAOStatData**> m_statData; //[ctu][comp][classes] diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp index 339a1c7ea65425d5776af41d9fda28944d247f23..31956e602c69333bd60a7a6fa4c75ec18deaaa31 100644 --- a/source/Lib/EncoderLib/IntraSearch.cpp +++ b/source/Lib/EncoderLib/IntraSearch.cpp @@ -274,8 +274,7 @@ bool IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, const uint32_t uiHeightBit = g_aucLog2[partitioner.currArea().lheight()]; // Lambda calculation at equivalent Qp of 4 is recommended because at that Qp, the quantization divisor is 1. - const double sqrtLambdaForFirstPass = m_pcRdCost->getMotionLambda(cu.transQuantBypass) / double(1 << SCALE_BITS); - + const double sqrtLambdaForFirstPass = m_pcRdCost->getMotionLambda(cu.transQuantBypass) * FRAC_BITS_SCALE; //===== loop over partitions =====