diff --git a/src/ImageSharp/Formats/Heic/Heic4CharCode.cs b/src/ImageSharp/Formats/Heic/Heic4CharCode.cs
index 5e184a26e0..a64c94b686 100644
--- a/src/ImageSharp/Formats/Heic/Heic4CharCode.cs
+++ b/src/ImageSharp/Formats/Heic/Heic4CharCode.cs
@@ -78,6 +78,11 @@ public enum Heic4CharCode : uint
///
hvcC = 0x68766343U,
+ ///
+ /// AV1 configuration.
+ ///
+ av1C = 0x61763143U,
+
///
/// Image Mirror.
///
@@ -143,6 +148,11 @@ public enum Heic4CharCode : uint
///
mif1 = 0x6D696631U,
+ ///
+ /// AVIF brand.
+ ///
+ avif = 0x61766966U,
+
///
/// High Efficiency Coding tile.
///
@@ -153,6 +163,11 @@ public enum Heic4CharCode : uint
///
jpeg = 0x6A706567U,
+ ///
+ /// AOMedia Video Coding tile.
+ ///
+ av01 = 0x61763031U,
+
///
/// Data Information.
///
diff --git a/src/ImageSharp/Formats/Heic/Heic4CharCode.tt b/src/ImageSharp/Formats/Heic/Heic4CharCode.tt
index 7faca67008..61ceb332ac 100644
--- a/src/ImageSharp/Formats/Heic/Heic4CharCode.tt
+++ b/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",
diff --git a/src/ImageSharp/Formats/Heic/HeicDecoderCore.cs b/src/ImageSharp/Formats/Heic/HeicDecoderCore.cs
index 2a111ad0b3..ca6d2eb7a4 100644
--- a/src/ImageSharp/Formats/Heic/HeicDecoderCore.cs
+++ b/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
diff --git a/src/ImageSharp/Formats/Heic/HeicImageFormatDetector.cs b/src/ImageSharp/Formats/Heic/HeicImageFormatDetector.cs
index a48f272b5f..93aefca223 100644
--- a/src/ImageSharp/Formats/Heic/HeicImageFormatDetector.cs
+++ b/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);
}
}
diff --git a/tests/ImageSharp.Tests/Formats/Heic/HeicDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Heic/HeicDecoderTests.cs
index b85c928f87..e08d5b2208 100644
--- a/tests/ImageSharp.Tests/Formats/Heic/HeicDecoderTests.cs
+++ b/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);