diff --git a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs index cf3aa451d5..feb9cfc9cd 100644 --- a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs +++ b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuReader.cs @@ -370,9 +370,6 @@ internal class ObuReader // Video related flags removed sequenceHeader.Use128x128Superblock = reader.ReadBoolean(); - sequenceHeader.SuperblockSize = sequenceHeader.Use128x128Superblock ? Av1BlockSize.Block128x128 : Av1BlockSize.Block64x64; - sequenceHeader.SuperblockModeInfoSize = sequenceHeader.Use128x128Superblock ? 32 : 16; - sequenceHeader.SuperblockSizeLog2 = sequenceHeader.Use128x128Superblock ? 7 : 6; sequenceHeader.EnableFilterIntra = reader.ReadBoolean(); sequenceHeader.EnableIntraEdgeFilter = reader.ReadBoolean(); @@ -699,25 +696,15 @@ internal class ObuReader ObuTileGroupHeader tileInfo = new(); int superBlockColumnCount; int superBlockRowCount; - int superBlockShift; - if (sequenceHeader.Use128x128Superblock) - { - superBlockColumnCount = (frameInfo.ModeInfoColumnCount + 31) >> 5; - superBlockRowCount = (frameInfo.ModeInfoRowCount + 31) >> 5; - superBlockShift = 5; - } - else - { - superBlockColumnCount = (frameInfo.ModeInfoColumnCount + 15) >> 4; - superBlockRowCount = (frameInfo.ModeInfoRowCount + 15) >> 4; - superBlockShift = 4; - } + int superBlockShift = sequenceHeader.SuperblockSizeLog2 - Av1Constants.ModeInfoSizeLog2; + superBlockColumnCount = (frameInfo.ModeInfoColumnCount + sequenceHeader.SuperblockModeInfoSize - 1) >> superBlockShift; + superBlockRowCount = (frameInfo.ModeInfoRowCount + sequenceHeader.SuperblockModeInfoSize - 1) >> superBlockShift; - int superBlockSize = superBlockShift + 2; - int maxTileAreaOfSuperBlock = Av1Constants.MaxTileArea >> (2 * superBlockSize); + int superBlockSizeLog2 = superBlockShift + 2; + int maxTileAreaOfSuperBlock = Av1Constants.MaxTileArea >> (2 * superBlockSizeLog2); - tileInfo.MaxTileWidthSuperBlock = Av1Constants.MaxTileWidth >> superBlockSize; - tileInfo.MaxTileHeightSuperBlock = (Av1Constants.MaxTileArea / Av1Constants.MaxTileWidth) >> superBlockSize; + tileInfo.MaxTileWidthSuperBlock = Av1Constants.MaxTileWidth >> superBlockSizeLog2; + tileInfo.MaxTileHeightSuperBlock = (Av1Constants.MaxTileArea / Av1Constants.MaxTileWidth) >> superBlockSizeLog2; tileInfo.MinLog2TileColumnCount = TileLog2(tileInfo.MaxTileWidthSuperBlock, superBlockColumnCount); tileInfo.MaxLog2TileColumnCount = TileLog2(1, Math.Min(superBlockColumnCount, Av1Constants.MaxTileColumnCount)); tileInfo.MaxLog2TileRowCount = TileLog2(1, Math.Min(superBlockRowCount, Av1Constants.MaxTileRowCount)); diff --git a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuSequenceHeader.cs b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuSequenceHeader.cs index 34ce917634..ac87eefe74 100644 --- a/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuSequenceHeader.cs +++ b/src/ImageSharp/Formats/Heif/Av1/OpenBitstreamUnit/ObuSequenceHeader.cs @@ -5,6 +5,8 @@ namespace SixLabors.ImageSharp.Formats.Heif.Av1.OpenBitstreamUnit; internal class ObuSequenceHeader { + private bool use128x128Superblock; + public bool EnableFilterIntra { get; set; } public bool EnableCdef { get; set; } @@ -37,13 +39,23 @@ internal class ObuSequenceHeader public int MaxFrameHeight { get; set; } - public bool Use128x128Superblock { get; set; } + public bool Use128x128Superblock + { + get => this.use128x128Superblock; + set + { + this.use128x128Superblock = value; + this.SuperblockSize = value ? Av1BlockSize.Block128x128 : Av1BlockSize.Block64x64; + this.SuperblockSizeLog2 = value ? 7 : 6; + this.SuperblockModeInfoSize = 1 << (this.SuperblockSizeLog2 - Av1Constants.ModeInfoSizeLog2); + } + } - public Av1BlockSize SuperblockSize { get; set; } + public Av1BlockSize SuperblockSize { get; private set; } - public int SuperblockModeInfoSize { get; set; } + public int SuperblockModeInfoSize { get; private set; } - public int SuperblockSizeLog2 { get; set; } + public int SuperblockSizeLog2 { get; private set; } public int FilterIntraLevel { get; set; } diff --git a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs index 10fdcdf6cf..a05aa63a04 100644 --- a/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs +++ b/src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs @@ -114,7 +114,6 @@ internal class Av1TileDecoder : IAv1TileDecoder Point superblockPosition = new(superBlockColumn, superBlockRow); Av1SuperblockInfo superblockInfo = this.FrameBuffer.GetSuperblock(superblockPosition); - // this.ClearBlockDecodedFlags(modeInfoLocation, superBlock4x4Size); Point modeInfoPosition = new(column, row); this.FrameBuffer.ClearCdef(superblockPosition); this.firstTransformOffset[0] = 0; @@ -128,14 +127,6 @@ internal class Av1TileDecoder : IAv1TileDecoder private void ClearLoopFilterDelta() => this.FrameBuffer.ClearDeltaLoopFilter(); - /// - /// 5.11.3. Clear block decoded flags function. - /// - private static void ClearBlockDecodedFlags(Point modeInfoLocation, int superBlock4x4Size) - { - // Nothing to do here. - } - private void ReadLoopRestoration(Point modeInfoLocation, Av1BlockSize superBlockSize) { int planesCount = this.SequenceHeader.ColorConfig.PlaneCount;