Browse Source

Use Tile Decoder interface

pull/2633/head
Ynse Hoornenborg 2 years ago
parent
commit
07138c4ff8
  1. 4
      src/ImageSharp/Formats/Heif/Av1/Av1Decoder.cs
  2. 55
      src/ImageSharp/Formats/Heif/Av1/IAv1TileDecoder.cs
  3. 12
      src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs

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

@ -32,12 +32,12 @@ internal class Av1Decoder : IAv1TileDecoder
ObuReader.Read(ref reader, buffer.Length, this, false); ObuReader.Read(ref reader, buffer.Length, this, false);
} }
public void DecodeTile(ref Av1BitStreamReader reader, int tileNum) public void DecodeTile(int tileNum)
{ {
// TODO: Implement // TODO: Implement
} }
public void FinishDecodeTiles(ref Av1BitStreamReader reader, bool doCdef, bool doLoopRestoration) public void FinishDecodeTiles(bool doCdef, bool doLoopRestoration)
{ {
// TODO: Implement // TODO: Implement
} }

55
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;
/// <summary>
/// Interface for decoding of image tiles.
/// </summary>
internal interface IAv1TileDecoder
{
/// <summary>
/// Gets or sets a value indicating whether a sequence header has been read.
/// </summary>
bool SequenceHeaderDone { get; set; }
/// <summary>
/// Gets or sets a value indicating whether to show the existing frame.
/// </summary>
bool ShowExistingFrame { get; set; }
/// <summary>
/// Gets or sets a value indicating whether a FrameHeader has just been read.
/// </summary>
bool SeenFrameHeader { get; set; }
/// <summary>
/// Gets Information about the frame.
/// </summary>
ObuFrameHeader FrameInfo { get; }
/// <summary>
/// Gets Information about the sequence of frames.
/// </summary>
ObuSequenceHeader SequenceHeader { get; }
/// <summary>
/// Gets information required to decode the tiles of a frame.
/// </summary>
ObuTileInfo TileInfo { get; }
/// <summary>
/// Decode a single tile.
/// </summary>
/// <param name="tileNum">The index of the tile that is to be decoded.</param>
void DecodeTile(int tileNum);
/// <summary>
/// Finshed decoding all tiles of a frame.
/// </summary>
/// <param name="doCdef">Apply the CDF filter.</param>
/// <param name="doLoopRestoration">Apply the loop filters.</param>
void FinishDecodeTiles(bool doCdef, bool doLoopRestoration);
}

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

@ -10,7 +10,7 @@ internal class ObuReader
/// <summary> /// <summary>
/// Decode all OBU's in a frame. /// Decode all OBU's in a frame.
/// </summary> /// </summary>
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; bool frameDecodingFinished = false;
while (!frameDecodingFinished) while (!frameDecodingFinished)
@ -629,7 +629,7 @@ internal class ObuReader
return tileInfo; 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; ObuSequenceHeader sequenceHeader = decoder.SequenceHeader;
ObuFrameHeader frameInfo = decoder.FrameInfo; 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; ObuSequenceHeader sequenceHeader = decoder.SequenceHeader;
ObuFrameHeader frameInfo = decoder.FrameInfo; ObuFrameHeader frameInfo = decoder.FrameInfo;
@ -934,7 +934,7 @@ internal class ObuReader
header.PayloadSize -= headerBytes; 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; ObuSequenceHeader sequenceHeader = decoder.SequenceHeader;
ObuFrameHeader frameInfo = decoder.FrameInfo; ObuFrameHeader frameInfo = decoder.FrameInfo;
@ -991,7 +991,7 @@ internal class ObuReader
} }
// TODO: Pass more info to the decoder. // TODO: Pass more info to the decoder.
decoder.DecodeTile(ref reader, tileNum); decoder.DecodeTile(tileNum);
} }
if (tileGroupEnd != tileCount - 1) if (tileGroupEnd != tileCount - 1)
@ -999,7 +999,7 @@ internal class ObuReader
return; return;
} }
decoder.FinishDecodeTiles(ref reader, doCdef, doLoopRestoration); decoder.FinishDecodeTiles(doCdef, doLoopRestoration);
} }
private static int ReadDeltaQ(ref Av1BitStreamReader reader) private static int ReadDeltaQ(ref Av1BitStreamReader reader)

Loading…
Cancel
Save