|
|
|
@ -5,6 +5,9 @@ using SixLabors.ImageSharp.Formats.Heif.Av1.Transform; |
|
|
|
|
|
|
|
namespace SixLabors.ImageSharp.Formats.Heif.Av1.OpenBitstreamUnit; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Reader for Open Bitstream Units (OBU's).
|
|
|
|
/// </summary>
|
|
|
|
internal class ObuReader |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
while ((reader.BitPosition & 0x7) > 0) |
|
|
|
@ -217,6 +226,9 @@ internal class ObuReader |
|
|
|
_ => false, |
|
|
|
}; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 5.5.1. General sequence header OBU syntax.
|
|
|
|
/// </summary>
|
|
|
|
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); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 5.5.2. Color config syntax.
|
|
|
|
/// </summary>
|
|
|
|
private static ObuColorConfig ReadColorConfig(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
if (frameSizeOverrideFlag) |
|
|
|
@ -474,6 +501,9 @@ internal class ObuReader |
|
|
|
ComputeImageSize(sequenceHeader, frameInfo); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 5.9.15. Tile info syntax.
|
|
|
|
/// </summary>
|
|
|
|
private static ObuTileGroupHeader ReadTileInfo(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo) |
|
|
|
{ |
|
|
|
ObuTileGroupHeader tileInfo = new(); |
|
|
|
@ -642,6 +672,9 @@ internal class ObuReader |
|
|
|
return tileInfo; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 5.9.2. Uncompressed header syntax.
|
|
|
|
/// </summary>
|
|
|
|
private void ReadUncompressedFrameHeader(ref Av1BitStreamReader reader, ObuHeader header, int planesCount) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
int planeCount = this.SequenceHeader!.ColorConfig.IsMonochrome ? 1 : 3; |
|
|
|
@ -941,6 +977,9 @@ internal class ObuReader |
|
|
|
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) |
|
|
|
{ |
|
|
|
ObuSequenceHeader sequenceHeader = this.SequenceHeader!; |
|
|
|
@ -1008,6 +1047,9 @@ internal class ObuReader |
|
|
|
decoder.FinishDecodeTiles(doCdef, doLoopRestoration); |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 5.9.13. Delta quantizer syntax.
|
|
|
|
/// </summary>
|
|
|
|
private static int ReadDeltaQ(ref Av1BitStreamReader reader) |
|
|
|
{ |
|
|
|
int deltaQ = 0; |
|
|
|
@ -1019,6 +1061,9 @@ internal class ObuReader |
|
|
|
return deltaQ; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 5.9.17. Quantizer index delta parameters syntax.
|
|
|
|
/// </summary>
|
|
|
|
private static void ReadFrameDeltaQParameters(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
frameInfo.SegmentationParameters.Enabled = reader.ReadBoolean(); |
|
|
|
@ -1113,6 +1167,9 @@ internal class ObuReader |
|
|
|
// 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) |
|
|
|
{ |
|
|
|
if (frameInfo.CodedLossless || frameInfo.AllowIntraBlockCopy) |
|
|
|
@ -1125,6 +1182,9 @@ internal class ObuReader |
|
|
|
// TODO: Parse more stuff.
|
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 5.9.21. TX mode syntax.
|
|
|
|
/// </summary>
|
|
|
|
private static void ReadTransformMode(ref Av1BitStreamReader reader, ObuFrameHeader frameInfo) |
|
|
|
{ |
|
|
|
if (frameInfo.CodedLossless) |
|
|
|
@ -1145,7 +1205,7 @@ internal class ObuReader |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// See section 5.9.20.
|
|
|
|
/// See section 5.9.20. Loop restoration params syntax.
|
|
|
|
/// </summary>
|
|
|
|
private static void ReadLoopRestorationParameters(ref Av1BitStreamReader reader, ObuSequenceHeader sequenceHeader, ObuFrameHeader frameInfo, int planesCount) |
|
|
|
{ |
|
|
|
@ -1201,7 +1261,7 @@ internal class ObuReader |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// See section 5.9.19.
|
|
|
|
/// See section 5.9.19. CDEF params syntax.
|
|
|
|
/// </summary>
|
|
|
|
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) |
|
|
|
{ |
|
|
|
if (isIntraFrame) |
|
|
|
@ -1240,6 +1303,9 @@ internal class ObuReader |
|
|
|
// Not applicable for INTRA frames.
|
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 5.9.23. Frame reference mode syntax
|
|
|
|
/// </summary>
|
|
|
|
private static ObuReferenceMode ReadFrameReferenceMode(ref Av1BitStreamReader reader, bool isIntraFrame) |
|
|
|
{ |
|
|
|
if (isIntraFrame) |
|
|
|
@ -1250,6 +1316,9 @@ internal class ObuReader |
|
|
|
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) |
|
|
|
{ |
|
|
|
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) |
|
|
|
{ |
|
|
|
ObuFilmGrainParameters grainParams = new(); |
|
|
|
|