aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNiklas Haas <git@haasn.dev>2025-03-04 15:49:50 +0100
committerNiklas Haas <git@haasn.dev>2025-03-31 12:19:26 +0200
commit92a57f1cfdfeb67eab3f0fac5448b494e668ea66 (patch)
treef672222eca17832bddf382e7f3b162c06e903065
parent8fc9808f18a18e7f0bfcc5de62bf7d9e94f7c455 (diff)
downloadffmpeg-92a57f1cfdfeb67eab3f0fac5448b494e668ea66.tar.gz
tests/swscale: constrain reference SSIM for low bit depth formats
Sometimes, the reference SSIM is significantly higher than the SSIM level expected for the test. This is the case when the source format has a much lower bit depth than the destination format. In this case, the fact that legacy swscale does not accurately preserve the source dither pattern gives it an unfair advantage in a direct comparison, leading to false positives. For example, conversion like rgb4 -> rgb565 should be lossless, but swscale low passes / downscales the input chroma, throwing away massive amounts of detail. This gives it a higher SSIM score since the lowpassed result removes some of the dither noise that was present in the source.
-rw-r--r--libswscale/tests/swscale.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/libswscale/tests/swscale.c b/libswscale/tests/swscale.c
index 432de7d1fd..d3c0cfdc43 100644
--- a/libswscale/tests/swscale.c
+++ b/libswscale/tests/swscale.c
@@ -321,6 +321,18 @@ static int run_test(enum AVPixelFormat src_fmt, enum AVPixelFormat dst_fmt,
goto error;
get_ssim(ssim_sws, out, ref, comps);
+
+ /* Legacy swscale does not perform bit accurate upconversions of low
+ * bit depth RGB. This artificially improves the SSIM score because the
+ * resulting error deletes some of the input dither noise. This gives
+ * it an unfair advantage when compared against a bit exact reference.
+ * Work around this by ensuring that the reference SSIM score is not
+ * higher than it theoretically "should" be. */
+ if (src_var > dst_var) {
+ const float src_loss = (2 * ref_var + c1) / (2 * ref_var + src_var + c1);
+ ssim_sws[0] = FFMIN(ssim_sws[0], src_loss);
+ }
+
ssim_ref = ssim_sws;
}