From e45bf57f68cd18b2f202863c6ca35cc426ae42c2 Mon Sep 17 00:00:00 2001 From: Ynse Hoornenborg Date: Sun, 21 Jul 2024 05:45:52 +0200 Subject: [PATCH] Combine Delta parameters implementation --- ...aLoopFilterParameters.cs => ObuDeltaParameters.cs} | 2 +- .../Heif/Av1/OpenBitstreamUnit/ObuDeltaQParameters.cs | 11 ----------- .../Heif/Av1/OpenBitstreamUnit/ObuFrameHeader.cs | 4 ++-- .../Formats/Heif/Av1/Tiling/Av1TileDecoder.cs | 8 +++----- 4 files changed, 6 insertions(+), 19 deletions(-) rename src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/{ObuDeltaLoopFilterParameters.cs => ObuDeltaParameters.cs} (87%) delete mode 100644 src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaQParameters.cs diff --git a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaLoopFilterParameters.cs b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaParameters.cs similarity index 87% rename from src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaLoopFilterParameters.cs rename to src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaParameters.cs index da39e19f3..c92485eaf 100644 --- a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaLoopFilterParameters.cs +++ b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaParameters.cs @@ -3,7 +3,7 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.OpenBitstreamUnit; -internal class ObuDeltaLoopFilterParameters +internal class ObuDeltaParameters { public bool IsPresent { get; internal set; } diff --git a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaQParameters.cs b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaQParameters.cs deleted file mode 100644 index b82bf5cf9..000000000 --- a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuDeltaQParameters.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Six Labors. -// Licensed under the Six Labors Split License. - -namespace SixLabors.ImageSharp.Formats.Heif.Av1.OpenBitstreamUnit; - -internal class ObuDeltaQParameters -{ - public bool IsPresent { get; set; } - - public int Resolution { get; set; } -} diff --git a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuFrameHeader.cs b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuFrameHeader.cs index 7509da20a..6540ff8af 100644 --- a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuFrameHeader.cs +++ b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuFrameHeader.cs @@ -49,9 +49,9 @@ internal class ObuFrameHeader public Av1TransformMode TransformMode { get; set; } - public ObuDeltaLoopFilterParameters DeltaLoopFilterParameters { get; set; } = new ObuDeltaLoopFilterParameters(); + public ObuDeltaParameters DeltaLoopFilterParameters { get; set; } = new ObuDeltaParameters(); - public ObuDeltaQParameters DeltaQParameters { get; set; } = new ObuDeltaQParameters(); + public ObuDeltaParameters DeltaQParameters { get; set; } = new ObuDeltaParameters(); internal ObuFrameSize FrameSize { get; set; } = new ObuFrameSize(); diff --git a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs index a05aa63a0..278eb4dbb 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs @@ -30,8 +30,6 @@ internal class Av1TileDecoder : IAv1TileDecoder private readonly Av1ParseLeftNeighbor4x4Context leftNeighborContext; private int currentQuantizerIndex; private readonly int[][] segmentIds = []; - private int deltaLoopFilterResolution = -1; - private readonly bool readDeltas; private readonly int[][] transformUnitCount; private readonly int[] firstTransformOffset = new int[2]; private readonly int[] coefficientIndex = []; @@ -40,7 +38,6 @@ internal class Av1TileDecoder : IAv1TileDecoder { this.FrameInfo = frameInfo; this.SequenceHeader = sequenceHeader; - this.readDeltas = frameInfo.DeltaQParameters.IsPresent; // init_main_frame_ctxt this.FrameBuffer = new(this.SequenceHeader); @@ -1420,7 +1417,7 @@ internal class Av1TileDecoder : IAv1TileDecoder this.ReadCdef(ref reader, partitionInfo); - if (this.readDeltas) + if (this.FrameInfo.DeltaQParameters.IsPresent) { this.ReadDeltaQuantizerIndex(ref reader, partitionInfo); this.ReadDeltaLoopFilter(ref reader, partitionInfo); @@ -1756,7 +1753,8 @@ internal class Av1TileDecoder : IAv1TileDecoder { bool deltaLoopFilterSign = reader.ReadLiteral(1) > 0; int reducedDeltaLoopFilterLevel = deltaLoopFilterSign ? -deltaLoopFilterAbsolute : deltaLoopFilterAbsolute; - currentDeltaLoopFilter[i] = Av1Math.Clip3(-Av1Constants.MaxLoopFilter, Av1Constants.MaxLoopFilter, currentDeltaLoopFilter[i] + (reducedDeltaLoopFilterLevel << this.deltaLoopFilterResolution)); + int deltaLoopFilterResolution = this.FrameInfo.DeltaLoopFilterParameters.Resolution; + currentDeltaLoopFilter[i] = Av1Math.Clip3(-Av1Constants.MaxLoopFilter, Av1Constants.MaxLoopFilter, currentDeltaLoopFilter[i] + (reducedDeltaLoopFilterLevel << deltaLoopFilterResolution)); } } }