Browse Source

Add HEVC Range Extensions presentation matrix

pull/2633/head
James Jackson-South 3 days ago
parent
commit
640b64ee58
  1. 215
      tests/ImageSharp.Tests/Formats/Heif/HeifDecoderTests.cs
  2. 3
      tests/Images/Input/Heif/Hevc/Conformance/ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2_frame0-ffmpeg.png
  3. 3
      tests/Images/Input/Heif/Hevc/Conformance/ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2_frame0.heic
  4. 3
      tests/Images/Input/Heif/Hevc/Conformance/Bitdepth_A_RExt_Sony_1_frame0.heic
  5. 3
      tests/Images/Input/Heif/Hevc/Conformance/Bitdepth_B_RExt_Sony_1_frame0.heic
  6. 3
      tests/Images/Input/Heif/Hevc/Conformance/CCP_10bit_RExt_QCOM_frame0-ffmpeg.png
  7. 3
      tests/Images/Input/Heif/Hevc/Conformance/CCP_10bit_RExt_QCOM_frame0.heic
  8. 3
      tests/Images/Input/Heif/Hevc/Conformance/CCP_12bit_RExt_QCOM_frame0-ffmpeg.png
  9. 3
      tests/Images/Input/Heif/Hevc/Conformance/CCP_12bit_RExt_QCOM_frame0.heic
  10. 3
      tests/Images/Input/Heif/Hevc/Conformance/CCP_8bit_RExt_QCOM_frame0-ffmpeg.png
  11. 3
      tests/Images/Input/Heif/Hevc/Conformance/CCP_8bit_RExt_QCOM_frame0.heic
  12. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1_extended-hm-ffmpeg.png
  13. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1_extended.heic
  14. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1_extended-hm-ffmpeg.png
  15. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1_extended.heic
  16. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1_extended-hm-ffmpeg.png
  17. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1_extended.heic
  18. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1_extended-ffmpeg.png
  19. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1_extended.heic
  20. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1-ffmpeg.png
  21. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1.heic
  22. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1_extended-ffmpeg.png
  23. 3
      tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1_extended.heic
  24. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_420_RExt_Sony_1-ffmpeg.png
  25. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_420_RExt_Sony_1.heic
  26. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_422_RExt_Sony_1-ffmpeg.png
  27. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_422_RExt_Sony_1.heic
  28. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_444_RExt_Sony_2-ffmpeg.png
  29. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_444_RExt_Sony_2.heic
  30. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_400_RExt_Sony_1-hm-ffmpeg.png
  31. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_400_RExt_Sony_1.heic
  32. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_420_RExt_Sony_1-ffmpeg.png
  33. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_420_RExt_Sony_1.heic
  34. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_422_RExt_Sony_1-ffmpeg.png
  35. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_422_RExt_Sony_1.heic
  36. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_444_RExt_Sony_2-ffmpeg.png
  37. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_444_RExt_Sony_2.heic
  38. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_400_RExt_Sony_1-hm-ffmpeg.png
  39. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_400_RExt_Sony_1.heic
  40. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_420_RExt_Sony_1-ffmpeg.png
  41. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_420_RExt_Sony_1.heic
  42. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_444_RExt_Sony_2-ffmpeg.png
  43. 3
      tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_444_RExt_Sony_2.heic
  44. 3
      tests/Images/Input/Heif/Hevc/Conformance/IPCM_A_RExt_NEC_2_frame0-ffmpeg.png
  45. 3
      tests/Images/Input/Heif/Hevc/Conformance/IPCM_A_RExt_NEC_2_frame0.heic
  46. 3
      tests/Images/Input/Heif/Hevc/Conformance/IPCM_B_RExt_NEC_frame0-ffmpeg.png
  47. 3
      tests/Images/Input/Heif/Hevc/Conformance/IPCM_B_RExt_NEC_frame0.heic
  48. 3
      tests/Images/Input/Heif/Hevc/Conformance/Main_422_10_A_RExt_Sony_2_frame0-ffmpeg.png
  49. 3
      tests/Images/Input/Heif/Hevc/Conformance/Main_422_10_A_RExt_Sony_2_frame0.heic
  50. 3
      tests/Images/Input/Heif/Hevc/Conformance/Main_422_10_B_RExt_Sony_2_frame0-ffmpeg.png
  51. 3
      tests/Images/Input/Heif/Hevc/Conformance/Main_422_10_B_RExt_Sony_2_frame0.heic
  52. 3
      tests/Images/Input/Heif/Hevc/Conformance/PERSIST_RPARAM_A_RExt_Sony_3_frame0-ffmpeg.png
  53. 3
      tests/Images/Input/Heif/Hevc/Conformance/PERSIST_RPARAM_A_RExt_Sony_3_frame0.heic
  54. 74
      tests/Images/Input/Heif/Hevc/Conformance/PRESENTATION_SHA256.md
  55. 21
      tests/Images/Input/Heif/Hevc/Conformance/README.md
  56. 3
      tests/Images/Input/Heif/Hevc/Conformance/TSCTX_10bit_I_RExt_SHARP_1_frame0-ffmpeg.png
  57. 3
      tests/Images/Input/Heif/Hevc/Conformance/TSCTX_10bit_I_RExt_SHARP_1_frame0.heic
  58. 3
      tests/Images/Input/Heif/Hevc/Conformance/TSCTX_12bit_I_RExt_SHARP_1_frame0-ffmpeg.png
  59. 3
      tests/Images/Input/Heif/Hevc/Conformance/TSCTX_12bit_I_RExt_SHARP_1_frame0.heic
  60. 3
      tests/Images/Input/Heif/Hevc/Conformance/TSCTX_8bit_I_RExt_SHARP_1_frame0-ffmpeg.png
  61. 3
      tests/Images/Input/Heif/Hevc/Conformance/TSCTX_8bit_I_RExt_SHARP_1_frame0.heic
  62. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_10Bit422Test_HIGH_TP_444_10BIT_RExt_Apple_2_frame0-hm-ffmpeg.png
  63. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_10Bit422Test_HIGH_TP_444_10BIT_RExt_Apple_2_frame0.heic
  64. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_AND_CABAC_BYPASS_ALIGN_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0-hm-ffmpeg.png
  65. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_AND_CABAC_BYPASS_ALIGN_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0.heic
  66. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_AND_CABAC_EXT_PREC_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0-hm-ffmpeg.png
  67. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_AND_CABAC_EXT_PREC_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0.heic
  68. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_HIGH_TP_444_8BIT_RExt_Apple_2_frame0-hm-ffmpeg.png
  69. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_HIGH_TP_444_8BIT_RExt_Apple_2_frame0.heic
  70. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_HIGH_TP_444_8BIT_RExt_Apple_2_frame0-ffmpeg.png
  71. 3
      tests/Images/Input/Heif/Hevc/Conformance/WPP_HIGH_TP_444_8BIT_RExt_Apple_2_frame0.heic

215
tests/ImageSharp.Tests/Formats/Heif/HeifDecoderTests.cs

@ -10,6 +10,8 @@ using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing;
using SixLabors.ImageSharp.Tests.ColorProfiles.Icc; using SixLabors.ImageSharp.Tests.ColorProfiles.Icc;
using SixLabors.ImageSharp.Tests.Memory;
using SixLabors.ImageSharp.Tests.TestUtilities;
using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison;
namespace SixLabors.ImageSharp.Tests.Formats.Heif; namespace SixLabors.ImageSharp.Tests.Formats.Heif;
@ -20,6 +22,9 @@ public class HeifDecoderTests
{ {
private const uint UnknownBoxType = 0x74657374U; private const uint UnknownBoxType = 0x74657374U;
private const HwIntrinsics HevcPresentationConfigurations =
HwIntrinsics.AllowAll | HwIntrinsics.DisableAVX512F | HwIntrinsics.DisableAVX | HwIntrinsics.DisableHWIntrinsic;
private static ReadOnlySpan<byte> MalformedJpegApp13 => private static ReadOnlySpan<byte> MalformedJpegApp13 =>
[ [
0xFF, 0xED, 0xFF, 0xED,
@ -92,6 +97,216 @@ public class HeifDecoderTests
Assert.Equal(hasIccProfile, image.Metadata.IccProfile is not null); Assert.Equal(hasIccProfile, image.Metadata.IccProfile is not null);
} }
/// <summary>
/// Verifies genuine HEIC presentation for the official HEVC profile and Range Extensions matrix against
/// independently decoded FFmpeg output.
/// </summary>
/// <param name="bitstreamPath">The retained official elementary-stream path used to derive the HEIC and reference paths.</param>
/// <param name="width">The independently reported presented width.</param>
/// <param name="height">The independently reported presented height.</param>
/// <param name="bitDepth">The maximum coded component precision.</param>
[Theory]
[InlineData(TestImages.Heif.General8Bit420, 400, 384, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.General8Bit444, 400, 384, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.General10Bit420, 400, 384, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.General10Bit422, 400, 384, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.General10Bit444, 400, 384, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.General12Bit420, 400, 384, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.General12Bit422, 400, 384, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.General12Bit444, 400, 384, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.RangeExtensionChromaAngle422, 1920, 1080, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.RangeExtensionCrossComponent8Bit444, 1280, 720, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.RangeExtensionCrossComponent10Bit444, 1920, 1080, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.RangeExtensionCrossComponent12Bit444, 2560, 1600, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.ExtendedPrecision8Bit444, 400, 384, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.ExtendedPrecision10Bit444, 400, 384, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.ExtendedPrecision12Bit444, 400, 384, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.RangeExtensionPcm10Bit422, 416, 240, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.RangeExtensionPcm12Bit444, 416, 240, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.PersistentRice12Bit444, 400, 384, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.TransformSkipContext8Bit444, 1920, 1080, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.TransformSkipContext10Bit444, 1920, 1080, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.TransformSkipContext12Bit444, 2560, 1600, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.Main42210A, 1920, 1080, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.Main42210B, 2560, 1600, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.HighThroughput8Bit420Wavefront, 1024, 768, HeifBitDepth.Bit8)]
public void DecodeHevcRangeExtensionStillImageMatchesFfmpeg(
string bitstreamPath,
int width,
int height,
HeifBitDepth bitDepth)
{
string heicPath = $"{bitstreamPath[..^4]}.heic";
string referencePath = $"{bitstreamPath[..^4]}-ffmpeg.png";
using Image<Rgba32> expected = TestFile.Create(referencePath).CreateRgba32Image();
using Image<Rgba32> actual = TestFile.Create(heicPath).CreateRgba32Image();
HeifMetadata metadata = actual.Metadata.GetHeifMetadata();
// HEVC leaves the chroma upsampling filter implementation-defined. The per-pixel threshold absorbs
// rounding-scale filter differences while the exact native-plane tests continue to prove reconstruction.
ImageComparer.TolerantPercentage(1F, 20).VerifySimilarity(expected, actual);
Assert.Equal(new Size(width, height), actual.Size);
Assert.Equal(HeifCompressionMethod.Hevc, metadata.CompressionMethod);
Assert.Equal(bitDepth, metadata.BitDepth);
Assert.Null(actual.Metadata.IccProfile);
}
/// <summary>
/// Verifies genuine monochrome HEIC presentation against FFmpeg presentation derived from official native output.
/// </summary>
/// <param name="bitstreamPath">The retained official elementary-stream path used to derive the HEIC and reference paths.</param>
/// <param name="bitDepth">The coded luma precision.</param>
[Theory]
[InlineData(TestImages.Heif.General8BitMonochrome, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.General12BitMonochrome, HeifBitDepth.Bit12)]
public void DecodeHevcMonochromeStillImageMatchesHmFfmpeg(string bitstreamPath, HeifBitDepth bitDepth)
{
string heicPath = $"{bitstreamPath[..^4]}.heic";
string referencePath = $"{bitstreamPath[..^4]}-hm-ffmpeg.png";
using Image<Rgba32> expected = TestFile.Create(referencePath).CreateRgba32Image();
using Image<Rgba32> actual = TestFile.Create(heicPath).CreateRgba32Image();
HeifMetadata metadata = actual.Metadata.GetHeifMetadata();
// The reference explicitly expands the limited-range official luma samples before RGB packing. The exact
// published luma-plane comparison remains responsible for proving HEVC reconstruction.
ImageComparer.TolerantPercentage(1F, 20).VerifySimilarity(expected, actual);
Assert.Equal(new Size(400, 384), actual.Size);
Assert.Equal(HeifCompressionMethod.Hevc, metadata.CompressionMethod);
Assert.Equal(bitDepth, metadata.BitDepth);
Assert.Null(actual.Metadata.IccProfile);
}
/// <summary>
/// Verifies genuine HEIC presentation for the official high-throughput Range Extensions streams against
/// FFmpeg presentation derived from pinned HM reference-decoder output.
/// </summary>
/// <param name="bitstreamPath">The retained official elementary-stream path used to derive the HEIC and reference paths.</param>
/// <param name="width">The independently reported presented width.</param>
/// <param name="height">The independently reported presented height.</param>
/// <param name="bitDepth">The maximum coded component precision.</param>
[Theory]
[InlineData(TestImages.Heif.HighThroughputExtendedPrecision8Bit444, 400, 384, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.HighThroughputExtendedPrecision10Bit444, 400, 384, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.HighThroughputExtendedPrecision12Bit444, 400, 384, HeifBitDepth.Bit12)]
[InlineData(TestImages.Heif.HighThroughput10Bit422TilesWavefront, 1920, 1080, HeifBitDepth.Bit10)]
[InlineData(TestImages.Heif.HighThroughput8Bit420TilesWavefront, 1024, 768, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.HighThroughput8Bit420CabacBypassAlignment, 1024, 768, HeifBitDepth.Bit8)]
[InlineData(TestImages.Heif.HighThroughput8Bit420ExtendedPrecision, 1024, 768, HeifBitDepth.Bit8)]
public void DecodeHevcHighThroughputStillImageMatchesHmFfmpeg(
string bitstreamPath,
int width,
int height,
HeifBitDepth bitDepth)
{
string heicPath = $"{bitstreamPath[..^4]}.heic";
string referencePath = $"{bitstreamPath[..^4]}-hm-ffmpeg.png";
using Image<Rgba32> expected = TestFile.Create(referencePath).CreateRgba32Image();
using Image<Rgba32> actual = TestFile.Create(heicPath).CreateRgba32Image();
HeifMetadata metadata = actual.Metadata.GetHeifMetadata();
// The HM native outputs match the published plane digests, and the matching ImageSharp tests prove exact
// reconstruction. This comparison therefore isolates the shared color-presentation path.
ImageComparer.TolerantPercentage(1F, 20).VerifySimilarity(expected, actual);
Assert.Equal(new Size(width, height), actual.Size);
Assert.Equal(HeifCompressionMethod.Hevc, metadata.CompressionMethod);
Assert.Equal(bitDepth, metadata.BitDepth);
Assert.Null(actual.Metadata.IccProfile);
}
/// <summary>
/// Verifies genuine HEIC presentation for unequal luma and chroma precision, which independent HEIF decoders
/// currently reject after reconstructing the native planes.
/// </summary>
/// <param name="bitstreamPath">The retained official elementary-stream path used to derive the HEIC path.</param>
[Theory]
[InlineData(TestImages.Heif.RangeExtensionLuma12Chroma8)]
[InlineData(TestImages.Heif.RangeExtensionLuma8Chroma12)]
public void DecodeHevcRangeExtensionUnequalBitDepthStillImage(string bitstreamPath)
{
string heicPath = $"{bitstreamPath[..^4]}.heic";
using Image<Rgba32> image = TestFile.Create(heicPath).CreateRgba32Image();
HeifMetadata metadata = image.Metadata.GetHeifMetadata();
Assert.Equal(new Size(1920, 1080), image.Size);
Assert.Equal(HeifCompressionMethod.Hevc, metadata.CompressionMethod);
Assert.Equal(HeifBitDepth.Bit12, metadata.BitDepth);
Assert.Null(image.Metadata.IccProfile);
}
/// <summary>
/// Verifies representative genuine HEIC Range Extensions presentation with allocator-split buffers and
/// exactly-once final disposal.
/// </summary>
/// <param name="bitstreamPath">The retained official elementary-stream path used to derive the HEIC and reference paths.</param>
/// <param name="referenceSuffix">The suffix identifying the independently produced presentation reference.</param>
/// <param name="width">The independently reported presented width.</param>
/// <param name="height">The independently reported presented height.</param>
[Theory]
[InlineData(TestImages.Heif.General8Bit420, "-ffmpeg.png", 400, 384)]
[InlineData(TestImages.Heif.General10Bit422, "-ffmpeg.png", 400, 384)]
[InlineData(TestImages.Heif.General12Bit444, "-ffmpeg.png", 400, 384)]
[InlineData(TestImages.Heif.General12BitMonochrome, "-hm-ffmpeg.png", 400, 384)]
[InlineData(TestImages.Heif.HighThroughput8Bit420ExtendedPrecision, "-hm-ffmpeg.png", 1024, 768)]
public void DecodeHevcRangeExtensionStillImageWithConstrainedAllocator(
string bitstreamPath,
string referenceSuffix,
int width,
int height)
{
string heicPath = $"{bitstreamPath[..^4]}.heic";
string referencePath = $"{bitstreamPath[..^4]}{referenceSuffix}";
byte[] imageBytes = TestFile.Create(heicPath).Bytes;
TestMemoryAllocator allocator = new() { BufferCapacityInBytes = 4_096 };
allocator.EnableNonThreadSafeLogging();
Configuration configuration = Configuration.Default.Clone();
configuration.MemoryAllocator = allocator;
DecoderOptions options = new() { Configuration = configuration };
using (Image<Rgba32> expected = TestFile.Create(referencePath).CreateRgba32Image())
using (Image<Rgba32> actual = Image.Load<Rgba32>(options, imageBytes))
{
Assert.Equal(new Size(width, height), actual.Size);
ImageComparer.TolerantPercentage(1F, 20).VerifySimilarity(expected, actual);
}
Assert.NotEmpty(allocator.AllocationLog);
Assert.Equal(allocator.AllocationLog.Count, allocator.ReturnLog.Count);
Assert.All(
allocator.AllocationLog,
allocation => Assert.Single(
allocator.ReturnLog,
returned => returned.AllocationId == allocation.AllocationId));
}
/// <summary>
/// Verifies representative eight-bit subsampled and high-bit-depth full-resolution presentation through every
/// available vector width and the scalar fallback.
/// </summary>
[Fact]
public void DecodeHevcRangeExtensionPresentationMatchesAcrossIntrinsicWidths()
=> FeatureTestRunner.RunWithHwIntrinsicsFeature(
ValidateHevcRangeExtensionPresentation,
HevcPresentationConfigurations);
private static void ValidateHevcRangeExtensionPresentation()
{
string subsampledPath = TestImages.Heif.General8Bit420[..^4];
using Image<Rgba32> subsampledExpected = TestFile.Create($"{subsampledPath}-ffmpeg.png").CreateRgba32Image();
using Image<Rgba32> subsampledActual = TestFile.Create($"{subsampledPath}.heic").CreateRgba32Image();
ImageComparer.TolerantPercentage(1F, 20).VerifySimilarity(subsampledExpected, subsampledActual);
string fullResolutionPath = TestImages.Heif.HighThroughputExtendedPrecision12Bit444[..^4];
using Image<Rgba32> fullResolutionExpected = TestFile.Create($"{fullResolutionPath}-hm-ffmpeg.png").CreateRgba32Image();
using Image<Rgba32> fullResolutionActual = TestFile.Create($"{fullResolutionPath}.heic").CreateRgba32Image();
ImageComparer.TolerantPercentage(1F, 20).VerifySimilarity(fullResolutionExpected, fullResolutionActual);
}
/// <summary> /// <summary>
/// Verifies that AVIF decoding preserves the exact embedded ICC profile bytes. /// Verifies that AVIF decoding preserves the exact embedded ICC profile bytes.
/// </summary> /// </summary>

3
tests/Images/Input/Heif/Hevc/Conformance/ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b3d467add4b0a41575228af86011a4f0d003003df267c639ca7dab4a290997a2
size 2729225

3
tests/Images/Input/Heif/Hevc/Conformance/ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0b36e994059522739e53eedbacae7ccca5edfe67934fe841fbb400388b926abc
size 77732

3
tests/Images/Input/Heif/Hevc/Conformance/Bitdepth_A_RExt_Sony_1_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:83a143499278c1950f191ffe84d04d6aaf6cfb41077f52a78dd686de0e4a9cd2
size 27087

3
tests/Images/Input/Heif/Hevc/Conformance/Bitdepth_B_RExt_Sony_1_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1dd4464942006d50126b6a79db8e7e1ab6c53833cf1802eca047803086f4bc4b
size 27115

3
tests/Images/Input/Heif/Hevc/Conformance/CCP_10bit_RExt_QCOM_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d94be2ff029467ba3f0cc6e48c735966edf9c57424c0175fceed14a5d9434dbb
size 2427308

3
tests/Images/Input/Heif/Hevc/Conformance/CCP_10bit_RExt_QCOM_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f3c9f9adce22f14fa9f9fe6cf566a0cb3336e0ce71dc98d763b49f268c19b425
size 44695

3
tests/Images/Input/Heif/Hevc/Conformance/CCP_12bit_RExt_QCOM_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f27738eb42338db6db0ab3e8b392ac5407e51473ffceefd00f318b06b124d249
size 5167261

3
tests/Images/Input/Heif/Hevc/Conformance/CCP_12bit_RExt_QCOM_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d42fc1b58c55a4d1ab7f385a4479a7dd029c0f3a4fd4244eab11f3147a90270a
size 365792

3
tests/Images/Input/Heif/Hevc/Conformance/CCP_8bit_RExt_QCOM_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e4b107ab968f826a9d710be90255842af0315e475516b3b5cf3361dcd226fd81
size 953520

3
tests/Images/Input/Heif/Hevc/Conformance/CCP_8bit_RExt_QCOM_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d4b6ba7ec0edc57e4ae3a50369d83a53382801dd413412c5224896c8f71cafd6
size 29269

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1_extended-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bf61f91cbc21d8172d4000dcffb2e5a6e1d56877cc354465548f00bf106b8923
size 255832

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1_extended.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f9b828da68543a5a8724bf317cec4b7c63289322338a98e8164c3a51668a749b
size 149669

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1_extended-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:66d5e15924db6ca2b7344edc8e200a6cc00674369105d23ebe67b03b39e782f8
size 250554

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1_extended.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b50903b1cd8bef1ca9a7128a09c11fe29a0cca4bfa76d9fd5360a81d3093f216
size 207122

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1_extended-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bae712cbd64ba5eb491780509b483b2d83ea531a630a9913b2a9af649a70b096
size 259753

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1_extended.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6ff37e993f514becbf9ccc055863fb105c0e506f99caeb2a0f576c27f4a9cf67
size 93916

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1_extended-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:27fafaa241c530ee7c4b0b22cdbcac13414b2a5bd742c61f31d9857e1ea52f3f
size 256815

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1_extended.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e05c498eccf1c6fa5f273a8a61441b703df82eb6267ba6add646f22a328ee8b1
size 148409

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:35c73148eb3eeff74890086d82514d9419e9c2d672a6e0eb5a25ac97752422a8
size 251208

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:63bb00619cb2deb4986df6d42ec805ba0c1895e7ab0534e4a81ca43ada140861
size 205642

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1_extended-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:70b46a41052be1727ee286c84b71e6952e363ce9ff1af35b7c571280d40c59d2
size 260306

3
tests/Images/Input/Heif/Hevc/Conformance/EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1_extended.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:72e84f04f278d7a3bd02e215a2fd7d0bbe5dfc6d1ac2048dca57ec4ef36b6a73
size 93073

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_420_RExt_Sony_1-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9196dfaaaf4fc256e663b2b6974671bed9dfb19b26211af936ccf389cb7de156
size 195771

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_420_RExt_Sony_1.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:091a1dc8aaf44706b153d61c35f4eb93e27c458704a41f3f2e645b81e5e7d845
size 30801

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_422_RExt_Sony_1-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8d865c89c8ed3a0315ed37ecae3a8738d0abdac92fb890b94024bbd6e6c0a981
size 208613

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_422_RExt_Sony_1.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:18644ca5cfe89c4a50145d4a9ce5e5cd9ef240b6bea134f13020e2194889b538
size 36130

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_444_RExt_Sony_2-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:bbdb9ac98e1a65f6b0f9f6d4e8d3d3128179f330f9160862755204f01bf15670
size 205100

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_10b_444_RExt_Sony_2.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7070b0a6368ca02fe33310dcf54b7f5da61a4413444308cf99b1a8e49dab43b4
size 43247

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_400_RExt_Sony_1-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:90ec0f69b33f264b98a07885815d2b5e1bb8dfb2cdcef61ecbc06bc47ec36eb9
size 87886

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_400_RExt_Sony_1.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:af534c6238e9fb7c2b4f2a97f053b232d073eb31bd175b4d32e83e2128bb4d67
size 38595

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_420_RExt_Sony_1-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:51fe712b737f62227437fcd33c02aa223b618d051a6da300637bbf7e3cca92f2
size 204265

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_420_RExt_Sony_1.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:814433b3109b2fa1f2408f424f6aa38e17f92b4e50f4996d2ca59a2baa84a30a
size 57541

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_422_RExt_Sony_1-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3e365ce81652df437b699d4e4a438be7cc3b48b64488600e5bfb133299da59f5
size 216345

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_422_RExt_Sony_1.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d88d5f0225061eef053bfc193d83334624ec80a6653a8e15792bc320973d25f5
size 69910

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_444_RExt_Sony_2-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:09f1244f554076b1452fa1a8c280f87d876d7eaee6b81fda23448648c8749a8f
size 210526

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_12b_444_RExt_Sony_2.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:da264470c99586d99280fb861273c69b982a2ac6d962bd7408751c8bfe186332
size 85534

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_400_RExt_Sony_1-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2dab4ae93efc085770d811887e171d7b8de0c41aa670cb945429f7b198b0ffd9
size 85162

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_400_RExt_Sony_1.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0dfce3b603a81c253d0a70827d1edea45554adc405068a4a277eea2286af8304
size 10712

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_420_RExt_Sony_1-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ea750b757fec4eb5650ac28454a98a0117a810b01bdeb29b0c91aab5ccaa5e44
size 161043

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_420_RExt_Sony_1.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:68bcd1fa5e8ffcfa7e9fb4a7c9b091b9096db4e7be27b8bd6c336439df217f1d
size 14457

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_444_RExt_Sony_2-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ad14c2742160a9fc9443833d16822de1231b253e50a8eef9cf325bdfc7b0686a
size 189475

3
tests/Images/Input/Heif/Hevc/Conformance/GENERAL_8b_444_RExt_Sony_2.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:cacde3604855b57280977daa9ecc4073f4ac30973aa530a30727b88d3395763f
size 19050

3
tests/Images/Input/Heif/Hevc/Conformance/IPCM_A_RExt_NEC_2_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dd910cd903aebb550143f498e25cfec9505c63181116499f6693985fb332c5e6
size 149133

3
tests/Images/Input/Heif/Hevc/Conformance/IPCM_A_RExt_NEC_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6575bd13224e8c48db8ea3b2ffea9cfdb4b2444c84193f43a1eabef2c6f76342
size 4637

3
tests/Images/Input/Heif/Hevc/Conformance/IPCM_B_RExt_NEC_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:068d8a89a8cae39d87c3768f8a2894387159557433d57aacda5115a27869c9ba
size 149637

3
tests/Images/Input/Heif/Hevc/Conformance/IPCM_B_RExt_NEC_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:20b2814c29ae04acd57718ab75fd8fc32b49975a08af9ace98918af1dff814fe
size 5337

3
tests/Images/Input/Heif/Hevc/Conformance/Main_422_10_A_RExt_Sony_2_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d56d487a16836ac7d4016bc57eedcbf586e401962c5740879f7760e63ba6788e
size 3728772

3
tests/Images/Input/Heif/Hevc/Conformance/Main_422_10_A_RExt_Sony_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5ee8360a7400db49f7d9ca790e73eed7947b3a267e115714d2581bdea628f04e
size 633003

3
tests/Images/Input/Heif/Hevc/Conformance/Main_422_10_B_RExt_Sony_2_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:acdde43497ae13edc07a74ae182877dd1cc9b98da81fc9c3b5ac1cb02210186a
size 6566287

3
tests/Images/Input/Heif/Hevc/Conformance/Main_422_10_B_RExt_Sony_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:efeff0451cce627bbd73fec725cc38c759cf3de07010050642e6debcc3f57448
size 1114175

3
tests/Images/Input/Heif/Hevc/Conformance/PERSIST_RPARAM_A_RExt_Sony_3_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:11758488f57cdcf97ece9dfcc35b467c349ac79cb3b8855a6e3fa7753052e59f
size 246886

3
tests/Images/Input/Heif/Hevc/Conformance/PERSIST_RPARAM_A_RExt_Sony_3_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9fc9c32108dd3ee8b37f138428f39caf6a1701f161778c1258100c754ed9378b
size 329635

74
tests/Images/Input/Heif/Hevc/Conformance/PRESENTATION_SHA256.md

@ -0,0 +1,74 @@
# Genuine HEIC presentation fixture SHA-256
These hashes cover every retained genuine HEIC container and independent PNG presentation reference used by the HEVC Range Extensions presentation matrix.
| File | SHA-256 |
| --- | --- |
| `ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2_frame0-ffmpeg.png` | `B3D467ADD4B0A41575228AF86011A4F0D003003DF267C639CA7DAB4A290997A2` |
| `ADJUST_IPRED_ANGLE_A_RExt_Mitsubishi_2_frame0.heic` | `0B36E994059522739E53EEDBACAE7CCCA5EDFE67934FE841FBB400388B926ABC` |
| `Bitdepth_A_RExt_Sony_1_frame0.heic` | `83A143499278C1950F191FFE84D04D6AAF6CFB41077F52A78DD686DE0E4A9CD2` |
| `Bitdepth_B_RExt_Sony_1_frame0.heic` | `1DD4464942006D50126B6A79DB8E7E1AB6C53833CF1802ECA047803086F4BC4B` |
| `CCP_10bit_RExt_QCOM_frame0-ffmpeg.png` | `D94BE2FF029467BA3F0CC6E48C735966EDF9C57424C0175FCEED14A5D9434DBB` |
| `CCP_10bit_RExt_QCOM_frame0.heic` | `F3C9F9ADCE22F14FA9F9FE6CF566A0CB3336E0CE71DC98D763B49F268C19B425` |
| `CCP_12bit_RExt_QCOM_frame0-ffmpeg.png` | `F27738EB42338DB6DB0AB3E8B392AC5407E51473FFCEEFD00F318B06B124D249` |
| `CCP_12bit_RExt_QCOM_frame0.heic` | `D42FC1B58C55A4D1AB7F385A4479A7DD029C0F3A4FD4244EAB11F3147A90270A` |
| `CCP_8bit_RExt_QCOM_frame0-ffmpeg.png` | `E4B107AB968F826A9D710BE90255842AF0315E475516B3B5CF3361DCD226FD81` |
| `CCP_8bit_RExt_QCOM_frame0.heic` | `D4B6BA7EC0EDC57E4AE3A50369D83A53382801DD413412C5224896C8F71CAFD6` |
| `EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1_extended-hm-ffmpeg.png` | `BF61F91CBC21D8172D4000DCFFB2E5A6E1D56877CC354465548F00BF106B8923` |
| `EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1_extended.heic` | `F9B828DA68543A5A8724BF317CEC4B7C63289322338A98E8164C3A51668A749B` |
| `EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1_extended-hm-ffmpeg.png` | `66D5E15924DB6CA2B7344EDC8E200A6CC00674369105D23EBE67B03B39E782F8` |
| `EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1_extended.heic` | `B50903B1CD8BEF1CA9A7128A09C11FE29A0CCA4BFA76D9FD5360A81D3093F216` |
| `EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1_extended-hm-ffmpeg.png` | `BAE712CBD64BA5EB491780509B483B2D83EA531A630A9913B2A9AF649A70B096` |
| `EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1_extended.heic` | `6FF37E993F514BECBF9CCC055863FB105C0E506F99CAEB2A0F576C27F4A9CF67` |
| `EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1_extended-ffmpeg.png` | `27FAFAA241C530EE7C4B0B22CDBCAC13414B2A5BD742C61F31D9857E1EA52F3F` |
| `EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1_extended.heic` | `E05C498ECCF1C6FA5F273A8A61441B703DF82EB6267BA6ADD646F22A328EE8B1` |
| `EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1-ffmpeg.png` | `35C73148EB3EEFF74890086D82514D9419E9C2D672A6E0EB5A25AC97752422A8` |
| `EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1.heic` | `63BB00619CB2DEB4986DF6D42EC805BA0C1895E7AB0534E4A81CA43ADA140861` |
| `EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1_extended-ffmpeg.png` | `70B46A41052BE1727EE286C84B71E6952E363CE9FF1AF35B7C571280D40C59D2` |
| `EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1_extended.heic` | `72E84F04F278D7A3BD02E215A2FD7D0BBE5DFC6D1AC2048DCA57EC4EF36B6A73` |
| `GENERAL_10b_420_RExt_Sony_1-ffmpeg.png` | `9196DFAAAF4FC256E663B2B6974671BED9DFB19B26211AF936CCF389CB7DE156` |
| `GENERAL_10b_420_RExt_Sony_1.heic` | `091A1DC8AAF44706B153D61C35F4EB93E27C458704A41F3F2E645B81E5E7D845` |
| `GENERAL_10b_422_RExt_Sony_1-ffmpeg.png` | `8D865C89C8ED3A0315ED37ECAE3A8738D0ABDAC92FB890B94024BBD6E6C0A981` |
| `GENERAL_10b_422_RExt_Sony_1.heic` | `18644CA5CFE89C4A50145D4A9CE5E5CD9EF240B6BEA134F13020E2194889B538` |
| `GENERAL_10b_444_RExt_Sony_2-ffmpeg.png` | `BBDB9AC98E1A65F6B0F9F6D4E8D3D3128179F330F9160862755204F01BF15670` |
| `GENERAL_10b_444_RExt_Sony_2.heic` | `7070B0A6368CA02FE33310DCF54B7F5DA61A4413444308CF99B1A8E49DAB43B4` |
| `GENERAL_12b_400_RExt_Sony_1-hm-ffmpeg.png` | `90EC0F69B33F264B98A07885815D2B5E1BB8DFB2CDCEF61ECBC06BC47EC36EB9` |
| `GENERAL_12b_400_RExt_Sony_1.heic` | `AF534C6238E9FB7C2B4F2A97F053B232D073EB31BD175B4D32E83E2128BB4D67` |
| `GENERAL_12b_420_RExt_Sony_1-ffmpeg.png` | `51FE712B737F62227437FCD33C02AA223B618D051A6DA300637BBF7E3CCA92F2` |
| `GENERAL_12b_420_RExt_Sony_1.heic` | `814433B3109B2FA1F2408F424F6AA38E17F92B4E50F4996D2CA59A2BAA84A30A` |
| `GENERAL_12b_422_RExt_Sony_1-ffmpeg.png` | `3E365CE81652DF437B699D4E4A438BE7CC3B48B64488600E5BFB133299DA59F5` |
| `GENERAL_12b_422_RExt_Sony_1.heic` | `D88D5F0225061EEF053BFC193D83334624EC80A6653A8E15792BC320973D25F5` |
| `GENERAL_12b_444_RExt_Sony_2-ffmpeg.png` | `09F1244F554076B1452FA1A8C280F87D876D7EAEE6B81FDA23448648C8749A8F` |
| `GENERAL_12b_444_RExt_Sony_2.heic` | `DA264470C99586D99280FB861273C69B982A2AC6D962BD7408751C8BFE186332` |
| `GENERAL_8b_400_RExt_Sony_1-hm-ffmpeg.png` | `2DAB4AE93EFC085770D811887E171D7B8DE0C41AA670CB945429F7B198B0FFD9` |
| `GENERAL_8b_400_RExt_Sony_1.heic` | `0DFCE3B603A81C253D0A70827D1EDEA45554ADC405068A4A277EEA2286AF8304` |
| `GENERAL_8b_420_RExt_Sony_1-ffmpeg.png` | `EA750B757FEC4EB5650AC28454A98A0117A810B01BDEB29B0C91AAB5CCAA5E44` |
| `GENERAL_8b_420_RExt_Sony_1.heic` | `68BCD1FA5E8FFCFA7E9FB4A7C9B091B9096DB4E7BE27B8BD6C336439DF217F1D` |
| `GENERAL_8b_444_RExt_Sony_2-ffmpeg.png` | `AD14C2742160A9FC9443833D16822DE1231B253E50A8EEF9CF325BDFC7B0686A` |
| `GENERAL_8b_444_RExt_Sony_2.heic` | `CACDE3604855B57280977DAA9ECC4073F4AC30973AA530A30727B88D3395763F` |
| `IPCM_A_RExt_NEC_2_frame0-ffmpeg.png` | `DD910CD903AEBB550143F498E25CFEC9505C63181116499F6693985FB332C5E6` |
| `IPCM_A_RExt_NEC_2_frame0.heic` | `6575BD13224E8C48DB8EA3B2FFEA9CFDB4B2444C84193F43A1EABEF2C6F76342` |
| `IPCM_B_RExt_NEC_frame0-ffmpeg.png` | `068D8A89A8CAE39D87C3768F8A2894387159557433D57AACDA5115A27869C9BA` |
| `IPCM_B_RExt_NEC_frame0.heic` | `20B2814C29AE04ACD57718AB75FD8FC32B49975A08AF9ACE98918AF1DFF814FE` |
| `Main_422_10_A_RExt_Sony_2_frame0-ffmpeg.png` | `D56D487A16836AC7D4016BC57EEDCBF586E401962C5740879F7760E63BA6788E` |
| `Main_422_10_A_RExt_Sony_2_frame0.heic` | `5EE8360A7400DB49F7D9CA790E73EED7947B3A267E115714D2581BDEA628F04E` |
| `Main_422_10_B_RExt_Sony_2_frame0-ffmpeg.png` | `ACDDE43497AE13EDC07A74AE182877DD1CC9B98DA81FC9C3B5AC1CB02210186A` |
| `Main_422_10_B_RExt_Sony_2_frame0.heic` | `EFEFF0451CCE627BBD73FEC725CC38C759CF3DE07010050642E6DEBCC3F57448` |
| `PERSIST_RPARAM_A_RExt_Sony_3_frame0-ffmpeg.png` | `11758488F57CDCF97ECE9DFCC35B467C349AC79CB3B8855A6E3FA7753052E59F` |
| `PERSIST_RPARAM_A_RExt_Sony_3_frame0.heic` | `9FC9C32108DD3EE8B37F138428F39CAF6A1701F161778C1258100C754ED9378B` |
| `TSCTX_10bit_I_RExt_SHARP_1_frame0-ffmpeg.png` | `F6C36D8FF915D65405C3D5705C9525FBA76B751ECD50BD64AD1470BA0BA42035` |
| `TSCTX_10bit_I_RExt_SHARP_1_frame0.heic` | `FF99931C1DA27FB150F17B67DC1BF8F167439E78EF5611F51AF5ECDDFBA5B720` |
| `TSCTX_12bit_I_RExt_SHARP_1_frame0-ffmpeg.png` | `0BCB4BBB62CAAA7D8F24BE3FDB0EECAE26EA66CD55E23D683AEBC0FBBEABEDD4` |
| `TSCTX_12bit_I_RExt_SHARP_1_frame0.heic` | `B3031636E37F8534F28FA54304287208784476AE709F52F64C54CBF5E55A3773` |
| `TSCTX_8bit_I_RExt_SHARP_1_frame0-ffmpeg.png` | `991D37D4476D2A87BA5465A96462D84B40E5CAF234F38B00A7E90215DA7F68DC` |
| `TSCTX_8bit_I_RExt_SHARP_1_frame0.heic` | `C4A1653681D5DCDE1E0B9F35C7BA6E6D546CF237F4C8D724123DA631E2C57148` |
| `WPP_AND_TILE_10Bit422Test_HIGH_TP_444_10BIT_RExt_Apple_2_frame0-hm-ffmpeg.png` | `1BBE3271FDEF0AE1328E7196D9841476C75A5865BDC40EB4D417FDFBA17B6A07` |
| `WPP_AND_TILE_10Bit422Test_HIGH_TP_444_10BIT_RExt_Apple_2_frame0.heic` | `E7C9278743E5CF8B964953FB15AC0590A9FB476959C995A8089E730D0D531D29` |
| `WPP_AND_TILE_AND_CABAC_BYPASS_ALIGN_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0-hm-ffmpeg.png` | `C1E85593BBB0523EC5D8E3DC2F97895355B9CB8D468898AC32E7622158FFFFBC` |
| `WPP_AND_TILE_AND_CABAC_BYPASS_ALIGN_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0.heic` | `BE215D5A7AB4A91B99080ED3E80BF48C93F921003A6642C2D4C92C779B8211DF` |
| `WPP_AND_TILE_AND_CABAC_EXT_PREC_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0-hm-ffmpeg.png` | `D7359C4CA58001556C3F0DA0277919BD832551C706DF8B91EC3FCA6D52E6AE9F` |
| `WPP_AND_TILE_AND_CABAC_EXT_PREC_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0.heic` | `9A685B86DD0B6A7EEFDF268F8D908E61A0FB6154AAAA86BB640B04B3E7D6FD14` |
| `WPP_AND_TILE_HIGH_TP_444_8BIT_RExt_Apple_2_frame0-hm-ffmpeg.png` | `98737664EA21735A32BAC4DD3A8D8606AEB9DE2752418682FE3C91EBD4EDDA72` |
| `WPP_AND_TILE_HIGH_TP_444_8BIT_RExt_Apple_2_frame0.heic` | `099E54D9B44702A852B9C6C37F70BD2EB31D3A0BD9BA16767E09E6CE2904FC33` |
| `WPP_HIGH_TP_444_8BIT_RExt_Apple_2_frame0-ffmpeg.png` | `8A52D404EB5B4E82443B97FC11FCCEECC2886E48D651A577CDCA5E858A871CCD` |
| `WPP_HIGH_TP_444_8BIT_RExt_Apple_2_frame0.heic` | `000C9E50DA7654FC76374A42A8EA3EAD12890B02E26FEDD103E42FD57D28AAE5` |

21
tests/Images/Input/Heif/Hevc/Conformance/README.md

@ -35,6 +35,27 @@ The remaining Range Extensions fixtures come from the official H.265.1 RExt atta
The expected plane hashes come directly from each selected picture's decoded-picture-hash SEI message when present. The CCP 8/10/12-bit, IPCM A/B, and Main 4:2:2 10 B streams omit that per-picture message. Their first reference pictures were extracted only after FFmpeg 9.0.1 reproduced the archives' published complete-output MD5 values `54231c6f121ca65d8b94a747b9504b8b`, `363f55fc6097a3bb7525392b87a6498a`, `f3e914fccdb820eac85f46642ea0e168`, `8d4eb18812338f9f475035b8da27e74a`, `eea32e6e1f88b7782515e53f8122be7d`, and `fd163bcbdc24792a23781ee7aace74eb`, respectively. The expected plane hashes come directly from each selected picture's decoded-picture-hash SEI message when present. The CCP 8/10/12-bit, IPCM A/B, and Main 4:2:2 10 B streams omit that per-picture message. Their first reference pictures were extracted only after FFmpeg 9.0.1 reproduced the archives' published complete-output MD5 values `54231c6f121ca65d8b94a747b9504b8b`, `363f55fc6097a3bb7525392b87a6498a`, `f3e914fccdb820eac85f46642ea0e168`, `8d4eb18812338f9f475035b8da27e74a`, `eea32e6e1f88b7782515e53f8122be7d`, and `fd163bcbdc24792a23781ee7aace74eb`, respectively.
## Genuine HEIC presentation matrix
The 35 `.heic` files pair every retained official Range Extensions picture above with a real ISO BMFF image item. GPAC `MP4Box` 26.07 (`26.07-rev0-ga07cbfff-master`) wrote the containers. FFmpeg 9.0.1 first copied one complete picture, including its active VPS, SPS, and PPS, from each supported Annex B stream so the `hvcC` configuration and item payload cannot select parameter sets from different concatenated pictures. The two unequal-precision streams are already bounded pictures and were passed directly to GPAC because FFmpeg rejects unequal luma and chroma precision.
The generation templates were:
```text
ffmpeg -threads 1 -i input.bit -map 0:v:0 -frames:v 1 -c copy frame0.hevc
MP4Box -add-image frame0.hevc:primary -new output.heic
```
The monochrome files add `image-pixi=8` or `image-pixi=12` to the `-add-image` argument so their `pixi` property contains exactly one channel. No `colr` property is added; the decoder must retain the HEVC VUI color description.
Twenty-four `*-ffmpeg.png` files are FFmpeg 9.0.1 presentations decoded directly from the resulting HEIC files. Nine `*-hm-ffmpeg.png` files use native samples from pinned HM commit `9c1f298659ab0cee9dc13d23d0304221575410b9`, built with `HIGH_BITDEPTH=ON`, followed by FFmpeg raw-video color conversion. Every HM plane used by those references matches the official decoded-picture-hash values. This split is intentional: FFmpeg does not reconstruct seven of the retained high-throughput pictures to their published plane digests, and its direct monochrome-to-PNG path does not expand the signaled limited luma range. The monochrome references therefore apply the exact 8- or 12-bit limited-range scale before RGB packing.
The two unequal-precision HEIC files have no PNG reference because FFmpeg and libheif reject that HEVC profile combination. Their public tests require successful bounded HEIC presentation and correct metadata, while the companion native tests compare all three planes with the published digests.
`HeifDecoderTests` covers all 35 genuine HEIC files. The 33 independently presentable cases use the repository's narrow `TolerantPercentage(1F, 20)` public-pixel contract because HEVC does not prescribe one chroma upsampling filter. Exact native-plane tests remain the reconstruction oracle. Representative 8/10/12-bit, monochrome, 4:2:0, 4:2:2, 4:4:4, and high-throughput files also pass with 4 KiB allocator groups and exactly-once returns. Eight-bit subsampled and 12-bit full-resolution presentation repeat through AVX-512, AVX, narrower vector, and scalar `FeatureTestRunner` configurations.
[`PRESENTATION_SHA256.md`](PRESENTATION_SHA256.md) records every retained HEIC and PNG SHA-256.
The SHA-256 columns below identify the downloaded archive, its original Annex B payload, and the retained bounded picture: The SHA-256 columns below identify the downloaded archive, its original Annex B payload, and the retained bounded picture:
| Retained picture | Archive SHA-256 | Original payload SHA-256 | Retained SHA-256 | | Retained picture | Archive SHA-256 | Original payload SHA-256 | Retained SHA-256 |

3
tests/Images/Input/Heif/Hevc/Conformance/TSCTX_10bit_I_RExt_SHARP_1_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f6c36d8ff915d65405c3d5705c9525fba76b751ecd50bd64ad1470ba0ba42035
size 4139230

3
tests/Images/Input/Heif/Hevc/Conformance/TSCTX_10bit_I_RExt_SHARP_1_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ff99931c1da27fb150f17b67dc1bf8f167439e78ef5611f51af5ecddfba5b720
size 165477

3
tests/Images/Input/Heif/Hevc/Conformance/TSCTX_12bit_I_RExt_SHARP_1_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0bcb4bbb62caaa7d8f24be3fdb0eecae26ea66cd55e23d683aebc0fbbeabedd4
size 5038948

3
tests/Images/Input/Heif/Hevc/Conformance/TSCTX_12bit_I_RExt_SHARP_1_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:b3031636e37f8534f28fa54304287208784476ae709f52f64c54cbf5e55a3773
size 382898

3
tests/Images/Input/Heif/Hevc/Conformance/TSCTX_8bit_I_RExt_SHARP_1_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:991d37d4476d2a87ba5465a96462d84b40e5caf234f38b00a7e90215da7f68dc
size 4113423

3
tests/Images/Input/Heif/Hevc/Conformance/TSCTX_8bit_I_RExt_SHARP_1_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c4a1653681d5dcde1e0b9f35c7ba6e6d546cf237f4c8d724123da631e2c57148
size 165950

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_10Bit422Test_HIGH_TP_444_10BIT_RExt_Apple_2_frame0-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1bbe3271fdef0ae1328e7196d9841476c75a5865bdc40eb4d417fdfba17b6a07
size 2225212

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_10Bit422Test_HIGH_TP_444_10BIT_RExt_Apple_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:e7c9278743e5cf8b964953fb15ac0590a9fb476959c995a8089e730d0d531d29
size 37516

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_AND_CABAC_BYPASS_ALIGN_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:c1e85593bbb0523ec5d8e3dc2f97895355b9cb8d468898ac32e7622158ffffbc
size 535609

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_AND_CABAC_BYPASS_ALIGN_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:be215d5a7ab4a91b99080ed3e80bf48c93f921003a6642c2d4c92c779b8211df
size 42514

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_AND_CABAC_EXT_PREC_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d7359c4ca58001556c3f0da0277919bd832551c706df8b91ec3fca6d52e6ae9f
size 534581

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_AND_CABAC_EXT_PREC_1_HIGH_TP_444_14BIT_RExt_Apple_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:9a685b86dd0b6a7eefdf268f8d908e61a0fb6154aaaa86bb640b04b3e7d6fd14
size 42164

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_HIGH_TP_444_8BIT_RExt_Apple_2_frame0-hm-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:98737664ea21735a32bac4dd3a8d8606aeb9de2752418682fe3c91ebd4edda72
size 533914

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_AND_TILE_HIGH_TP_444_8BIT_RExt_Apple_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:099e54d9b44702a852b9c6c37f70bd2eb31d3a0bd9ba16767e09e6ce2904fc33
size 42140

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_HIGH_TP_444_8BIT_RExt_Apple_2_frame0-ffmpeg.png

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8a52d404eb5b4e82443b97fc11fcceecc2886e48d651a577cdca5e858a871ccd
size 532122

3
tests/Images/Input/Heif/Hevc/Conformance/WPP_HIGH_TP_444_8BIT_RExt_Apple_2_frame0.heic

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:000c9e50da7654fc76374a42a8ea3ead12890b02e26fedd103e42fd57d28aae5
size 41933
Loading…
Cancel
Save