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 Av1FrameBuffer? FrameBuffer { get; private set; }
public Av1FrameBuffer<byte>? FrameBuffer { get; private set; }
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>
/// Buffer for the pixels of a single frame.
/// </summary>
internal class Av1FrameBuffer : IDisposable
internal class Av1FrameBuffer<T> : IDisposable
where T : struct
{
private const int DecoderPaddingValue = 72;
private const int PictureBufferYFlag = 1 << 0;
@ -67,17 +68,17 @@ internal class Av1FrameBuffer : IDisposable
this.BufferCr = null;
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)
{
this.BufferCb = configuration.MemoryAllocator.Allocate2D<byte>(strideChroma * bitsPerPixel, heightChroma);
this.BufferCb = configuration.MemoryAllocator.Allocate2D<T>(strideChroma * bitsPerPixel, heightChroma);
}
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;
@ -93,17 +94,17 @@ internal class Av1FrameBuffer : IDisposable
/// <summary>
/// Gets the Y luma buffer.
/// </summary>
public Buffer2D<byte>? BufferY { get; private set; }
public Buffer2D<T>? BufferY { get; private set; }
/// <summary>
/// Gets the U chroma buffer.
/// </summary>
public Buffer2D<byte>? BufferCb { get; private set; }
public Buffer2D<T>? BufferCb { get; private set; }
/// <summary>
/// Gets the V chroma buffer.
/// </summary>
public Buffer2D<byte>? BufferCr { get; private set; }
public Buffer2D<T>? BufferCr { 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 ObuFrameHeader frameHeader;
private readonly Av1FrameInfo frameInfo;
private readonly Av1FrameBuffer frameBuffer;
private readonly Av1FrameBuffer<byte> frameBuffer;
private readonly Av1InverseQuantizer inverseQuantizer;
private readonly Av1DeQuantizationContext deQuants;
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.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
{
private readonly Av1FrameBuffer frameBuffer;
private readonly Av1FrameBuffer<byte> frameBuffer;
public Av1FrameEncoder(Av1FrameBuffer frameBuffer)
public Av1FrameEncoder(Av1FrameBuffer<byte> 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 ObuFrameHeader frameHeader;
private readonly Av1FrameInfo frameInfo;
private readonly Av1FrameBuffer frameBuffer;
private readonly Av1FrameBuffer<byte> frameBuffer;
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.frameHeader = frameHeader;

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

@ -17,13 +17,13 @@ internal class Av1BlockDecoder
private readonly Av1FrameInfo frameInfo;
private readonly Av1FrameBuffer frameBuffer;
private readonly Av1FrameBuffer<byte> frameBuffer;
private readonly bool isLoopFilterEnabled;
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.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;

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

@ -67,7 +67,7 @@ public class Av1ForwardTransformTests
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.
// Licensed under the Six Labors Split License.
using System.Globalization;
using SixLabors.ImageSharp.Formats.Heif.Av1;
using SixLabors.ImageSharp.Formats.Heif.Av1.Transform;
using SixLabors.ImageSharp.Formats.Heif.Av1.Transform.Forward;
@ -485,7 +486,7 @@ public class Av1InverseTransformTests
int count = Math.Min(expected.Length, 32);
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;

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

@ -24,7 +24,7 @@ public class Av1TilingTests
IAv1TileReader stub = new Av1TileDecoderStub();
ObuReader obuReader = new();
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);
Av1FrameDecoderStub frameDecoder = new();
Av1TileReader tileReader = new(Configuration.Default, obuReader.SequenceHeader, obuReader.FrameHeader, frameDecoder);

Loading…
Cancel
Save