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; } } }