diff --git a/src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs b/src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs index 7721f6d39..eb6fba714 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs +++ b/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 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 tileData, int tileNum) + public void ReadTile(Span 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); } } diff --git a/src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs b/src/ImageSharp/Formats/Heif/Av1/IAv1TileReader.cs similarity index 66% rename from src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs rename to src/ImageSharp/Formats/Heif/Av1/IAv1TileReader.cs index 839f49619..3bbef50bc 100644 --- a/src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs +++ b/src/ImageSharp/Formats/Heif/Av1/IAv1TileReader.cs @@ -4,16 +4,16 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1; /// -/// Interface for decoding of image tiles. +/// Interface for reading of image tiles. /// -internal interface IAv1TileDecoder +internal interface IAv1TileReader { /// - /// Decode a single tile. + /// Read the information for a single tile. /// /// /// The bytes of encoded data in the bitstream dedicated to this tile. /// - /// The index of the tile that is to be decoded. - void DecodeTile(Span tileData, int tileNum); + /// The index of the tile that is to be read. + void ReadTile(Span tileData, int tileNum); } diff --git a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs index 36c9b0c15..3ce0fb5ef 100644 --- a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs +++ b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs @@ -45,7 +45,7 @@ internal class ObuReader /// /// Decode all OBU's in a frame. /// - 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 /// /// 5.11.1. General tile group OBU syntax. /// - 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 tileData = reader.GetSymbolReader(tileDataSize); - decoder.DecodeTile(tileData, tileNum); + decoder.ReadTile(tileData, tileNum); } if (tileGroupEnd != tileCount - 1) diff --git a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs similarity index 99% rename from src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs rename to src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs index a66a8ee46..9202ffd75 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs +++ b/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 tileData, int tileNum) + public void ReadTile(Span 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); diff --git a/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TileDecoderStub.cs b/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TileDecoderStub.cs index b3346e48a..67f9b0b3e 100644 --- a/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TileDecoderStub.cs +++ b/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 tileData, int tileNum) - { - } - - public void FinishDecodeTiles(bool doCdef, bool doLoopRestoration) + public void ReadTile(Span tileData, int tileNum) { + // Intentionally left blank. } } diff --git a/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TilingTests.cs b/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TilingTests.cs index 7348e33f3..60d62d60a 100644 --- a/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TilingTests.cs +++ b/tests/ImageSharp.Tests/Formats/Heif/Av1/Av1TilingTests.cs @@ -20,16 +20,16 @@ public class Av1TilingTests byte[] content = File.ReadAllBytes(filePath); Span headerSpan = content.AsSpan(dataOffset, dataSize); Span 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); } } diff --git a/tests/ImageSharp.Tests/Formats/Heif/Av1/ObuFrameHeaderTests.cs b/tests/ImageSharp.Tests/Formats/Heif/Av1/ObuFrameHeaderTests.cs index bb2d99a2f..5b5d82836 100644 --- a/tests/ImageSharp.Tests/Formats/Heif/Av1/ObuFrameHeaderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Heif/Av1/ObuFrameHeaderTests.cs @@ -33,7 +33,7 @@ public class ObuFrameHeaderTests byte[] content = File.ReadAllBytes(filePath); Span 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 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 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