diff --git a/src/bmffimage.cpp b/src/bmffimage.cpp index 13f3643c..9a0f7e65 100644 --- a/src/bmffimage.cpp +++ b/src/bmffimage.cpp @@ -61,6 +61,7 @@ struct BmffBoxHeader #define TAG_heix 0x68656978 /**< "heix" HEIC */ #define TAG_mif1 0x6d696631 /**< "mif1" HEIF */ #define TAG_crx 0x63727820 /**< "crx " Canon CR3 */ +#define TAG_jxl 0x4a584c20 /**< "JXL " JPEG XL */ #define TAG_moov 0x6d6f6f76 /**< "moov" Movie */ #define TAG_meta 0x6d657461 /**< "meta" Metadata */ #define TAG_mdat 0x6d646174 /**< "mdat" Media data */ @@ -78,6 +79,8 @@ struct BmffBoxHeader #define TAG_cmt3 0x434D5433 /**< "CMT3" canonID */ #define TAG_cmt4 0x434D5434 /**< "CMT4" gpsID */ #define TAG_colr 0x636f6c72 /**< "colr" */ +#define TAG_exif 0x45786966 /**< "Exif" Used by JXL*/ +#define TAG_xml 0x786d6c20 /**< "xml" Used by JXL*/ // ***************************************************************************** // class member definitions @@ -149,6 +152,8 @@ namespace Exiv2 return "image/heif"; case TAG_crx: return "image/x-canon-cr3"; + case TAG_jxl: + return "image/jxl"; // https://github.com/novomesk/qt-jpegxl-image-plugin/issues/1 default: return "image/generic"; } @@ -435,6 +440,12 @@ namespace Exiv2 case TAG_cmt4: parseTiff(Internal::Tag::cmt4, box.length); break; + case TAG_exif: + parseTiff(Internal::Tag::root, box.length,address+8); + break; + case TAG_xml: + parseXmp(box.length,io_->tell()); + break; default: break ; /* do nothing */ } @@ -610,7 +621,8 @@ namespace Exiv2 return false; } - bool matched = buf[4] == 'f' && buf[5] == 't' && buf[6] == 'y' && buf[7] == 'p'; + bool matched = (buf[4] == 'f' && buf[5] == 't' && buf[6] == 'y' && buf[7] == 'p') + ||(buf[4] == 'J' && buf[5] == 'X' && buf[6] == 'L' && buf[7] == ' '); if (!advance || !matched) { iIo.seek(static_cast(0), BasicIo::beg); } diff --git a/test/data/Reagan.jxl b/test/data/Reagan.jxl new file mode 100644 index 00000000..0d7706ac Binary files /dev/null and b/test/data/Reagan.jxl differ diff --git a/tests/bugfixes/github/test_issue_1503.py b/tests/bugfixes/github/test_issue_1503.py new file mode 100644 index 00000000..51c07691 --- /dev/null +++ b/tests/bugfixes/github/test_issue_1503.py @@ -0,0 +1,60 @@ +# -*- coding: utf-8 -*- + +import system_tests +import unittest + +# test needs system_tests.BT.vv['enable_bmff']=1 +bSkip=system_tests.BT.verbose_version().get('enable_bmff')!='1' +if bSkip: + raise unittest.SkipTest('*** requires enable_bmff=1 ***') + +class issue_1503_jxl_bmff(metaclass=system_tests.CaseMeta): + url = "https://github.com/Exiv2/exiv2/issue/1503" + filename = "$data_path/Reagan.jxl" + commands = ["$exiv2 -pS $filename" + ,"$exiv2 -g Date/i $filename" + ,"$exiv2 $filename" + ] + retval = [ 0 ] * len(commands) + stderr = [ "" ] * len(commands) + stdin = [ "" ] * len(commands) + stdout = ["""Exiv2::BmffImage::boxHandler: JXL 0->12 +Exiv2::BmffImage::boxHandler: ftyp 12->20 brand: jxl +Exiv2::BmffImage::boxHandler: Exif 32->5722 +Exiv2::BmffImage::boxHandler: xml 5754->5306 +Exiv2::BmffImage::boxHandler: jbrd 11060->1707 +Exiv2::BmffImage::boxHandler: jxlc 12767->20125 +""","""Exif.Image.DateTime Ascii 20 2016:09:13 11:58:16 +Exif.Photo.DateTimeOriginal Ascii 20 2004:06:21 23:37:53 +Exif.Photo.DateTimeDigitized Ascii 20 2004:06:21 23:37:53 +Xmp.xmp.ModifyDate XmpText 25 2016-09-13T11:58:16+01:00 +Xmp.xmp.CreateDate XmpText 25 2004-06-21T23:37:53+01:00 +Xmp.xmp.MetadataDate XmpText 25 2016-09-13T11:58:16+01:00 +Xmp.photoshop.DateCreated XmpText 10 2004-06-21 +""","""File name : $filename +File size : 32892 Bytes +MIME type : image/generic +Image size : 200 x 130 +Thumbnail : image/jpeg, 4196 Bytes +Camera make : NIKON CORPORATION +Camera model : NIKON D1X +Image timestamp : 2004:06:21 23:37:53 +File number : +Exposure time : 1/125 s +Aperture : F5 +Exposure bias : +1/3 EV +Flash : No flash +Flash bias : +Focal length : 42.0 mm +Subject distance: +ISO speed : +Exposure mode : Manual +Metering mode : Center weighted average +Macro mode : +Image quality : +White balance : Manual +Copyright : +Exif comment : + +""" +]