Browse Source

Scan order unit test and fixes

pull/2633/head
Ynse Hoornenborg 2 years ago
parent
commit
26d8c2225d
  1. 8
      src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs
  2. 913
      src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrderConstants.cs
  3. 8
      src/ImageSharp/Formats/Heif/Av1/Transform/Av1TransformSizeExtensions.cs
  4. 37
      tests/ImageSharp.Tests/Formats/Heif/Av1/Av1ScanOrderTests.cs

8
src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs

@ -8,20 +8,20 @@ internal readonly struct Av1ScanOrder
public Av1ScanOrder(short[] scan)
{
this.Scan = scan;
this.IScan = [];
this.InverseScan = [];
this.Neighbors = [];
}
public Av1ScanOrder(short[] scan, short[] iscan, short[] neighbors)
public Av1ScanOrder(short[] scan, short[] inverseScan, short[] neighbors)
{
this.Scan = scan;
this.IScan = iscan;
this.InverseScan = inverseScan;
this.Neighbors = neighbors;
}
public short[] Scan { get; }
public short[] IScan { get; }
public short[] InverseScan { get; }
public short[] Neighbors { get; }
}

913
src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrderConstants.cs

File diff suppressed because it is too large

8
src/ImageSharp/Formats/Heif/Av1/Transform/Av1TransformSizeExtensions.cs

@ -141,13 +141,9 @@ internal static class Av1TransformSizeExtensions
return (pels > 1024) ? 2 : (pels > 256) ? 1 : 0;
}
public static int GetWidth(this Av1TransformSize size) => (int)size;
public static int GetWidth(this Av1TransformSize size) => WideUnit[(int)size] << 2;
public static int GetHeight(this Av1TransformSize size) => (int)size;
public static int GetWidthLog2(this Av1TransformSize size) => (int)size;
public static int GetHeightLog2(this Av1TransformSize size) => (int)size;
public static int GetHeight(this Av1TransformSize size) => HighUnit[(int)size] << 2;
public static int Get4x4WideCount(this Av1TransformSize size) => WideUnit[(int)size];

37
tests/ImageSharp.Tests/Formats/Heif/Av1/Av1ScanOrderTests.cs

@ -28,6 +28,43 @@ public class Av1ScanOrderTests
}
}
[Theory]
[MemberData(nameof(GetCombinations))]
internal void AllIndicesScannedAreWithinRange(int s, int t)
{
// Assign
Av1TransformSize transformSize = (Av1TransformSize)s;
Av1TransformType transformType = (Av1TransformType)t;
int lowValue = 0;
// Act
Av1ScanOrder scanOrder = Av1ScanOrderConstants.GetScanOrder(transformSize, transformType);
int highValue = scanOrder.Scan.Length - 1;
// Assert
foreach (short scan in scanOrder.Scan)
{
Assert.InRange(scan, lowValue, highValue);
}
}
[Theory]
[MemberData(nameof(GetCombinations))]
internal void CorrectNumberOfIndicesScanned(int s, int t)
{
// Assign
Av1TransformSize transformSize = (Av1TransformSize)s;
Av1TransformType transformType = (Av1TransformType)t;
int width = Math.Min(transformSize.GetWidth(), 32);
int height = Math.Min(transformSize.GetHeight(), 32);
// Act
Av1ScanOrder scanOrder = Av1ScanOrderConstants.GetScanOrder(transformSize, transformType);
// Assert
Assert.Equal(width * height, scanOrder.Scan.Length);
}
public static TheoryData<int, int> GetCombinations()
{
TheoryData<int, int> combinations = [];

Loading…
Cancel
Save