Browse Source

Identify AVIF files

pull/2633/head
Ynse Hoornenborg 3 years ago
parent
commit
3fae594cec
  1. 15
      src/ImageSharp/Formats/Heic/Heic4CharCode.cs
  2. 3
      src/ImageSharp/Formats/Heic/Heic4CharCode.tt
  3. 12
      src/ImageSharp/Formats/Heic/HeicDecoderCore.cs
  4. 2
      src/ImageSharp/Formats/Heic/HeicImageFormatDetector.cs
  5. 1
      tests/ImageSharp.Tests/Formats/Heic/HeicDecoderTests.cs

15
src/ImageSharp/Formats/Heic/Heic4CharCode.cs

@ -78,6 +78,11 @@ public enum Heic4CharCode : uint
/// </summary>
hvcC = 0x68766343U,
/// <summary>
/// AV1 configuration.
/// </summary>
av1C = 0x61763143U,
/// <summary>
/// Image Mirror.
/// </summary>
@ -143,6 +148,11 @@ public enum Heic4CharCode : uint
/// </summary>
mif1 = 0x6D696631U,
/// <summary>
/// AVIF brand.
/// </summary>
avif = 0x61766966U,
/// <summary>
/// High Efficiency Coding tile.
/// </summary>
@ -153,6 +163,11 @@ public enum Heic4CharCode : uint
/// </summary>
jpeg = 0x6A706567U,
/// <summary>
/// AOMedia Video Coding tile.
/// </summary>
av01 = 0x61763031U,
/// <summary>
/// Data Information.
/// </summary>

3
src/ImageSharp/Formats/Heic/Heic4CharCode.tt

@ -20,6 +20,7 @@
"altt", "Alternative text",
"colr", "Colour information",
"hvcC", "HVC configuration",
"av1C", "AV1 configuration",
"imir", "Image Mirror",
"irot", "Image Rotation",
"iscl", "Image Scaling",
@ -33,8 +34,10 @@
"heic", "High Efficient Image Coding brand",
"heix", "High Efficient Image Coding brand (legacy name)",
"mif1", "High Efficient File brand",
"avif", "AVIF brand",
"hvc1", "High Efficiency Coding tile",
"jpeg", "Legacy JPEG coded tile",
"av01", "AOMedia Video Coding tile",
"dinf", "Data Information",
"grpl", "Group list",
"hdlr", "Handler",

12
src/ImageSharp/Formats/Heic/HeicDecoderCore.cs

@ -131,10 +131,17 @@ internal sealed class HeicDecoderCore : IImageDecoderInternals
}
HeicMetadata meta = this.metadata.GetHeicMetadata();
if (this.itemLinks.Any(link => link.Type == Heic4CharCode.thmb))
HeicCompressionMethod compressionMethod = HeicCompressionMethod.Hevc;
if (item.Type == Heic4CharCode.av01)
{
meta.CompressionMethod = HeicCompressionMethod.LegacyJpeg;
compressionMethod = HeicCompressionMethod.Av1;
}
else if (this.itemLinks.Any(link => link.Type == Heic4CharCode.thmb))
{
compressionMethod = HeicCompressionMethod.LegacyJpeg;
}
meta.CompressionMethod = compressionMethod;
return new ImageInfo(new PixelTypeInfo(item.BitsPerPixel), new(item.Extent.Width, item.Extent.Height), this.metadata);
}
@ -436,6 +443,7 @@ internal sealed class HeicDecoderCore : IImageDecoderInternals
case Heic4CharCode.irot:
case Heic4CharCode.iscl:
case Heic4CharCode.hvcC:
case Heic4CharCode.av1C:
case Heic4CharCode.rloc:
case Heic4CharCode.udes:
// TODO: Implement

2
src/ImageSharp/Formats/Heic/HeicImageFormatDetector.cs

@ -25,6 +25,6 @@ public sealed class HeicImageFormatDetector : IImageFormatDetector
{
bool hasFtyp = BinaryPrimitives.ReadUInt32BigEndian(header.Slice(4)) == (uint)Heic4CharCode.ftyp;
uint brand = BinaryPrimitives.ReadUInt32BigEndian(header.Slice(8));
return hasFtyp && (brand == (uint)Heic4CharCode.heic || brand == (uint)Heic4CharCode.heix);
return hasFtyp && (brand == (uint)Heic4CharCode.heic || brand == (uint)Heic4CharCode.heix || brand == (uint)Heic4CharCode.avif);
}
}

1
tests/ImageSharp.Tests/Formats/Heic/HeicDecoderTests.cs

@ -14,6 +14,7 @@ public class HeicDecoderTests
[InlineData(TestImages.Heic.Image1, HeicCompressionMethod.Hevc)]
[InlineData(TestImages.Heic.Sample640x427, HeicCompressionMethod.Hevc)]
[InlineData(TestImages.Heic.FujiFilmHif, HeicCompressionMethod.LegacyJpeg)]
[InlineData(TestImages.Heic.IrvineAvif, HeicCompressionMethod.Av1)]
public void Identify(string imagePath, HeicCompressionMethod compressionMethod)
{
TestFile testFile = TestFile.Create(imagePath);

Loading…
Cancel
Save