From 07138c4ff8a0e3d857f96885a0b422e5c65db255 Mon Sep 17 00:00:00 2001 From: Ynse Hoornenborg Date: Tue, 23 Apr 2024 18:27:12 +0200 Subject: [PATCH] Use Tile Decoder interface --- src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs | 4 +- .../Formats/Heif/Av1/IAv1TileDecoder.cs | 55 +++++++++++++++++++ .../Heif/Av1/OpenBitstreamUnit/ObuReader.cs | 12 ++-- 3 files changed, 63 insertions(+), 8 deletions(-) create mode 100644 src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs 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)