Skip to content

Commit e505b4a

Browse files
authored
TIKA-4870: Parse AVIF, do not only detect it (#3116)
1 parent 1b6b761 commit e505b4a

4 files changed

Lines changed: 31 additions & 3 deletions

File tree

CHANGES.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
Release 4.1.0 - unreleased
22

3+
* AVIF images are parsed rather than only detected: HeifParser accepts
4+
image/avif, which is the same ISO-BMFF container, so dimensions, EXIF
5+
and XMP come out of it the way they do for HEIC (TIKA-4870).
6+
37
* The video of a Google/Android motion photo, appended after the image and
48
described by the Motion Photo or MicroVideo XMP, is emitted as an
59
ATTACHMENT embedded document named after what the file declares it to

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/main/java/org/apache/tika/parser/image/HeifParser.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.io.InputStream;
2222
import java.nio.file.Files;
2323
import java.util.Arrays;
24+
import java.util.Collections;
2425
import java.util.HashSet;
2526
import java.util.Set;
2627

@@ -39,9 +40,10 @@
3940
@TikaComponent
4041
public class HeifParser extends AbstractImageParser {
4142

42-
private static final Set<MediaType> SUPPORTED_TYPES = new HashSet<>(
43-
Arrays.asList(MediaType.image("heif"), MediaType.image("heif-sequence"),
44-
MediaType.image("heic"), MediaType.image("heic-sequence")));
43+
private static final Set<MediaType> SUPPORTED_TYPES = Collections.unmodifiableSet(
44+
new HashSet<>(Arrays.asList(MediaType.image("heif"), MediaType.image("heif-sequence"),
45+
MediaType.image("heic"), MediaType.image("heic-sequence"),
46+
MediaType.image("avif"))));
4547

4648
@Override
4749
public Set<MediaType> getSupportedTypes(ParseContext context) {

tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-image-module/src/test/java/org/apache/tika/parser/image/HeifParserTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.tika.metadata.Geographic;
2727
import org.apache.tika.metadata.HttpHeaders;
2828
import org.apache.tika.metadata.Metadata;
29+
import org.apache.tika.metadata.TikaCoreProperties;
2930
import org.apache.tika.parser.AutoDetectParser;
3031
import org.apache.tika.parser.ParseContext;
3132
import org.apache.tika.parser.Parser;
@@ -84,4 +85,25 @@ public void testAppleLivePhotoMakerNote() throws Exception {
8485
}
8586
}
8687

88+
/*
89+
testAVIF_XMP.avif is a 32x32 gradient encoded with libavif through
90+
ImageMagick, with an XMP packet attached: AVIF is the same ISO-BMFF
91+
container, so the same parser reads it (TIKA-4870).
92+
*/
93+
@Test
94+
public void testAvif() throws Exception {
95+
Metadata metadata = new Metadata();
96+
try (TikaInputStream tis = getResourceAsStream("/test-documents/testAVIF_XMP.avif")) {
97+
parser.parse(tis, new DefaultHandler(), metadata, new ParseContext());
98+
99+
assertEquals("image/avif", metadata.get(HttpHeaders.CONTENT_TYPE));
100+
assertEquals("avif", metadata.get(ImageMetadataExtractor.UNKNOWN_IMG_NS + "Major Brand"));
101+
assertEquals("32 pixels", metadata.get(ImageMetadataExtractor.UNKNOWN_IMG_NS + "Width"));
102+
assertEquals("32 pixels", metadata.get(ImageMetadataExtractor.UNKNOWN_IMG_NS + "Height"));
103+
//the XMP item is found through meta/iinf/iloc, as it is for HEIC
104+
assertEquals("AVIF XMP Title", metadata.get(TikaCoreProperties.TITLE));
105+
assertEquals("Jane Photographer", metadata.get(TikaCoreProperties.CREATOR));
106+
}
107+
}
108+
87109
}

0 commit comments

Comments
 (0)