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);
}
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
}

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>
/// Decode all OBU's in a frame.
/// </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;
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)

Loading…
Cancel
Save