From f85a00a146e9cd51fa93d8f978996ad5cb529d61 Mon Sep 17 00:00:00 2001 From: Renjie Chang <renjiechang@tencent.com> Date: Thu, 27 Jul 2023 10:32:17 +0800 Subject: [PATCH] JVET-AE0162: fix MS-SSIM calculation for RPR/SR --- source/Lib/EncoderLib/Analyze.h | 8 +++++++- source/Lib/EncoderLib/EncGOP.cpp | 15 +++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/source/Lib/EncoderLib/Analyze.h b/source/Lib/EncoderLib/Analyze.h index e0c0b7c04..2debd465c 100644 --- a/source/Lib/EncoderLib/Analyze.h +++ b/source/Lib/EncoderLib/Analyze.h @@ -67,6 +67,7 @@ private: double m_mseYuvFrame[MAX_NUM_COMPONENT]; // sum of MSEs double m_upscaledPSNR[MAX_NUM_COMPONENT]; double m_msssim[MAX_NUM_COMPONENT]; + double m_upscaledMsssim[MAX_NUM_COMPONENT]; #if EXTENSION_360_VIDEO TExt360EncAnalyze m_ext360; @@ -82,7 +83,7 @@ public: void addResult(const double psnr[MAX_NUM_COMPONENT], double bits, const double mseYuvFrame[MAX_NUM_COMPONENT], const double upscaledPSNR[MAX_NUM_COMPONENT], const double msssim[MAX_NUM_COMPONENT], - bool isEncodeLtRef) + const double upscaledMsssim[MAX_NUM_COMPONENT], bool isEncodeLtRef) { m_dAddBits += bits; if (isEncodeLtRef) @@ -95,6 +96,7 @@ public: m_mseYuvFrame[i] += mseYuvFrame[i]; m_upscaledPSNR[i] += upscaledPSNR[i]; m_msssim[i] += msssim[i]; + m_upscaledMsssim[i] += upscaledMsssim[i]; } m_picCount++; @@ -134,6 +136,7 @@ public: m_mseYuvFrame[i] = 0; m_upscaledPSNR[i] = 0; m_msssim[i] = 0; + m_upscaledMsssim[i] = 0; } m_picCount = 0; #if EXTENSION_360_VIDEO @@ -317,6 +320,9 @@ public: addField("Y-PSNR2 ", "%-8.4lf ", m_upscaledPSNR[COMPONENT_Y] / (double) getNumPic()); addField("U-PSNR2 ", "%-8.4lf ", m_upscaledPSNR[COMPONENT_Cb] / (double) getNumPic(), withchroma); addField("V-PSNR2 ", "%-8.4lf ", m_upscaledPSNR[COMPONENT_Cr] / (double) getNumPic(), withchroma); + addField("Y-MS-SSIM2 ", "%-11.7lf ", m_upscaledMsssim[COMPONENT_Y] / (double) getNumPic()); + addField("U-MS-SSIM2 ", "%-11.7lf ", m_upscaledMsssim[COMPONENT_Cb] / (double) getNumPic(), withchroma); + addField("V-MS-SSIM2 ", "%-11.7lf ", m_upscaledMsssim[COMPONENT_Cr] / (double) getNumPic(), withchroma); } header=headeross.str(); metrics=metricoss.str(); diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 32694719b..93a579a30 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -5095,6 +5095,7 @@ void EncGOP::xCalculateAddPSNR(Picture* pcPic, PelUnitBuf cPicD, const AccessUni double MSEyuvframeWeighted[MAX_NUM_COMPONENT]; #endif double upscaledPSNR[MAX_NUM_COMPONENT]; + double upscaledMsssim[MAX_NUM_COMPONENT]; for(int i=0; i<MAX_NUM_COMPONENT; i++) { dPSNR[i]=0.0; @@ -5263,6 +5264,7 @@ void EncGOP::xCalculateAddPSNR(Picture* pcPic, PelUnitBuf cPicD, const AccessUni #endif upscaledPSNR[comp] = upscaledSSD ? 10.0 * log10( (double)maxval * maxval * upscaledWidth * upscaledHeight / (double)upscaledSSD ) : 999.99; + upscaledMsssim[comp] = xCalculateMSSSIM (upscaledOrgPB.bufAt(0, 0), upscaledOrgPB.stride, upscaledRecPB.bufAt(0, 0), upscaledRecPB.stride, upscaledWidth, upscaledHeight, bitDepth); } else if (picRefLayer) { @@ -5322,7 +5324,7 @@ void EncGOP::xCalculateAddPSNR(Picture* pcPic, PelUnitBuf cPicD, const AccessUni m_rvm.push_back(uibits); //===== add PSNR ===== - m_gcAnalyzeAll.addResult(dPSNR, (double) uibits, mseYuvFrame, upscaledPSNR, msssim, isEncodeLtRef); + m_gcAnalyzeAll.addResult(dPSNR, (double) uibits, mseYuvFrame, upscaledPSNR, msssim, upscaledMsssim, isEncodeLtRef); #if EXTENSION_360_VIDEO m_ext360.addResult(m_gcAnalyzeAll); #endif @@ -5334,7 +5336,7 @@ void EncGOP::xCalculateAddPSNR(Picture* pcPic, PelUnitBuf cPicD, const AccessUni #endif if (pcSlice->isIntra()) { - m_gcAnalyzeI.addResult(dPSNR, (double) uibits, mseYuvFrame, upscaledPSNR, msssim, isEncodeLtRef); + m_gcAnalyzeI.addResult(dPSNR, (double) uibits, mseYuvFrame, upscaledPSNR, msssim, upscaledMsssim, isEncodeLtRef); *PSNR_Y = dPSNR[COMPONENT_Y]; #if EXTENSION_360_VIDEO m_ext360.addResult(m_gcAnalyzeI); @@ -5348,7 +5350,7 @@ void EncGOP::xCalculateAddPSNR(Picture* pcPic, PelUnitBuf cPicD, const AccessUni } if (pcSlice->isInterP()) { - m_gcAnalyzeP.addResult(dPSNR, (double) uibits, mseYuvFrame, upscaledPSNR, msssim, isEncodeLtRef); + m_gcAnalyzeP.addResult(dPSNR, (double) uibits, mseYuvFrame, upscaledPSNR, msssim, upscaledMsssim, isEncodeLtRef); *PSNR_Y = dPSNR[COMPONENT_Y]; #if EXTENSION_360_VIDEO m_ext360.addResult(m_gcAnalyzeP); @@ -5362,7 +5364,7 @@ void EncGOP::xCalculateAddPSNR(Picture* pcPic, PelUnitBuf cPicD, const AccessUni } if (pcSlice->isInterB()) { - m_gcAnalyzeB.addResult(dPSNR, (double) uibits, mseYuvFrame, upscaledPSNR, msssim, isEncodeLtRef); + m_gcAnalyzeB.addResult(dPSNR, (double) uibits, mseYuvFrame, upscaledPSNR, msssim, upscaledMsssim, isEncodeLtRef); *PSNR_Y = dPSNR[COMPONENT_Y]; #if EXTENSION_360_VIDEO m_ext360.addResult(m_gcAnalyzeB); @@ -5377,7 +5379,7 @@ void EncGOP::xCalculateAddPSNR(Picture* pcPic, PelUnitBuf cPicD, const AccessUni #if WCG_WPSNR if (useLumaWPSNR) { - m_gcAnalyzeWPSNR.addResult( dPSNRWeighted, (double)uibits, MSEyuvframeWeighted, upscaledPSNR, msssim, isEncodeLtRef ); + m_gcAnalyzeWPSNR.addResult( dPSNRWeighted, (double)uibits, MSEyuvframeWeighted, upscaledPSNR, msssim, upscaledMsssim, isEncodeLtRef ); } #endif @@ -5536,6 +5538,7 @@ void EncGOP::xCalculateAddPSNR(Picture* pcPic, PelUnitBuf cPicD, const AccessUni if (m_pcEncLib->isResChangeInClvsEnabled()) { msg( NOTICE, " [Y2 %6.4lf dB U2 %6.4lf dB V2 %6.4lf dB]", upscaledPSNR[COMPONENT_Y], upscaledPSNR[COMPONENT_Cb], upscaledPSNR[COMPONENT_Cr] ); + msg( NOTICE, " MS-SSIM2: [Y %6.4lf U %6.4lf V %6.4lf ]", upscaledMsssim[COMPONENT_Y], upscaledMsssim[COMPONENT_Cb], upscaledMsssim[COMPONENT_Cr] ); } else if (m_pcEncLib->isRefLayerRescaledAvailable()) { @@ -6048,7 +6051,7 @@ void EncGOP::xCalculateInterlacedAddPSNR( Picture* pcPicOrgFirstField, Picture* uint32_t uibits = 0; // the number of bits for the pair is not calculated here - instead the overall total is used elsewhere. //===== add PSNR ===== - m_gcAnalyzeAllField.addResult(dPSNR, (double) uibits, mseYuvFrame, mseYuvFrame, msssim, isEncodeLtRef); + m_gcAnalyzeAllField.addResult(dPSNR, (double) uibits, mseYuvFrame, mseYuvFrame, msssim, msssim, isEncodeLtRef); *PSNR_Y = dPSNR[COMPONENT_Y]; -- GitLab