Browse Source

Rename TileDecoder into TileReader

pull/2633/head
Ynse Hoornenborg 2 years ago
parent
commit
96329f401e
  1. 19
      src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs
  2. 10
      src/ImageSharp/Formats/Heif/Av1/IAv1TileReader.cs
  3. 6
      src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs
  4. 10
      src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs
  5. 13
      tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TileDecoderStub.cs
  6. 12
      tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TilingTests.cs
  7. 12
      tests/ImageSharp.Tests/Formats/Heif/Av1/ObuFrameHeaderTests.cs

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

@ -6,11 +6,10 @@ using SixLabors.ImageSharp.Formats.Heif.Av1.Symbol;
namespace SixLabors.ImageSharp.Formats.Heif.Av1;
internal class Av1Decoder : IAv1TileDecoder
internal class Av1Decoder : IAv1TileReader
{
private readonly ObuReader obuReader;
private Av1TileDecoder? tileDecoder;
private Av1FrameBuffer? frameBuffer;
private Av1TileReader? tileReader;
public Av1Decoder() => this.obuReader = new();
@ -18,22 +17,26 @@ internal class Av1Decoder : IAv1TileDecoder
public ObuSequenceHeader? SequenceHeader { get; private set; }
public Av1FrameBuffer? FrameBuffer { get; private set; }
public void Decode(Span<byte> buffer)
{
Av1BitStreamReader reader = new(buffer);
this.obuReader.ReadAll(ref reader, buffer.Length, this, false);
this.frameBuffer = this.tileDecoder?.FrameBuffer;
this.FrameBuffer = this.tileReader?.FrameBuffer;
// TODO: Decode the FrameBuffer
}
public void DecodeTile(Span<byte> tileData, int tileNum)
public void ReadTile(Span<byte> tileData, int tileNum)
{
if (this.tileDecoder == null)
if (this.tileReader == null)
{
this.SequenceHeader = this.obuReader.SequenceHeader;
this.FrameHeader = this.obuReader.FrameHeader;
this.tileDecoder = new Av1TileDecoder(this.SequenceHeader!, this.FrameHeader!);
this.tileReader = new Av1TileReader(this.SequenceHeader!, this.FrameHeader!);
}
this.tileDecoder.DecodeTile(tileData, tileNum);
this.tileReader.ReadTile(tileData, tileNum);
}
}

10
src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs → src/ImageSharp/Formats/Heif/Av1/IAv1TileReader.cs

@ -4,16 +4,16 @@
namespace SixLabors.ImageSharp.Formats.Heif.Av1;
/// <summary>
/// Interface for decoding of image tiles.
/// Interface for reading of image tiles.
/// </summary>
internal interface IAv1TileDecoder
internal interface IAv1TileReader
{
/// <summary>
/// Decode a single tile.
/// Read the information for a single tile.
/// </summary>
/// <param name="tileData">
/// The bytes of encoded data in the bitstream dedicated to this tile.
/// </param>
/// <param name="tileNum">The index of the tile that is to be decoded.</param>
void DecodeTile(Span<byte> tileData, int tileNum);
/// <param name="tileNum">The index of the tile that is to be read.</param>
void ReadTile(Span<byte> tileData, int tileNum);
}

6
src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs

@ -45,7 +45,7 @@ internal class ObuReader
/// <summary>
/// Decode all OBU's in a frame.
/// </summary>
public void ReadAll(ref Av1BitStreamReader reader, int dataSize, IAv1TileDecoder decoder, bool isAnnexB = false)
public void ReadAll(ref Av1BitStreamReader reader, int dataSize, IAv1TileReader decoder, bool isAnnexB = false)
{
bool seenFrameHeader = false;
bool frameDecodingFinished = false;
@ -1232,7 +1232,7 @@ internal class ObuReader
/// <summary>
/// 5.11.1. General tile group OBU syntax.
/// </summary>
private void ReadTileGroup(ref Av1BitStreamReader reader, IAv1TileDecoder decoder, ObuHeader header, out bool isLastTileGroup)
private void ReadTileGroup(ref Av1BitStreamReader reader, IAv1TileReader decoder, ObuHeader header, out bool isLastTileGroup)
{
ObuSequenceHeader sequenceHeader = this.SequenceHeader!;
ObuFrameHeader frameInfo = this.FrameHeader!;
@ -1287,7 +1287,7 @@ internal class ObuReader
}
Span<byte> tileData = reader.GetSymbolReader(tileDataSize);
decoder.DecodeTile(tileData, tileNum);
decoder.ReadTile(tileData, tileNum);
}
if (tileGroupEnd != tileCount - 1)

10
src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs → src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs

@ -8,7 +8,7 @@ using SixLabors.ImageSharp.Formats.Heif.Av1.Transform;
namespace SixLabors.ImageSharp.Formats.Heif.Av1.Symbol;
internal class Av1TileDecoder : IAv1TileDecoder
internal class Av1TileReader : IAv1TileReader
{
private static readonly int[] SgrprojXqdMid = [-32, 31];
private static readonly int[] WienerTapsMid = [3, -7, 15];
@ -34,7 +34,7 @@ internal class Av1TileDecoder : IAv1TileDecoder
private readonly int[] firstTransformOffset = new int[2];
private readonly int[] coefficientIndex = [];
public Av1TileDecoder(ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo)
public Av1TileReader(ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo)
{
this.FrameInfo = frameInfo;
this.SequenceHeader = sequenceHeader;
@ -69,7 +69,7 @@ internal class Av1TileDecoder : IAv1TileDecoder
public Av1FrameBuffer FrameBuffer { get; }
public void DecodeTile(Span<byte> tileData, int tileNum)
public void ReadTile(Span<byte> tileData, int tileNum)
{
Av1SymbolDecoder reader = new(tileData, this.FrameInfo.QuantizationParameters.BaseQIndex);
int tileColumnIndex = tileNum % this.FrameInfo.TilesInfo.TileColumnCount;
@ -740,8 +740,8 @@ internal class Av1TileDecoder : IAv1TileDecoder
for (int c = endSi; c >= startSi; --c)
{
int pos = scan[c];
int coeff_ctx = GetLowerLevelsContext(levels, pos, bwl, transformSize, transformClass);
int level = reader.ReadCoefficientsBase(coeff_ctx, transformSizeContext, planeType);
int coefficientContext = GetLowerLevelsContext(levels, pos, bwl, transformSize, transformClass);
int level = reader.ReadCoefficientsBase(coefficientContext, transformSizeContext, planeType);
if (level > Av1Constants.BaseLevelsCount)
{
int baseRangeContext = GetBaseRangeContext(levels, pos, bwl, transformClass);

13
tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TileDecoderStub.cs

@ -5,17 +5,10 @@ using SixLabors.ImageSharp.Formats.Heif.Av1;
namespace SixLabors.ImageSharp.Tests.Formats.Heif.Av1;
internal class Av1TileDecoderStub : IAv1TileDecoder
internal class Av1TileDecoderStub : IAv1TileReader
{
public void StartDecodeTiles()
{
}
public void DecodeTile(Span<byte> tileData, int tileNum)
{
}
public void FinishDecodeTiles(bool doCdef, bool doLoopRestoration)
public void ReadTile(Span<byte> tileData, int tileNum)
{
// Intentionally left blank.
}
}

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

@ -20,16 +20,16 @@ public class Av1TilingTests
byte[] content = File.ReadAllBytes(filePath);
Span<byte> headerSpan = content.AsSpan(dataOffset, dataSize);
Span<byte> tileSpan = content.AsSpan(tileOffset, dataSize - tileOffset);
Av1BitStreamReader reader = new(headerSpan);
IAv1TileDecoder stub = new Av1TileDecoderStub();
Av1BitStreamReader bitStreamReader = new(headerSpan);
IAv1TileReader stub = new Av1TileDecoderStub();
ObuReader obuReader = new();
obuReader.ReadAll(ref reader, dataSize, stub);
Av1TileDecoder decoder = new(obuReader.SequenceHeader, obuReader.FrameHeader);
obuReader.ReadAll(ref bitStreamReader, dataSize, stub);
Av1TileReader tileReader = new(obuReader.SequenceHeader, obuReader.FrameHeader);
// Act
decoder.DecodeTile(tileSpan, 0);
tileReader.ReadTile(tileSpan, 0);
// Assert
Assert.Equal(dataSize * 8, reader.BitPosition);
Assert.Equal(dataSize * 8, bitStreamReader.BitPosition);
}
}

12
tests/ImageSharp.Tests/Formats/Heif/Av1/ObuFrameHeaderTests.cs

@ -33,7 +33,7 @@ public class ObuFrameHeaderTests
byte[] content = File.ReadAllBytes(filePath);
Span<byte> span = content.AsSpan(fileOffset, blockSize);
Av1BitStreamReader reader = new(span);
IAv1TileDecoder decoder = new Av1TileDecoderStub();
IAv1TileReader decoder = new Av1TileDecoderStub();
ObuReader obuReader = new();
// Act
@ -83,7 +83,7 @@ public class ObuFrameHeaderTests
string filePath = Path.Combine(TestEnvironment.InputImagesDirectoryFullPath, filename);
byte[] content = File.ReadAllBytes(filePath);
Span<byte> span = content.AsSpan(fileOffset, blockSize);
IAv1TileDecoder tileDecoder = new Av1TileDecoderStub();
IAv1TileReader tileDecoder = new Av1TileDecoderStub();
Av1BitStreamReader reader = new(span);
ObuReader obuReader1 = new();
@ -98,7 +98,7 @@ public class ObuFrameHeaderTests
// Assign 2
Span<byte> encodedBuffer = encoded.ToArray();
IAv1TileDecoder tileDecoder2 = new Av1TileDecoderStub();
IAv1TileReader tileDecoder2 = new Av1TileDecoderStub();
Av1BitStreamReader reader2 = new(span);
ObuReader obuReader2 = new();
@ -118,7 +118,7 @@ public class ObuFrameHeaderTests
// Arrange
Av1BitStreamReader reader = new(DefaultTemporalDelimiterBitStream);
ObuReader obuReader = new();
IAv1TileDecoder tileDecoder = new Av1TileDecoderStub();
IAv1TileReader tileDecoder = new Av1TileDecoderStub();
// Act
obuReader.ReadAll(ref reader, DefaultTemporalDelimiterBitStream.Length, tileDecoder);
@ -135,7 +135,7 @@ public class ObuFrameHeaderTests
byte[] bitStream = [0x10];
Av1BitStreamReader reader = new(bitStream);
ObuReader obuReader = new();
IAv1TileDecoder tileDecoder = new Av1TileDecoderStub();
IAv1TileReader tileDecoder = new Av1TileDecoderStub();
// Act
obuReader.ReadAll(ref reader, bitStream.Length, tileDecoder);
@ -152,7 +152,7 @@ public class ObuFrameHeaderTests
byte[] bitStream = DefaultSequenceHeaderBitStream;
Av1BitStreamReader reader = new(bitStream);
ObuReader obuReader = new();
IAv1TileDecoder tileDecoder = new Av1TileDecoderStub();
IAv1TileReader tileDecoder = new Av1TileDecoderStub();
ObuSequenceHeader expected = GetDefaultSequenceHeader();
// Act

Loading…
Cancel
Save