diff --git a/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1ResidualBuilderTests.cs b/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1ResidualBuilderTests.cs index c101284760..247e59cef2 100644 --- a/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1ResidualBuilderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1ResidualBuilderTests.cs @@ -205,16 +205,7 @@ public class Av1ResidualBuilderTests Av1ResidualBuilder.Subtract(sourcePlane, sourceStride, predictionPlane, predictionStride, actualPlane, residualStride, width, height); Assert.Equal(expected, actual); - - long expectedSquaredError = 0; - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - int difference = sourcePlane[(y * sourceStride) + x] - predictionPlane[(y * predictionStride) + x]; - expectedSquaredError += difference * difference; - } - } + long expectedSquaredError = CalculateReferenceSquaredError(expectedPlane, residualStride, width, height); Assert.Equal( expectedSquaredError, @@ -254,16 +245,7 @@ public class Av1ResidualBuilderTests Av1ResidualBuilder.Subtract(sourcePlane, sourceStride, predictionPlane, predictionStride, actualPlane, residualStride, width, height); Assert.Equal(expected, actual); - - long expectedSquaredError = 0; - for (int y = 0; y < height; y++) - { - for (int x = 0; x < width; x++) - { - int difference = sourcePlane[(y * sourceStride) + x] - predictionPlane[(y * predictionStride) + x]; - expectedSquaredError += difference * difference; - } - } + long expectedSquaredError = CalculateReferenceSquaredError(expectedPlane, residualStride, width, height); Assert.Equal( expectedSquaredError, @@ -348,6 +330,30 @@ public class Av1ResidualBuilderTests } } + /// + /// Calculates residual energy with scalar arithmetic independently of the vectorized implementation under test. + /// + private static long CalculateReferenceSquaredError( + ReadOnlySpan residual, + int residualStride, + int width, + int height) + { + long squaredError = 0; + + // Only coded samples contribute to the error metric; stride padding must remain outside the calculation. + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + int value = residual[(y * residualStride) + x]; + squaredError += value * value; + } + } + + return squaredError; + } + private static void AssertEqual(ReadOnlySpan expected, ReadOnlySpan actual, int count) { for (int i = 0; i < count; i++)