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);