Browse Source

Make scan order read only

pull/2633/head
Ynse Hoornenborg 2 years ago
parent
commit
3ea42d050a
  1. 2
      src/ImageSharp/Formats/Heif/Av1/Pipeline/Quantification/Av1InverseQuantizer.cs
  2. 8
      src/ImageSharp/Formats/Heif/Av1/Tiling/Av1SymbolDecoder.cs
  3. 2
      src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs
  4. 22
      src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs

2
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<short> 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();

8
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<short> scan, int bwl, Span<int> levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType)
public void ReadCoefficientsEndOfBlock(Av1TransformClass transformClass, int endOfBlock, int height, ReadOnlySpan<short> scan, int bwl, Span<int> 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<short> scan, int bwl, Span<int> levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType)
public void ReadCoefficientsReverse2d(Av1TransformSize transformSize, int startSi, int endSi, ReadOnlySpan<short> scan, int bwl, Span<int> 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<short> scan, int bwl, Span<int> levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType)
public void ReadCoefficientsReverse(Av1TransformSize transformSize, Av1TransformClass transformClass, int startSi, int endSi, ReadOnlySpan<short> scan, int bwl, Span<int> levels, Av1TransformSize transformSizeContext, Av1PlaneType planeType)
{
for (int c = endSi; c >= startSi; --c)
{
@ -290,7 +290,7 @@ internal ref struct Av1SymbolDecoder
}
}
public int ReadCoefficientsDc(Span<int> coefficientBuffer, int endOfBlock, Span<short> scan, int bwl, Span<int> levels, int dcSignContext, Av1PlaneType planeType)
public int ReadCoefficientsDc(Span<int> coefficientBuffer, int endOfBlock, ReadOnlySpan<short> scan, int bwl, Span<int> levels, int dcSignContext, Av1PlaneType planeType)
{
int maxScanLine = 0;
int culLevel = 0;

2
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<short> scan = scanOrder.Scan;
ReadOnlySpan<short> scan = scanOrder.Scan;
endOfBlockPoint = reader.ReadEndOfBlockFlag(planeType, transformClass, transformSize);
int endOfBlockShift = EndOfBlockOffsetBits[endOfBlockPoint];

22
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<short> Scan => this.scan;
public short[] InverseScan { get; }
public ReadOnlySpan<short> InverseScan => this.inverseScan;
public short[] Neighbors { get; }
public ReadOnlySpan<short> Neighbors => this.neighbors;
}

Loading…
Cancel
Save