diff --git a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1PartitionInfo.cs b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1PartitionInfo.cs
index 30d506f0cc..470f0cd538 100644
--- a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1PartitionInfo.cs
+++ b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1PartitionInfo.cs
@@ -69,7 +69,7 @@ internal class Av1PartitionInfo
public Av1BlockModeInfo? LeftModeInfoForChroma { get; set; }
- public int[][] CdefStrength { get; set; }
+ public int[] CdefStrength { get; set; }
public int[] ReferenceFrame { get; set; }
diff --git a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs
index f6aad1019c..d75df3f93f 100644
--- a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs
+++ b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileReader.cs
@@ -1194,6 +1194,7 @@ internal class Av1TileReader : IAv1TileReader
///
/// 5.11.56. Read CDEF syntax.
///
+ /// SVT: read_cdef
private void ReadCdef(ref Av1SymbolDecoder reader, Av1PartitionInfo partitionInfo)
{
if (partitionInfo.ModeInfo.Skip || this.FrameHeader.CodedLossless || !this.SequenceHeader.EnableCdef || this.FrameHeader.AllowIntraBlockCopy)
@@ -1202,22 +1203,24 @@ internal class Av1TileReader : IAv1TileReader
}
int cdefSize4 = Av1BlockSize.Block64x64.Get4x4WideCount();
- int cdefMask4 = ~(cdefSize4 - 1);
- int r = partitionInfo.RowIndex & cdefMask4;
- int c = partitionInfo.ColumnIndex & cdefMask4;
- if (partitionInfo.CdefStrength[r][c] == -1)
+ int row = partitionInfo.RowIndex & cdefSize4;
+ int col = partitionInfo.ColumnIndex & cdefSize4;
+ int index = this.SequenceHeader.SuperblockSize == Av1BlockSize.Block128x128 ? Math.Max(1, col) + (Math.Max(1, row) << 1) : 0;
+ if (partitionInfo.CdefStrength[index] == -1)
{
int cdfStrength = reader.ReadCdfStrength(this.FrameHeader.CdefParameters.BitCount);
- partitionInfo.CdefStrength[r][c] = cdfStrength;
+ partitionInfo.CdefStrength[index] = cdfStrength;
+
+ // Populate to nearby 64x64s if needed based on h4 & w4
if (this.SequenceHeader.SuperblockSize == Av1BlockSize.Block128x128)
{
int w4 = partitionInfo.ModeInfo.BlockSize.Get4x4WideCount();
int h4 = partitionInfo.ModeInfo.BlockSize.Get4x4HighCount();
- for (int i = r; i < r + h4; i += cdefSize4)
+ for (int i = row; i < row + h4; i += cdefSize4)
{
- for (int j = c; j < c + w4; j += cdefSize4)
+ for (int j = col; j < col + w4; j += cdefSize4)
{
- partitionInfo.CdefStrength[i & cdefMask4][j & cdefMask4] = cdfStrength;
+ partitionInfo.CdefStrength[Math.Max(1, j & cdefSize4) + (Math.Max(1, i & cdefSize4) << 1)] = cdfStrength;
}
}
}