From 3ea42d050ad3b3ee45db98e3cc494adca0e69e5f Mon Sep 17 00:00:00 2001 From: Ynse Hoornenborg Date: Fri, 15 Nov 2024 20:11:45 +0100 Subject: [PATCH] Make scan order read only --- .../Quantification/Av1InverseQuantizer.cs | 2 +- .../Heif/Av1/Tiling/Av1SymbolDecoder.cs | 8 +++---- .../Formats/Heif/Av1/Tiling/Av1TileReader.cs | 2 +- .../Heif/Av1/Transform/Av1ScanOrder.cs | 22 +++++++++++-------- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/ImageSharp/Formats/Heif/Av1/Pipeline/Quantification/Av1InverseQuantizer.cs b/src/ImageSharp/Formats/Heif/Av1/Pipeline/Quantification/Av1InverseQuantizer.cs index 4cb7c1cc77..0f08b216b0 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Pipeline/Quantification/Av1InverseQuantizer.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Pipeline/Quantification/Av1InverseQuantizer.cs @@ -85,7 +85,7 @@ internal class Av1InverseQuantizer { Guard.NotNull(this.deQuantsDeltaQ); Av1ScanOrder scanOrder = Av1ScanOrderConstants.GetScanOrder(transformSize, transformType); - short[] scanIndices = scanOrder.Scan; + ReadOnlySpan scanIndices = scanOrder.Scan; int maxValue = (1 << (7 + this.sequenceHeader.ColorConfig.BitDepth.GetBitCount())) - 1; int minValue = -(1 << (7 + this.sequenceHeader.ColorConfig.BitDepth.GetBitCount())); Av1TransformSize qmTransformSize = transformSize.GetAdjusted(); diff --git a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1SymbolDecoder.cs b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1SymbolDecoder.cs index a80b62e3d7..57de6659c5 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1SymbolDecoder.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1SymbolDecoder.cs @@ -217,7 +217,7 @@ internal ref struct Av1SymbolDecoder return r.ReadSymbol(this.chromeForLumaAlpha[context]); } - public void ReadCoefficientsEndOfBlock(Av1TransformClass transformClass, int endOfBlock, int height, Span scan, int bwl, Span levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType) + public void ReadCoefficientsEndOfBlock(Av1TransformClass transformClass, int endOfBlock, int height, ReadOnlySpan scan, int bwl, Span levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType) { int i = endOfBlock - 1; int pos = scan[i]; @@ -240,7 +240,7 @@ internal ref struct Av1SymbolDecoder levels[GetPaddedIndex(pos, bwl)] = level; } - public void ReadCoefficientsReverse2d(Av1TransformSize transformSize, int startSi, int endSi, Span scan, int bwl, Span levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType) + public void ReadCoefficientsReverse2d(Av1TransformSize transformSize, int startSi, int endSi, ReadOnlySpan scan, int bwl, Span levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType) { for (int c = endSi; c >= startSi; --c) { @@ -265,7 +265,7 @@ internal ref struct Av1SymbolDecoder } } - public void ReadCoefficientsReverse(Av1TransformSize transformSize, Av1TransformClass transformClass, int startSi, int endSi, Span scan, int bwl, Span levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType) + public void ReadCoefficientsReverse(Av1TransformSize transformSize, Av1TransformClass transformClass, int startSi, int endSi, ReadOnlySpan scan, int bwl, Span levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType) { for (int c = endSi; c >= startSi; --c) { @@ -290,7 +290,7 @@ internal ref struct Av1SymbolDecoder } } - public int ReadCoefficientsDc(Span coefficientBuffer, int endOfBlock, Span scan, int bwl, Span levels, int dcSignContext, Av1PlaneType planeType) + public int ReadCoefficientsDc(Span coefficientBuffer, int endOfBlock, ReadOnlySpan scan, int bwl, Span levels, int dcSignContext, Av1PlaneType planeType) { int maxScanLine = 0; int culLevel = 0; diff --git a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs index 934355e708..e4b5b6a9aa 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs @@ -591,7 +591,7 @@ internal class Av1TileReader : IAv1TileReader transformInfo.Type = this.ComputeTransformType(planeType, partitionInfo, transformSize, transformInfo); Av1TransformClass transformClass = transformInfo.Type.ToClass(); Av1ScanOrder scanOrder = Av1ScanOrderConstants.GetScanOrder(transformSize, transformInfo.Type); - Span scan = scanOrder.Scan; + ReadOnlySpan scan = scanOrder.Scan; endOfBlockPoint = reader.ReadEndOfBlockFlag(planeType, transformClass, transformSize); int endOfBlockShift = EndOfBlockOffsetBits[endOfBlockPoint]; diff --git a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs index 94650b1766..b2c2587407 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs @@ -5,23 +5,27 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform; internal readonly struct Av1ScanOrder { + private readonly short[] scan; + private readonly short[] inverseScan; + private readonly short[] neighbors; + public Av1ScanOrder(short[] scan) { - this.Scan = scan; - this.InverseScan = []; - this.Neighbors = []; + this.scan = scan; + this.inverseScan = []; + this.neighbors = []; } public Av1ScanOrder(short[] scan, short[] inverseScan, short[] neighbors) { - this.Scan = scan; - this.InverseScan = inverseScan; - this.Neighbors = neighbors; + this.scan = scan; + this.inverseScan = inverseScan; + this.neighbors = neighbors; } - public short[] Scan { get; } + public ReadOnlySpan Scan => this.scan; - public short[] InverseScan { get; } + public ReadOnlySpan InverseScan => this.inverseScan; - public short[] Neighbors { get; } + public ReadOnlySpan Neighbors => this.neighbors; }