diff --git a/src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs b/src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs
index 884169738..edd4940bf 100644
--- a/src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs
+++ b/src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs
@@ -32,12 +32,12 @@ internal class Av1Decoder : IAv1TileDecoder
ObuReader.Read(ref reader, buffer.Length, this, false);
}
- public void DecodeTile(ref Av1BitStreamReader reader, int tileNum)
+ public void DecodeTile(int tileNum)
{
// TODO: Implement
}
- public void FinishDecodeTiles(ref Av1BitStreamReader reader, bool doCdef, bool doLoopRestoration)
+ public void FinishDecodeTiles(bool doCdef, bool doLoopRestoration)
{
// TODO: Implement
}
diff --git a/src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs b/src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs
new file mode 100644
index 000000000..345cd29fe
--- /dev/null
+++ b/src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs
@@ -0,0 +1,55 @@
+// Copyright (c) Six Labors.
+// Licensed under the Six Labors Split License.
+
+using SixLabors.ImageSharp.Formats.Heif.Av1.OpenBitstreamUnit;
+
+namespace SixLabors.ImageSharp.Formats.Heif.Av1;
+
+///
+/// Interface for decoding of image tiles.
+///
+internal interface IAv1TileDecoder
+{
+ ///
+ /// Gets or sets a value indicating whether a sequence header has been read.
+ ///
+ bool SequenceHeaderDone { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether to show the existing frame.
+ ///
+ bool ShowExistingFrame { get; set; }
+
+ ///
+ /// Gets or sets a value indicating whether a FrameHeader has just been read.
+ ///
+ bool SeenFrameHeader { get; set; }
+
+ ///
+ /// Gets Information about the frame.
+ ///
+ ObuFrameHeader FrameInfo { get; }
+
+ ///
+ /// Gets Information about the sequence of frames.
+ ///
+ ObuSequenceHeader SequenceHeader { get; }
+
+ ///
+ /// Gets information required to decode the tiles of a frame.
+ ///
+ ObuTileInfo TileInfo { get; }
+
+ ///
+ /// Decode a single tile.
+ ///
+ /// The index of the tile that is to be decoded.
+ void DecodeTile(int tileNum);
+
+ ///
+ /// Finshed decoding all tiles of a frame.
+ ///
+ /// Apply the CDF filter.
+ /// Apply the loop filters.
+ void FinishDecodeTiles(bool doCdef, bool doLoopRestoration);
+}
diff --git a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs
index 6afd89a24..e0066e7c1 100644
--- a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs
+++ b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs
@@ -10,7 +10,7 @@ internal class ObuReader
///
/// Decode all OBU's in a frame.
///
- public static void Read(ref Av1BitStreamReader reader, int dataSize, Av1Decoder decoder, bool isAnnexB)
+ public static void Read(ref Av1BitStreamReader reader, int dataSize, IAv1TileDecoder decoder, bool isAnnexB)
{
bool frameDecodingFinished = false;
while (!frameDecodingFinished)
@@ -629,7 +629,7 @@ internal class ObuReader
return tileInfo;
}
- private static void ReadUncompressedFrameHeader(ref Av1BitStreamReader reader, Av1Decoder decoder, ObuHeader header, int planesCount)
+ private static void ReadUncompressedFrameHeader(ref Av1BitStreamReader reader, IAv1TileDecoder decoder, ObuHeader header, int planesCount)
{
ObuSequenceHeader sequenceHeader = decoder.SequenceHeader;
ObuFrameHeader frameInfo = decoder.FrameInfo;
@@ -915,7 +915,7 @@ internal class ObuReader
}
}
- private static void ReadFrameHeader(ref Av1BitStreamReader reader, Av1Decoder decoder, ObuHeader header, bool trailingBit)
+ private static void ReadFrameHeader(ref Av1BitStreamReader reader, IAv1TileDecoder decoder, ObuHeader header, bool trailingBit)
{
ObuSequenceHeader sequenceHeader = decoder.SequenceHeader;
ObuFrameHeader frameInfo = decoder.FrameInfo;
@@ -934,7 +934,7 @@ internal class ObuReader
header.PayloadSize -= headerBytes;
}
- private static void ReadTileGroup(ref Av1BitStreamReader reader, Av1Decoder decoder, ObuHeader header, out bool isLastTileGroup)
+ private static void ReadTileGroup(ref Av1BitStreamReader reader, IAv1TileDecoder decoder, ObuHeader header, out bool isLastTileGroup)
{
ObuSequenceHeader sequenceHeader = decoder.SequenceHeader;
ObuFrameHeader frameInfo = decoder.FrameInfo;
@@ -991,7 +991,7 @@ internal class ObuReader
}
// TODO: Pass more info to the decoder.
- decoder.DecodeTile(ref reader, tileNum);
+ decoder.DecodeTile(tileNum);
}
if (tileGroupEnd != tileCount - 1)
@@ -999,7 +999,7 @@ internal class ObuReader
return;
}
- decoder.FinishDecodeTiles(ref reader, doCdef, doLoopRestoration);
+ decoder.FinishDecodeTiles(doCdef, doLoopRestoration);
}
private static int ReadDeltaQ(ref Av1BitStreamReader reader)