Browse Source

Add comments where the methods can be found in the spec

pull/2633/head
Brian Popow 2 years ago
parent
commit
cb4f9ee890
  1. 76
      src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs

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

@ -5,6 +5,9 @@ using SixLabors.ImageSharp.Formats.Heif.Av1.Transform;
namespace SixLabors.ImageSharp.Formats.Heif.Av1.OpenBitstreamUnit; namespace SixLabors.ImageSharp.Formats.Heif.Av1.OpenBitstreamUnit;
/// <summary>
/// Reader for Open Bitstream Units (OBU's).
/// </summary>
internal class ObuReader internal class ObuReader
{ {
public ObuSequenceHeader? SequenceHeader { get; set; } public ObuSequenceHeader? SequenceHeader { get; set; }
@ -114,6 +117,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.3.2. OBU header syntax.
/// </summary>
private static ObuHeader ReadObuHeader(ref Av1BitStreamReader reader) private static ObuHeader ReadObuHeader(ref Av1BitStreamReader reader)
{ {
ObuHeader header = new(); ObuHeader header = new();
@ -191,6 +197,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.3.5. Byte alignment syntax.
/// </summary>
private static void AlignToByteBoundary(ref Av1BitStreamReader reader) private static void AlignToByteBoundary(ref Av1BitStreamReader reader)
{ {
while ((reader.BitPosition & 0x7) > 0) while ((reader.BitPosition & 0x7) > 0)
@ -217,6 +226,9 @@ internal class ObuReader
_ => false, _ => false,
}; };
/// <summary>
/// 5.5.1. General sequence header OBU syntax.
/// </summary>
private static void ReadSequenceHeader(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader) private static void ReadSequenceHeader(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader)
{ {
sequenceHeader.SequenceProfile = (ObuSequenceProfile)reader.ReadLiteral(3); sequenceHeader.SequenceProfile = (ObuSequenceProfile)reader.ReadLiteral(3);
@ -285,6 +297,9 @@ internal class ObuReader
ReadTrailingBits(ref reader); ReadTrailingBits(ref reader);
} }
/// <summary>
/// 5.5.2. Color config syntax.
/// </summary>
private static ObuColorConfig ReadColorConfig(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader) private static ObuColorConfig ReadColorConfig(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader)
{ {
ObuColorConfig colorConfig = new(); ObuColorConfig colorConfig = new();
@ -387,6 +402,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.8. Superres params syntax.
/// </summary>
private static void ReadSuperResolutionParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo) private static void ReadSuperResolutionParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo)
{ {
bool useSuperResolution = false; bool useSuperResolution = false;
@ -417,6 +435,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.6. Render size syntax.
/// </summary>
private static void ReadRenderSize(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo) private static void ReadRenderSize(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo)
{ {
bool renderSizeAndFrameSizeDifferent = reader.ReadBoolean(); bool renderSizeAndFrameSizeDifferent = reader.ReadBoolean();
@ -432,6 +453,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.7. Frame size with refs syntax.
/// </summary>
private static void ReadFrameSizeWithReferences(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, bool frameSizeOverrideFlag) private static void ReadFrameSizeWithReferences(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, bool frameSizeOverrideFlag)
{ {
bool foundReference = false; bool foundReference = false;
@ -457,6 +481,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.5. Frame size syntax.
/// </summary>
private static void ReadFrameSize(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, bool frameSizeOverrideFlag) private static void ReadFrameSize(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, bool frameSizeOverrideFlag)
{ {
if (frameSizeOverrideFlag) if (frameSizeOverrideFlag)
@ -474,6 +501,9 @@ internal class ObuReader
ComputeImageSize(sequenceHeader, frameInfo); ComputeImageSize(sequenceHeader, frameInfo);
} }
/// <summary>
/// 5.9.15. Tile info syntax.
/// </summary>
private static ObuTileGroupHeader ReadTileInfo(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo) private static ObuTileGroupHeader ReadTileInfo(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo)
{ {
ObuTileGroupHeader tileInfo = new(); ObuTileGroupHeader tileInfo = new();
@ -642,6 +672,9 @@ internal class ObuReader
return tileInfo; return tileInfo;
} }
/// <summary>
/// 5.9.2. Uncompressed header syntax.
/// </summary>
private void ReadUncompressedFrameHeader(ref Av1BitStreamReader reader, ObuHeader header, int planesCount) private void ReadUncompressedFrameHeader(ref Av1BitStreamReader reader, ObuHeader header, int planesCount)
{ {
ObuSequenceHeader sequenceHeader = this.SequenceHeader!; ObuSequenceHeader sequenceHeader = this.SequenceHeader!;
@ -924,6 +957,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.1. General frame header OBU syntax.
/// </summary>
private void ReadFrameHeader(ref Av1BitStreamReader reader, ObuHeader header, bool trailingBit) private void ReadFrameHeader(ref Av1BitStreamReader reader, ObuHeader header, bool trailingBit)
{ {
int planeCount = this.SequenceHeader!.ColorConfig.IsMonochrome ? 1 : 3; int planeCount = this.SequenceHeader!.ColorConfig.IsMonochrome ? 1 : 3;
@ -941,6 +977,9 @@ internal class ObuReader
header.PayloadSize -= headerBytes; header.PayloadSize -= headerBytes;
} }
/// <summary>
/// 5.11.1. General tile group OBU syntax.
/// </summary>
private void ReadTileGroup(ref Av1BitStreamReader reader, IAv1TileDecoder decoder, ObuHeader header, out bool isLastTileGroup) private void ReadTileGroup(ref Av1BitStreamReader reader, IAv1TileDecoder decoder, ObuHeader header, out bool isLastTileGroup)
{ {
ObuSequenceHeader sequenceHeader = this.SequenceHeader!; ObuSequenceHeader sequenceHeader = this.SequenceHeader!;
@ -1008,6 +1047,9 @@ internal class ObuReader
decoder.FinishDecodeTiles(doCdef, doLoopRestoration); decoder.FinishDecodeTiles(doCdef, doLoopRestoration);
} }
/// <summary>
/// 5.9.13. Delta quantizer syntax.
/// </summary>
private static int ReadDeltaQ(ref Av1BitStreamReader reader) private static int ReadDeltaQ(ref Av1BitStreamReader reader)
{ {
int deltaQ = 0; int deltaQ = 0;
@ -1019,6 +1061,9 @@ internal class ObuReader
return deltaQ; return deltaQ;
} }
/// <summary>
/// 5.9.17. Quantizer index delta parameters syntax.
/// </summary>
private static void ReadFrameDeltaQParameters(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo) private static void ReadFrameDeltaQParameters(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo)
{ {
frameInfo.DeltaQParameters.Resolution = 0; frameInfo.DeltaQParameters.Resolution = 0;
@ -1034,6 +1079,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.18. Loop filter delta parameters syntax.
/// </summary>
private static void ReadFrameDeltaLoopFilterParameters(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo) private static void ReadFrameDeltaLoopFilterParameters(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo)
{ {
frameInfo.DeltaLoopFilterParameters.IsPresent = false; frameInfo.DeltaLoopFilterParameters.IsPresent = false;
@ -1054,6 +1102,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.12. Quantization params syntax.
/// </summary>
private static void ReadQuantizationParameters(ref Av1BitStreamReader reader, ObuQuantizationParameters quantParams, ObuColorConfig colorInfo, int planesCount) private static void ReadQuantizationParameters(ref Av1BitStreamReader reader, ObuQuantizationParameters quantParams, ObuColorConfig colorInfo, int planesCount)
{ {
quantParams.BaseQIndex = (int)reader.ReadLiteral(8); quantParams.BaseQIndex = (int)reader.ReadLiteral(8);
@ -1105,6 +1156,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.14. Segmentation params syntax.
/// </summary>
private static void ReadSegmentationParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount) private static void ReadSegmentationParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount)
{ {
frameInfo.SegmentationParameters.Enabled = reader.ReadBoolean(); frameInfo.SegmentationParameters.Enabled = reader.ReadBoolean();
@ -1113,6 +1167,9 @@ internal class ObuReader
// TODO: Parse more stuff. // TODO: Parse more stuff.
} }
/// <summary>
/// 5.9.11. Loop filter params syntax
/// </summary>
private static void ReadLoopFilterParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount) private static void ReadLoopFilterParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount)
{ {
if (frameInfo.CodedLossless || frameInfo.AllowIntraBlockCopy) if (frameInfo.CodedLossless || frameInfo.AllowIntraBlockCopy)
@ -1125,6 +1182,9 @@ internal class ObuReader
// TODO: Parse more stuff. // TODO: Parse more stuff.
} }
/// <summary>
/// 5.9.21. TX mode syntax.
/// </summary>
private static void ReadTransformMode(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo) private static void ReadTransformMode(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo)
{ {
if (frameInfo.CodedLossless) if (frameInfo.CodedLossless)
@ -1145,7 +1205,7 @@ internal class ObuReader
} }
/// <summary> /// <summary>
/// See section 5.9.20. /// See section 5.9.20. Loop restoration params syntax.
/// </summary> /// </summary>
private static void ReadLoopRestorationParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount) private static void ReadLoopRestorationParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount)
{ {
@ -1201,7 +1261,7 @@ internal class ObuReader
} }
/// <summary> /// <summary>
/// See section 5.9.19. /// See section 5.9.19. CDEF params syntax.
/// </summary> /// </summary>
private static void ReadCdefParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount) private static void ReadCdefParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount)
{ {
@ -1230,6 +1290,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.24. Global motion params syntax.
/// </summary>
private static void ReadGlobalMotionParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, bool isIntraFrame) private static void ReadGlobalMotionParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, bool isIntraFrame)
{ {
if (isIntraFrame) if (isIntraFrame)
@ -1240,6 +1303,9 @@ internal class ObuReader
// Not applicable for INTRA frames. // Not applicable for INTRA frames.
} }
/// <summary>
/// 5.9.23. Frame reference mode syntax
/// </summary>
private static ObuReferenceMode ReadFrameReferenceMode(ref Av1BitStreamReader reader, bool isIntraFrame) private static ObuReferenceMode ReadFrameReferenceMode(ref Av1BitStreamReader reader, bool isIntraFrame)
{ {
if (isIntraFrame) if (isIntraFrame)
@ -1250,6 +1316,9 @@ internal class ObuReader
return (ObuReferenceMode)reader.ReadLiteral(1); return (ObuReferenceMode)reader.ReadLiteral(1);
} }
/// <summary>
/// 5.11.10. Skip mode syntax.
/// </summary>
private static void ReadSkipModeParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, bool isIntraFrame, ObuReferenceMode referenceSelect) private static void ReadSkipModeParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, bool isIntraFrame, ObuReferenceMode referenceSelect)
{ {
if (isIntraFrame || referenceSelect == ObuReferenceMode.ReferenceModeSelect || !sequenceHeader.OrderHintInfo.EnableOrderHint) if (isIntraFrame || referenceSelect == ObuReferenceMode.ReferenceModeSelect || !sequenceHeader.OrderHintInfo.EnableOrderHint)
@ -1271,6 +1340,9 @@ internal class ObuReader
} }
} }
/// <summary>
/// 5.9.30. Film grain params syntax.
/// </summary>
private static ObuFilmGrainParameters ReadFilmGrainFilterParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo) private static ObuFilmGrainParameters ReadFilmGrainFilterParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo)
{ {
ObuFilmGrainParameters grainParams = new(); ObuFilmGrainParameters grainParams = new();

Loading…
Cancel
Save