Browse Source

Some bug fixes

pull/2633/head
Ynse Hoornenborg 2 years ago
parent
commit
23d533a713
  1. 6
      src/ImageSharp/Formats/Heif/Av1/Av1Constants.cs
  2. 2
      src/ImageSharp/Formats/Heif/Av1/Tiling/Av1FrameBuffer.cs
  3. 2
      src/ImageSharp/Formats/Heif/Av1/Tiling/Av1SymbolDecoder.cs
  4. 37
      src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs
  5. 12
      src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs
  6. 1542
      src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrderConstants.cs

6
src/ImageSharp/Formats/Heif/Av1/Av1Constants.cs

@ -153,14 +153,16 @@ internal static class Av1Constants
public const int TransformPadEnd = 16;
public const int CoefficientContextBits = 6;
public const int CoefficientContextBitCount = 6;
public const int CoefficientContextMask = (1 << CoefficientContextBits) - 1;
public const int CoefficientContextMask = (1 << CoefficientContextBitCount) - 1;
public const int TransformPad2d = ((MaxTransformSize + TransformPadHorizontal) * (MaxTransformSize + TransformPadVertical)) + TransformPadEnd;
public const int MaxTransformSize = 1 << 6;
public const int MaxTransformSizeUnit = MaxTransformSize >> 2;
public const int TransformPadTop = 2;
public const int BaseRangeSizeMinus1 = 3;

2
src/ImageSharp/Formats/Heif/Av1/Tiling/Av1FrameBuffer.cs

@ -151,8 +151,8 @@ internal class Av1FrameBuffer
plane switch
{
0 => (Span<int>)this.coefficientsY,
1 => (Span<int>)this.coefficientsY,
2 => (Span<int>)this.coefficientsY,
3 => (Span<int>)this.coefficientsY,
_ => null,
};

2
src/ImageSharp/Formats/Heif/Av1/Tiling/Av1SymbolDecoder.cs

@ -233,7 +233,7 @@ internal ref struct Av1SymbolDecoder
public int ReadCoefficientsBase(int coefficientContext, Av1TransformSize transformSizeContext, Av1PlaneType planeType)
{
ref Av1SymbolReader r = ref this.reader;
return r.ReadSymbol(this.coefficientsBase[coefficientContext][(int)transformSizeContext][(int)planeType]);
return r.ReadSymbol(this.coefficientsBase[(int)transformSizeContext][(int)planeType][coefficientContext]);
}
private static uint GetElementProbability(Av1Distribution probability, Av1PartitionType element)

37
src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs

@ -1,8 +1,6 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
using System;
using System.Formats.Asn1;
using SixLabors.ImageSharp.Formats.Heif.Av1;
using SixLabors.ImageSharp.Formats.Heif.Av1.OpenBitstreamUnit;
using SixLabors.ImageSharp.Formats.Heif.Av1.Prediction;
@ -216,18 +214,18 @@ internal class Av1TileDecoder : IAv1TileDecoder
}
else if (hasRows && hasColumns)
{
int ctx = this.GetPartitionContext(modeInfoLocation, blockSize, tileInfo, this.FrameInfo.ModeInfoRowCount);
int ctx = this.GetPartitionPlaneContext(modeInfoLocation, blockSize, tileInfo, superblockInfo);
partitionType = reader.ReadPartitionType(ctx);
}
else if (hasColumns)
{
int ctx = this.GetPartitionContext(modeInfoLocation, blockSize, tileInfo, this.FrameInfo.ModeInfoRowCount);
int ctx = this.GetPartitionPlaneContext(modeInfoLocation, blockSize, tileInfo, superblockInfo);
bool splitOrHorizontal = reader.ReadSplitOrHorizontal(blockSize, ctx);
partitionType = splitOrHorizontal ? Av1PartitionType.Split : Av1PartitionType.Horizontal;
}
else if (hasRows)
{
int ctx = this.GetPartitionContext(modeInfoLocation, blockSize, tileInfo, this.FrameInfo.ModeInfoRowCount);
int ctx = this.GetPartitionPlaneContext(modeInfoLocation, blockSize, tileInfo, superblockInfo);
bool splitOrVertical = reader.ReadSplitOrVertical(blockSize, ctx);
partitionType = splitOrVertical ? Av1PartitionType.Split : Av1PartitionType.Vertical;
}
@ -666,7 +664,8 @@ internal class Av1TileDecoder : IAv1TileDecoder
}
}
coefficientBuffer[this.coefficientIndex[plane]] = endOfBlock;
DebugGuard.MustBeGreaterThan(scan.Length, 0, nameof(scan));
coefficientBuffer[0] = endOfBlock;
for (int c = 0; c < endOfBlock; c++)
{
int sign = 0;
@ -890,11 +889,11 @@ internal class Av1TileDecoder : IAv1TileDecoder
{
if (dcValue < 0)
{
culLevel |= 1 << Av1Constants.CoefficientContextBits;
culLevel |= 1 << Av1Constants.CoefficientContextBitCount;
}
else if (dcValue > 0)
{
culLevel += 2 << Av1Constants.CoefficientContextBits;
culLevel += 2 << Av1Constants.CoefficientContextBitCount;
}
}
@ -1053,16 +1052,26 @@ internal class Av1TileDecoder : IAv1TileDecoder
int[] leftContext = this.leftNeighborContext.GetContext(plane);
int dcSign = 0;
int k = 0;
int mask = (1 << Av1Constants.CoefficientContextCount) - 1;
int mask = (1 << Av1Constants.CoefficientContextBitCount) - 1;
do
{
int sign = aboveContext[k] >> Av1Constants.CoefficientContextCount;
DebugGuard.MustBeLessThanOrEqualTo(sign, 2, nameof(sign));
uint sign = (uint)aboveContext[k] >> Av1Constants.CoefficientContextBitCount;
DebugGuard.MustBeLessThanOrEqualTo(sign, 2U, nameof(sign));
dcSign += Signs[sign];
}
while (++k < transformBlockUnitWideCount);
k = 0;
do
{
uint sign = (uint)leftContext[k] >> Av1Constants.CoefficientContextBitCount;
DebugGuard.MustBeLessThanOrEqualTo(sign, 2U, nameof(sign));
dcSign += Signs[sign];
}
while (++k < transformBlockUnitHighCount);
transformBlockContext.DcSignContext = dcSign;
transformBlockContext.DcSignContext = DcSignContexts[dcSign + (Av1Constants.MaxTransformSizeUnit << 1)];
if (plane == 0)
{
@ -1869,11 +1878,11 @@ internal class Av1TileDecoder : IAv1TileDecoder
return xPos && yPos;
}*/
private int GetPartitionContext(Point location, Av1BlockSize blockSize, Av1TileInfo tileLoc, int superblockModeInfoRowCount)
private int GetPartitionPlaneContext(Point location, Av1BlockSize blockSize, Av1TileInfo tileLoc, Av1SuperblockInfo superblockInfo)
{
// Maximum partition point is 8x8. Offset the log value occordingly.
int aboveCtx = this.aboveNeighborContext.AbovePartitionWidth[location.X - tileLoc.ModeInfoColumnStart];
int leftCtx = this.leftNeighborContext.LeftPartitionHeight[(location.Y - superblockModeInfoRowCount) & Av1PartitionContext.Mask];
int leftCtx = this.leftNeighborContext.LeftPartitionHeight[(location.Y - superblockInfo.Position.Y) & Av1PartitionContext.Mask];
int blockSizeLog = blockSize.Get4x4WidthLog2() - Av1BlockSize.Block8x8.Get4x4WidthLog2();
int above = (aboveCtx >> blockSizeLog) & 0x1;
int left = (leftCtx >> blockSizeLog) & 0x1;

12
src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrder.cs

@ -5,18 +5,18 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.Transform;
internal readonly struct Av1ScanOrder
{
public Av1ScanOrder(short[]? scan)
public Av1ScanOrder(short[] scan)
{
this.Scan = scan ?? [];
this.Scan = scan;
this.IScan = [];
this.Neighbors = [];
}
public Av1ScanOrder(short[]? scan, short[]? iscan, short[]? neighbors)
public Av1ScanOrder(short[] scan, short[] iscan, short[] neighbors)
{
this.Scan = scan!;
this.IScan = iscan!;
this.Neighbors = neighbors!;
this.Scan = scan;
this.IScan = iscan;
this.Neighbors = neighbors;
}
public short[] Scan { get; }

1542
src/ImageSharp/Formats/Heif/Av1/Transform/Av1ScanOrderConstants.cs

File diff suppressed because it is too large
Loading…
Cancel
Save