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