Browse Source

Make Av1FrameBuffer generic

pull/2633/head
Ynse Hoornenborg 2 years ago
parent
commit
4f96ba9854
  1. 2
      src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs
  2. 15
      src/ImageSharp/Formats/Heif/Av1/Av1FrameBuffer.cs
  3. 4
      src/ImageSharp/Formats/Heif/Av1/Pipeline/Av1FrameDecoder.cs
  4. 4
      src/ImageSharp/Formats/Heif/Av1/Pipeline/Av1FrameEncoder.cs
  5. 4
      src/ImageSharp/Formats/Heif/Av1/Pipeline/LoopFilter/Av1LoopFilterDecoder.cs
  6. 6
      src/ImageSharp/Formats/Heif/Av1/Transform/Av1BlockDecoder.cs
  7. 2
      tests/ImageSharp.Tests/Formats/Heif/Av1/Av1ForwardTransformTests.cs
  8. 3
      tests/ImageSharp.Tests/Formats/Heif/Av1/Av1InverseTransformTests.cs
  9. 2
      tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TilingTests.cs

2
src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs

@ -26,7 +26,7 @@ internal class Av1Decoder : IAv1TileReader
public Av1FrameInfo? FrameInfo { get; private set; } public Av1FrameInfo? FrameInfo { get; private set; }
public Av1FrameBuffer? FrameBuffer { get; private set; } public Av1FrameBuffer<byte>? FrameBuffer { get; private set; }
public void Decode(Span<byte> buffer) public void Decode(Span<byte> buffer)
{ {

15
src/ImageSharp/Formats/Heif/Av1/Av1FrameBuffer.cs

@ -9,7 +9,8 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1;
/// <summary> /// <summary>
/// Buffer for the pixels of a single frame. /// Buffer for the pixels of a single frame.
/// </summary> /// </summary>
internal class Av1FrameBuffer : IDisposable internal class Av1FrameBuffer<T> : IDisposable
where T : struct
{ {
private const int DecoderPaddingValue = 72; private const int DecoderPaddingValue = 72;
private const int PictureBufferYFlag = 1 << 0; private const int PictureBufferYFlag = 1 << 0;
@ -67,17 +68,17 @@ internal class Av1FrameBuffer : IDisposable
this.BufferCr = null; this.BufferCr = null;
if ((this.BufferEnableMask & PictureBufferYFlag) != 0) if ((this.BufferEnableMask & PictureBufferYFlag) != 0)
{ {
this.BufferY = configuration.MemoryAllocator.Allocate2D<byte>(strideY * bitsPerPixel, heightY); this.BufferY = configuration.MemoryAllocator.Allocate2D<T>(strideY * bitsPerPixel, heightY);
} }
if ((this.BufferEnableMask & PictureBufferCbFlag) != 0) if ((this.BufferEnableMask & PictureBufferCbFlag) != 0)
{ {
this.BufferCb = configuration.MemoryAllocator.Allocate2D<byte>(strideChroma * bitsPerPixel, heightChroma); this.BufferCb = configuration.MemoryAllocator.Allocate2D<T>(strideChroma * bitsPerPixel, heightChroma);
} }
if ((this.BufferEnableMask & PictureBufferCrFlag) != 0) if ((this.BufferEnableMask & PictureBufferCrFlag) != 0)
{ {
this.BufferCr = configuration.MemoryAllocator.Allocate2D<byte>(strideChroma * bitsPerPixel, heightChroma); this.BufferCr = configuration.MemoryAllocator.Allocate2D<T>(strideChroma * bitsPerPixel, heightChroma);
} }
this.BitIncrementY = null; this.BitIncrementY = null;
@ -93,17 +94,17 @@ internal class Av1FrameBuffer : IDisposable
/// <summary> /// <summary>
/// Gets the Y luma buffer. /// Gets the Y luma buffer.
/// </summary> /// </summary>
public Buffer2D<byte>? BufferY { get; private set; } public Buffer2D<T>? BufferY { get; private set; }
/// <summary> /// <summary>
/// Gets the U chroma buffer. /// Gets the U chroma buffer.
/// </summary> /// </summary>
public Buffer2D<byte>? BufferCb { get; private set; } public Buffer2D<T>? BufferCb { get; private set; }
/// <summary> /// <summary>
/// Gets the V chroma buffer. /// Gets the V chroma buffer.
/// </summary> /// </summary>
public Buffer2D<byte>? BufferCr { get; private set; } public Buffer2D<T>? BufferCr { get; private set; }
public Buffer2D<byte>? BitIncrementY { get; private set; } public Buffer2D<byte>? BitIncrementY { get; private set; }

4
src/ImageSharp/Formats/Heif/Av1/Pipeline/Av1FrameDecoder.cs

@ -13,12 +13,12 @@ internal class Av1FrameDecoder : IAv1FrameDecoder
private readonly ObuSequenceHeader sequenceHeader; private readonly ObuSequenceHeader sequenceHeader;
private readonly ObuFrameHeader frameHeader; private readonly ObuFrameHeader frameHeader;
private readonly Av1FrameInfo frameInfo; private readonly Av1FrameInfo frameInfo;
private readonly Av1FrameBuffer frameBuffer; private readonly Av1FrameBuffer<byte> frameBuffer;
private readonly Av1InverseQuantizer inverseQuantizer; private readonly Av1InverseQuantizer inverseQuantizer;
private readonly Av1DeQuantizationContext deQuants; private readonly Av1DeQuantizationContext deQuants;
private readonly Av1BlockDecoder blockDecoder; private readonly Av1BlockDecoder blockDecoder;
public Av1FrameDecoder(ObuSequenceHeader sequenceHeader, ObuFrameHeader frameHeader, Av1FrameInfo frameInfo, Av1FrameBuffer frameBuffer) public Av1FrameDecoder(ObuSequenceHeader sequenceHeader, ObuFrameHeader frameHeader, Av1FrameInfo frameInfo, Av1FrameBuffer<byte> frameBuffer)
{ {
this.sequenceHeader = sequenceHeader; this.sequenceHeader = sequenceHeader;
this.frameHeader = frameHeader; this.frameHeader = frameHeader;

4
src/ImageSharp/Formats/Heif/Av1/Pipeline/Av1FrameEncoder.cs

@ -7,9 +7,9 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Pipeline;
internal class Av1FrameEncoder internal class Av1FrameEncoder
{ {
private readonly Av1FrameBuffer frameBuffer; private readonly Av1FrameBuffer<byte> frameBuffer;
public Av1FrameEncoder(Av1FrameBuffer frameBuffer) public Av1FrameEncoder(Av1FrameBuffer<byte> frameBuffer)
{ {
this.frameBuffer = frameBuffer; this.frameBuffer = frameBuffer;
} }

4
src/ImageSharp/Formats/Heif/Av1/Pipeline/LoopFilter/Av1LoopFilterDecoder.cs

@ -11,10 +11,10 @@ internal class Av1LoopFilterDecoder
private readonly ObuSequenceHeader sequenceHeader; private readonly ObuSequenceHeader sequenceHeader;
private readonly ObuFrameHeader frameHeader; private readonly ObuFrameHeader frameHeader;
private readonly Av1FrameInfo frameInfo; private readonly Av1FrameInfo frameInfo;
private readonly Av1FrameBuffer frameBuffer; private readonly Av1FrameBuffer<byte> frameBuffer;
private readonly Av1LoopFilterContext loopFilterContext; private readonly Av1LoopFilterContext loopFilterContext;
public Av1LoopFilterDecoder(ObuSequenceHeader sequenceHeader, ObuFrameHeader frameHeader, Av1FrameInfo frameInfo, Av1FrameBuffer frameBuffer) public Av1LoopFilterDecoder(ObuSequenceHeader sequenceHeader, ObuFrameHeader frameHeader, Av1FrameInfo frameInfo, Av1FrameBuffer<byte> frameBuffer)
{ {
this.sequenceHeader = sequenceHeader; this.sequenceHeader = sequenceHeader;
this.frameHeader = frameHeader; this.frameHeader = frameHeader;

6
src/ImageSharp/Formats/Heif/Av1/Transform/Av1BlockDecoder.cs

@ -17,13 +17,13 @@ internal class Av1BlockDecoder
private readonly Av1FrameInfo frameInfo; private readonly Av1FrameInfo frameInfo;
private readonly Av1FrameBuffer frameBuffer; private readonly Av1FrameBuffer<byte> frameBuffer;
private readonly bool isLoopFilterEnabled; private readonly bool isLoopFilterEnabled;
private readonly int[] currentCoefficientIndex; private readonly int[] currentCoefficientIndex;
public Av1BlockDecoder(ObuSequenceHeader sequenceHeader, ObuFrameHeader frameHeader, Av1FrameInfo frameInfo, Av1FrameBuffer frameBuffer) public Av1BlockDecoder(ObuSequenceHeader sequenceHeader, ObuFrameHeader frameHeader, Av1FrameInfo frameInfo, Av1FrameBuffer<byte> frameBuffer)
{ {
this.sequenceHeader = sequenceHeader; this.sequenceHeader = sequenceHeader;
this.frameHeader = frameHeader; this.frameHeader = frameHeader;
@ -221,7 +221,7 @@ internal class Av1BlockDecoder
} }
} }
private static void DeriveBlockPointers(Av1FrameBuffer frameBuffer, int plane, int blockColumnInPixels, int blockRowInPixels, out Span<byte> blockReconstructionBuffer, out int reconstructionStride, int subX, int subY) private static void DeriveBlockPointers(Av1FrameBuffer<byte> frameBuffer, int plane, int blockColumnInPixels, int blockRowInPixels, out Span<byte> blockReconstructionBuffer, out int reconstructionStride, int subX, int subY)
{ {
int blockOffset; int blockOffset;

2
tests/ImageSharp.Tests/Formats/Heif/Av1/Av1ForwardTransformTests.cs

@ -67,7 +67,7 @@ public class Av1ForwardTransformTests
if (actual.EndsWith("Identity", StringComparison.InvariantCulture)) if (actual.EndsWith("Identity", StringComparison.InvariantCulture))
{ {
actual = "Vertical" + actual.Replace("Identity", ""); actual = "Vertical" + actual.Replace("Identity", string.Empty);
} }
} }

3
tests/ImageSharp.Tests/Formats/Heif/Av1/Av1InverseTransformTests.cs

@ -1,6 +1,7 @@
// Copyright (c) Six Labors. // Copyright (c) Six Labors.
// Licensed under the Six Labors Split License. // Licensed under the Six Labors Split License.
using System.Globalization;
using SixLabors.ImageSharp.Formats.Heif.Av1; using SixLabors.ImageSharp.Formats.Heif.Av1;
using SixLabors.ImageSharp.Formats.Heif.Av1.Transform; using SixLabors.ImageSharp.Formats.Heif.Av1.Transform;
using SixLabors.ImageSharp.Formats.Heif.Av1.Transform.Forward; using SixLabors.ImageSharp.Formats.Heif.Av1.Transform.Forward;
@ -485,7 +486,7 @@ public class Av1InverseTransformTests
int count = Math.Min(expected.Length, 32); int count = Math.Min(expected.Length, 32);
for (int ni = 0; ni < count; ++ni) for (int ni = 0; ni < count; ++ni)
{ {
maximumErrorInTest = Math.Max(maximumErrorInTest, Math.Abs(Convert.ToInt32(actual[ni]) - Convert.ToInt32(expected[ni]))); maximumErrorInTest = Math.Max(maximumErrorInTest, Math.Abs(Convert.ToInt32(actual[ni], CultureInfo.InvariantCulture) - Convert.ToInt32(expected[ni], CultureInfo.InvariantCulture)));
} }
return maximumErrorInTest; return maximumErrorInTest;

2
tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TilingTests.cs

@ -24,7 +24,7 @@ public class Av1TilingTests
IAv1TileReader stub = new Av1TileDecoderStub(); IAv1TileReader stub = new Av1TileDecoderStub();
ObuReader obuReader = new(); ObuReader obuReader = new();
obuReader.ReadAll(ref bitStreamReader, dataSize, () => stub); obuReader.ReadAll(ref bitStreamReader, dataSize, () => stub);
Av1FrameBuffer frameBuffer = new(Configuration.Default, obuReader.SequenceHeader, Av1ColorFormat.Yuv444, false); Av1FrameBuffer<byte> frameBuffer = new(Configuration.Default, obuReader.SequenceHeader, Av1ColorFormat.Yuv444, false);
Av1FrameInfo frameInfo = new(obuReader.SequenceHeader); Av1FrameInfo frameInfo = new(obuReader.SequenceHeader);
Av1FrameDecoderStub frameDecoder = new(); Av1FrameDecoderStub frameDecoder = new();
Av1TileReader tileReader = new(Configuration.Default, obuReader.SequenceHeader, obuReader.FrameHeader, frameDecoder); Av1TileReader tileReader = new(Configuration.Default, obuReader.SequenceHeader, obuReader.FrameHeader, frameDecoder);

Loading…
Cancel
Save