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

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

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

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

@ -131,10 +131,17 @@ internal sealed class HeicDecoderCore : IImageDecoderInternals
} }
HeicMetadata meta = this.metadata.GetHeicMetadata(); 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); 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.irot:
case Heic4CharCode.iscl: case Heic4CharCode.iscl:
case Heic4CharCode.hvcC: case Heic4CharCode.hvcC:
case Heic4CharCode.av1C:
case Heic4CharCode.rloc: case Heic4CharCode.rloc:
case Heic4CharCode.udes: case Heic4CharCode.udes:
// TODO: Implement // 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; bool hasFtyp = BinaryPrimitives.ReadUInt32BigEndian(header.Slice(4)) == (uint)Heic4CharCode.ftyp;
uint brand = BinaryPrimitives.ReadUInt32BigEndian(header.Slice(8)); 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.Image1, HeicCompressionMethod.Hevc)]
[InlineData(TestImages.Heic.Sample640x427, HeicCompressionMethod.Hevc)] [InlineData(TestImages.Heic.Sample640x427, HeicCompressionMethod.Hevc)]
[InlineData(TestImages.Heic.FujiFilmHif, HeicCompressionMethod.LegacyJpeg)] [InlineData(TestImages.Heic.FujiFilmHif, HeicCompressionMethod.LegacyJpeg)]
[InlineData(TestImages.Heic.IrvineAvif, HeicCompressionMethod.Av1)]
public void Identify(string imagePath, HeicCompressionMethod compressionMethod) public void Identify(string imagePath, HeicCompressionMethod compressionMethod)
{ {
TestFile testFile = TestFile.Create(imagePath); TestFile testFile = TestFile.Create(imagePath);

Loading…
Cancel
Save