diff --git a/source/Lib/EncoderLib/IntraSearch.cpp b/source/Lib/EncoderLib/IntraSearch.cpp index b0a448fb136abf34a14ddbbcf1456b5b09f50b9e..c0a24e92f00d296ac0bf0dce796972f6be21c40a 100644 --- a/source/Lib/EncoderLib/IntraSearch.cpp +++ b/source/Lib/EncoderLib/IntraSearch.cpp @@ -443,7 +443,11 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, for( int modeIdx = 0; modeIdx < numModesAvailable; modeIdx++ ) { uint32_t uiMode = modeIdx; +#if JVET_N0363_INTRA_COST_MOD + Distortion minSadHad = 0; +#else Distortion uiSad = 0; +#endif // Skip checking extended Angular modes in the first round of SATD if( uiMode > DC_IDX && ( uiMode & 1 ) ) @@ -467,7 +471,7 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, #if JVET_N0363_INTRA_COST_MOD // Use the min between SAD and HAD as the cost criterion // SAD is scaled by 2 to align with the scaling of HAD - uiSad += std::min(distParamSad.distFunc(distParamSad)*2, distParamHad.distFunc(distParamHad)); + minSadHad += std::min(distParamSad.distFunc(distParamSad)*2, distParamHad.distFunc(distParamHad)); #else // use Hadamard transform here uiSad += distParam.distFunc(distParam); @@ -480,16 +484,28 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, uint64_t fracModeBits = xFracModeBitsIntra(pu, uiMode, CHANNEL_TYPE_LUMA); +#if JVET_N0363_INTRA_COST_MOD + double cost = ( double ) minSadHad + (double)fracModeBits * sqrtLambdaForFirstPass; + + DTRACE(g_trace_ctx, D_INTRA_COST, "IntraHAD: %u, %llu, %f (%d)\n", minSadHad, fracModeBits, cost, uiMode); +#else double cost = ( double ) uiSad + ( double ) fracModeBits * sqrtLambdaForFirstPass; DTRACE( g_trace_ctx, D_INTRA_COST, "IntraHAD: %u, %llu, %f (%d)\n", uiSad, fracModeBits, cost, uiMode ); +#endif updateCandList( uiMode, cost, uiRdModeList, CandCostList , extendRefList, 0 , numModesForFullRD + extraModes ); +#if JVET_N0363_INTRA_COST_MOD + updateCandList(uiMode, (double) minSadHad, uiHadModeList, CandHadList + , *nullList, -1 + , 3 + extraModes); +#else updateCandList(uiMode, (double) uiSad, uiHadModeList, CandHadList , *nullList, -1 , 3 + extraModes); +#endif } } // NSSTFlag @@ -528,7 +544,7 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, #if JVET_N0363_INTRA_COST_MOD // Use the min between SAD and SATD as the cost criterion // SAD is scaled by 2 to align with the scaling of HAD - Distortion sad = std::min(distParamSad.distFunc(distParamSad)*2, distParamHad.distFunc(distParamHad)); + Distortion minSadHad = std::min(distParamSad.distFunc(distParamSad)*2, distParamHad.distFunc(distParamHad)); #else // use Hadamard transform here Distortion sad = distParam.distFunc(distParam); @@ -541,14 +557,25 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, uint64_t fracModeBits = xFracModeBitsIntra(pu, mode, CHANNEL_TYPE_LUMA); +#if JVET_N0363_INTRA_COST_MOD + double cost = (double) minSadHad + (double) fracModeBits * sqrtLambdaForFirstPass; +#else double cost = (double) sad + (double) fracModeBits * sqrtLambdaForFirstPass; +#endif updateCandList(mode, cost, uiRdModeList, CandCostList , extendRefList, 0 , numModesForFullRD); +#if JVET_N0363_INTRA_COST_MOD + + updateCandList(mode, (double)minSadHad, uiHadModeList, CandHadList + , *nullList, -1 + , 3); +#else updateCandList(mode, (double)sad, uiHadModeList, CandHadList , *nullList, -1 , 3); +#endif bSatdChecked[mode] = true; } @@ -597,7 +624,7 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, #if JVET_N0363_INTRA_COST_MOD // Use the min between SAD and SATD as the cost criterion // SAD is scaled by 2 to align with the scaling of HAD - Distortion sad = std::min(distParamSad.distFunc(distParamSad)*2, distParamHad.distFunc(distParamHad)); + Distortion minSadHad = std::min(distParamSad.distFunc(distParamSad)*2, distParamHad.distFunc(distParamHad)); #else // use Hadamard transform here Distortion sad = distParam.distFunc(distParam); @@ -610,7 +637,11 @@ void IntraSearch::estIntraPredLumaQT( CodingUnit &cu, Partitioner &partitioner, uint64_t fracModeBits = xFracModeBitsIntra(pu, mode, CHANNEL_TYPE_LUMA); +#if JVET_N0363_INTRA_COST_MOD + double cost = (double)minSadHad + (double)fracModeBits * sqrtLambdaForFirstPass; +#else double cost = (double)sad + (double)fracModeBits * sqrtLambdaForFirstPass; +#endif updateCandList(mode, cost, uiRdModeList, CandCostList, extendRefList, multiRefIdx, numModesForFullRD); } }