Browse Source

Implement GetPlaneResidualSize()

pull/2633/head
Brian Popow 2 years ago
parent
commit
13173a3906
  1. 2
      src/ImageSharp/Formats/Heif/Av1/Av1BlockSize.cs
  2. 34
      src/ImageSharp/Formats/Heif/Av1/Av1LookupTables.cs
  3. 14
      src/ImageSharp/Formats/Heif/Av1/Tiling/Av1TileDecoder.cs

2
src/ImageSharp/Formats/Heif/Av1/Av1BlockSize.cs

@ -3,7 +3,7 @@
namespace SixLabors.ImageSharp.Formats.Heif.Av1; namespace SixLabors.ImageSharp.Formats.Heif.Av1;
internal enum Av1BlockSize internal enum Av1BlockSize : byte
{ {
// See sction 6.10.4 of the Av1 Specification. // See sction 6.10.4 of the Av1 Specification.

34
src/ImageSharp/Formats/Heif/Av1/Av1LookupTables.cs

@ -0,0 +1,34 @@
// Copyright (c) Six Labors.
// Licensed under the Six Labors Split License.
namespace SixLabors.ImageSharp.Formats.Heif.Av1;
internal static class Av1LookupTables
{
// The Subsampled_Size table in the spec (Section 5.11.38. Get plane residual size function).
public static Av1BlockSize[,,] SubSampledSize =
{
{ { Av1BlockSize.Block4x4, Av1BlockSize.Block4x4 }, { Av1BlockSize.Block4x4, Av1BlockSize.Block4x4 } },
{ { Av1BlockSize.Block4x8, Av1BlockSize.Block4x4 }, { Av1BlockSize.Invalid, Av1BlockSize.Block4x4 } },
{ { Av1BlockSize.Block8x4, Av1BlockSize.Invalid }, { Av1BlockSize.Block4x4, Av1BlockSize.Block4x4 } },
{ { Av1BlockSize.Block8x8, Av1BlockSize.Block8x4 }, { Av1BlockSize.Block4x8, Av1BlockSize.Block4x4 } },
{ { Av1BlockSize.Block8x16, Av1BlockSize.Block8x8 }, { Av1BlockSize.Invalid, Av1BlockSize.Block4x8 } },
{ { Av1BlockSize.Block16x8, Av1BlockSize.Invalid }, { Av1BlockSize.Block8x8, Av1BlockSize.Block8x4 } },
{ { Av1BlockSize.Block16x16, Av1BlockSize.Block16x8 }, { Av1BlockSize.Block8x16, Av1BlockSize.Block8x8 } },
{ { Av1BlockSize.Block16x32, Av1BlockSize.Block16x16 }, { Av1BlockSize.Invalid, Av1BlockSize.Block8x16 } },
{ { Av1BlockSize.Block32x16, Av1BlockSize.Invalid }, { Av1BlockSize.Block16x16, Av1BlockSize.Block16x8 } },
{ { Av1BlockSize.Block32x32, Av1BlockSize.Block32x16 }, { Av1BlockSize.Block16x32, Av1BlockSize.Block16x16 } },
{ { Av1BlockSize.Block32x64, Av1BlockSize.Block32x32 }, { Av1BlockSize.Invalid, Av1BlockSize.Block16x32 } },
{ { Av1BlockSize.Block64x32, Av1BlockSize.Invalid }, { Av1BlockSize.Block32x32, Av1BlockSize.Block32x16 } },
{ { Av1BlockSize.Block64x64, Av1BlockSize.Block64x32 }, { Av1BlockSize.Block32x64, Av1BlockSize.Block32x32 } },
{ { Av1BlockSize.Block64x128, Av1BlockSize.Block64x64 }, { Av1BlockSize.Invalid, Av1BlockSize.Block32x64 } },
{ { Av1BlockSize.Block128x64, Av1BlockSize.Invalid }, { Av1BlockSize.Block64x64, Av1BlockSize.Block64x32 } },
{ { Av1BlockSize.Block128x128, Av1BlockSize.Block128x64 }, { Av1BlockSize.Block64x128, Av1BlockSize.Block64x64 } },
{ { Av1BlockSize.Block4x16, Av1BlockSize.Block4x8 }, { Av1BlockSize.Invalid, Av1BlockSize.Block4x8 } },
{ { Av1BlockSize.Block16x4, Av1BlockSize.Invalid }, { Av1BlockSize.Block8x4, Av1BlockSize.Block8x4 } },
{ { Av1BlockSize.Block8x32, Av1BlockSize.Block8x16 }, { Av1BlockSize.Invalid, Av1BlockSize.Block4x16 } },
{ { Av1BlockSize.Block32x8, Av1BlockSize.Invalid }, { Av1BlockSize.Block16x8, Av1BlockSize.Block16x4 } },
{ { Av1BlockSize.Block16x64, Av1BlockSize.Block16x32 }, { Av1BlockSize.Invalid, Av1BlockSize.Block8x32 } },
{ { Av1BlockSize.Block64x16, Av1BlockSize.Invalid }, { Av1BlockSize.Block32x16, Av1BlockSize.Block32x8 } },
};
}

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

@ -451,7 +451,19 @@ internal class Av1TileDecoder : IAv1TileDecoder
private Av1TransformSize GetSize(int plane, object transformSize) => throw new NotImplementedException(); private Av1TransformSize GetSize(int plane, object transformSize) => throw new NotImplementedException();
private Av1BlockSize GetPlaneResidualSize(Av1BlockSize sizeChunk, int plane) => throw new NotImplementedException(); /// <summary>
/// 5.11.38. Get plane residual size function.
/// The GetPlaneResidualSize returns the size of a residual block for the specified plane. (The residual block will always
/// have width and height at least equal to 4.)
/// </summary>
private Av1BlockSize GetPlaneResidualSize(Av1BlockSize sizeChunk, int plane)
{
int subsamplingX = this.SequenceHeader.ColorConfig.SubSamplingX ? 1 : 0;
int subsamplingY = this.SequenceHeader.ColorConfig.SubSamplingY ? 1 : 0;
int subX = plane > 0 ? subsamplingX : 0;
int subY = plane > 0 ? subsamplingY : 0;
return Av1LookupTables.SubSampledSize[(byte)sizeChunk, subX, subY];
}
/// <summary> /// <summary>
/// 5.11.35. Transform block syntax. /// 5.11.35. Transform block syntax.

Loading…
Cancel
Save