exiftool_vendored 12.22.0 → 12.25.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +50 -0
  3. data/bin/MANIFEST +11 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +44 -43
  7. data/bin/config_files/acdsee.config +193 -6
  8. data/bin/config_files/cuepointlist.config +70 -0
  9. data/bin/exiftool +45 -44
  10. data/bin/lib/Image/ExifTool.pm +85 -26
  11. data/bin/lib/Image/ExifTool.pod +61 -50
  12. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +1 -1
  13. data/bin/lib/Image/ExifTool/Canon.pm +3 -2
  14. data/bin/lib/Image/ExifTool/DjVu.pm +6 -5
  15. data/bin/lib/Image/ExifTool/Exif.pm +16 -7
  16. data/bin/lib/Image/ExifTool/FujiFilm.pm +18 -8
  17. data/bin/lib/Image/ExifTool/JPEG.pm +6 -2
  18. data/bin/lib/Image/ExifTool/JSON.pm +24 -3
  19. data/bin/lib/Image/ExifTool/Jpeg2000.pm +361 -16
  20. data/bin/lib/Image/ExifTool/MRC.pm +341 -0
  21. data/bin/lib/Image/ExifTool/MWG.pm +3 -3
  22. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  23. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  24. data/bin/lib/Image/ExifTool/Microsoft.pm +5 -3
  25. data/bin/lib/Image/ExifTool/Nikon.pm +3 -2
  26. data/bin/lib/Image/ExifTool/NikonSettings.pm +10 -1
  27. data/bin/lib/Image/ExifTool/PNG.pm +2 -2
  28. data/bin/lib/Image/ExifTool/Panasonic.pm +14 -1
  29. data/bin/lib/Image/ExifTool/PhaseOne.pm +4 -3
  30. data/bin/lib/Image/ExifTool/QuickTime.pm +102 -44
  31. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +88 -29
  32. data/bin/lib/Image/ExifTool/RIFF.pm +83 -11
  33. data/bin/lib/Image/ExifTool/Samsung.pm +2 -1
  34. data/bin/lib/Image/ExifTool/Sony.pm +98 -24
  35. data/bin/lib/Image/ExifTool/TagLookup.pm +56 -15
  36. data/bin/lib/Image/ExifTool/TagNames.pod +388 -173
  37. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -0
  38. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +37 -12
  39. data/bin/lib/Image/ExifTool/WriteXMP.pl +6 -2
  40. data/bin/lib/Image/ExifTool/Writer.pl +1 -0
  41. data/bin/lib/Image/ExifTool/XMP.pm +20 -7
  42. data/bin/perl-Image-ExifTool.spec +42 -42
  43. data/lib/exiftool_vendored/version.rb +1 -1
  44. metadata +6 -8
@@ -0,0 +1,70 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: cuepointlist.config
3
+ #
4
+ # Description: ExifTool config file to generate list of cue points and labels
5
+ # in WAV audio files
6
+ #
7
+ # Usage: exiftool -config cuepointlist.config -cuepointlist -b FILE
8
+ #
9
+ # Requires: ExifTool version 12.25 or later
10
+ #
11
+ # Revisions: 2021-04-20 - P. Harvey Created
12
+ #------------------------------------------------------------------------------
13
+
14
+ %Image::ExifTool::UserDefined = (
15
+ 'Image::ExifTool::Composite' => {
16
+ CuePointList => {
17
+ Require => {
18
+ 0 => 'CuePoints',
19
+ 1 => 'SampleRate',
20
+ },
21
+ Desire => {
22
+ 2 => 'CuePointLabel',
23
+ 3 => 'CuePointNotes',
24
+ 4 => 'LabeledText',
25
+ },
26
+ ValueConv => q{
27
+ SetByteOrder('II');
28
+ my (%lbl, %rgn, %rtyp, %rlbl, %note, $pos, $i);
29
+ # get labels if available
30
+ for ($i=1; defined $val[2]; ++$i) {
31
+ $lbl{$1} = $2 if $val[2] =~ /^(\d+) (.*)/ and length $2;
32
+ $val[2] = $self->GetValue("CuePointLabel ($i)");
33
+ }
34
+ # get notes if available
35
+ for ($i=1; defined $val[3]; ++$i) {
36
+ $note{$1} = $2 if $val[3] =~ /^(\d+) (.*)/ and length $2;
37
+ $val[3] = $self->GetValue("CuePointNotes ($i)");
38
+ }
39
+ # get regions if available
40
+ for ($i=1; defined $val[4]; ++$i) {
41
+ if ($val[4] =~ /^(\d+) (\d+) '(.*)' \d+ \d+ \d+ \d+ (.*)/) {
42
+ $rgn{$1} = $2;
43
+ $rtyp{$1} = $3;
44
+ $rlbl{$1} = $4;
45
+ }
46
+ $val[4] = $self->GetValue("LabeledText ($i)");
47
+ }
48
+ my $buff = "Cue\tStart\tEnd\tLabel\tPurpose\tText\tNotes\n";
49
+ for ($pos=4; $pos+24<=length(${$val[0]}); $pos+=24) {
50
+ my $n = Get32u($val[0], $pos);
51
+ my $start = Get32u($val[0], $pos + 4);
52
+ my (@lbl, $lbl);
53
+ push @lbl, $lbl{$n} if defined $lbl{$n};
54
+ push @lbl, $rlbl{$n} if defined $rlbl{$n};
55
+ push @lbl, '-', $note{$n} if defined $note{$n};
56
+ my $lbl = join ' ', @lbl;
57
+ $buff .= sprintf("%d\t%.3f\t%.3f\t%s\t%s\t%s\t%s\n",
58
+ $n, $start/$val[1], ($start+($rgn{$n}||0))/$val[1],
59
+ defined($lbl{$n}) ? $lbl{$n} : '',
60
+ defined($rtyp{$n}) ? $rtyp{$n} : '',
61
+ defined($rlbl{$n}) ? $rlbl{$n} : '',
62
+ defined($note{$n}) ? $note{$n} : '');
63
+ }
64
+ return $buff;
65
+ },
66
+ },
67
+ },
68
+ );
69
+
70
+ 1; # end
data/bin/exiftool CHANGED
@@ -10,7 +10,7 @@
10
10
  use strict;
11
11
  require 5.004;
12
12
 
13
- my $version = '12.22';
13
+ my $version = '12.25';
14
14
 
15
15
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
16
16
  my $exeDir;
@@ -286,6 +286,7 @@ my @recommends = qw(
286
286
  Digest::SHA
287
287
  IO::Compress::Bzip2
288
288
  POSIX::strptime
289
+ Time::Local
289
290
  Unicode::LineBreak
290
291
  IO::Compress::RawDeflate
291
292
  IO::Uncompress::RawInflate
@@ -2279,7 +2280,7 @@ TAG: foreach $tag (@foundTags) {
2279
2280
  }
2280
2281
  $val = ConvertBinary($val); # convert SCALAR references
2281
2282
  next unless defined $val;
2282
- if ($structOpt) {
2283
+ if ($structOpt and ref $val) {
2283
2284
  # serialize structure if necessary
2284
2285
  $val = Image::ExifTool::XMP::SerializeStruct($val) unless $xml or $json;
2285
2286
  } elsif (ref $val eq 'ARRAY') {
@@ -4468,47 +4469,47 @@ supported by ExifTool (r = read, w = write, c = create):
4468
4469
 
4469
4470
  File Types
4470
4471
  ------------+-------------+-------------+-------------+------------
4471
- 360 r/w | DPX r | ITC r | ODP r | RIFF r
4472
- 3FR r | DR4 r/w/c | J2C r | ODS r | RSRC r
4473
- 3G2 r/w | DSS r | JNG r/w | ODT r | RTF r
4474
- 3GP r/w | DV r | JP2 r/w | OFR r | RW2 r/w
4475
- A r | DVB r/w | JPEG r/w | OGG r | RWL r/w
4476
- AA r | DVR-MS r | JSON r | OGV r | RWZ r
4477
- AAE r | DYLIB r | K25 r | ONP r | RM r
4478
- AAX r/w | EIP r | KDC r | OPUS r | SEQ r
4479
- ACR r | EPS r/w | KEY r | ORF r/w | SKETCH r
4480
- AFM r | EPUB r | LA r | OTF r | SO r
4481
- AI r/w | ERF r/w | LFP r | PAC r | SR2 r/w
4482
- AIFF r | EXE r | LNK r | PAGES r | SRF r
4483
- APE r | EXIF r/w/c | LRV r/w | PBM r/w | SRW r/w
4484
- ARQ r/w | EXR r | M2TS r | PCD r | SVG r
4485
- ARW r/w | EXV r/w/c | M4A/V r/w | PCX r | SWF r
4486
- ASF r | F4A/V r/w | MACOS r | PDB r | THM r/w
4487
- AVI r | FFF r/w | MAX r | PDF r/w | TIFF r/w
4488
- AVIF r/w | FITS r | MEF r/w | PEF r/w | TORRENT r
4489
- AZW r | FLA r | MIE r/w/c | PFA r | TTC r
4490
- BMP r | FLAC r | MIFF r | PFB r | TTF r
4491
- BPG r | FLIF r/w | MKA r | PFM r | TXT r
4492
- BTF r | FLV r | MKS r | PGF r | VCF r
4493
- CHM r | FPF r | MKV r | PGM r/w | VRD r/w/c
4494
- COS r | FPX r | MNG r/w | PLIST r | VSD r
4495
- CR2 r/w | GIF r/w | MOBI r | PICT r | WAV r
4496
- CR3 r/w | GPR r/w | MODD r | PMP r | WDP r/w
4497
- CRM r/w | GZ r | MOI r | PNG r/w | WEBP r
4498
- CRW r/w | HDP r/w | MOS r/w | PPM r/w | WEBM r
4499
- CS1 r/w | HDR r | MOV r/w | PPT r | WMA r
4500
- CSV r | HEIC r/w | MP3 r | PPTX r | WMV r
4501
- CZI r | HEIF r/w | MP4 r/w | PS r/w | WTV r
4502
- DCM r | HTML r | MPC r | PSB r/w | WV r
4503
- DCP r/w | ICC r/w/c | MPG r | PSD r/w | X3F r/w
4504
- DCR r | ICS r | MPO r/w | PSP r | XCF r
4505
- DFONT r | IDML r | MQV r/w | QTIF r/w | XLS r
4506
- DIVX r | IIQ r/w | MRW r/w | R3D r | XLSX r
4507
- DJVU r | IND r/w | MXF r | RA r | XMP r/w/c
4508
- DLL r | INSP r/w | NEF r/w | RAF r/w | ZIP r
4509
- DNG r/w | INSV r | NRW r/w | RAM r |
4510
- DOC r | INX r | NUMBERS r | RAR r |
4511
- DOCX r | ISO r | O r | RAW r/w |
4472
+ 360 r/w | DPX r | ITC r | NUMBERS r | RAM r
4473
+ 3FR r | DR4 r/w/c | J2C r | O r | RAR r
4474
+ 3G2 r/w | DSS r | JNG r/w | ODP r | RAW r/w
4475
+ 3GP r/w | DV r | JP2 r/w | ODS r | RIFF r
4476
+ A r | DVB r/w | JPEG r/w | ODT r | RSRC r
4477
+ AA r | DVR-MS r | JSON r | OFR r | RTF r
4478
+ AAE r | DYLIB r | JXL r | OGG r | RW2 r/w
4479
+ AAX r/w | EIP r | K25 r | OGV r | RWL r/w
4480
+ ACR r | EPS r/w | KDC r | ONP r | RWZ r
4481
+ AFM r | EPUB r | KEY r | OPUS r | RM r
4482
+ AI r/w | ERF r/w | LA r | ORF r/w | SEQ r
4483
+ AIFF r | EXE r | LFP r | ORI r/w | SKETCH r
4484
+ APE r | EXIF r/w/c | LNK r | OTF r | SO r
4485
+ ARQ r/w | EXR r | LRV r/w | PAC r | SR2 r/w
4486
+ ARW r/w | EXV r/w/c | M2TS r | PAGES r | SRF r
4487
+ ASF r | F4A/V r/w | M4A/V r/w | PBM r/w | SRW r/w
4488
+ AVI r | FFF r/w | MACOS r | PCD r | SVG r
4489
+ AVIF r/w | FITS r | MAX r | PCX r | SWF r
4490
+ AZW r | FLA r | MEF r/w | PDB r | THM r/w
4491
+ BMP r | FLAC r | MIE r/w/c | PDF r/w | TIFF r/w
4492
+ BPG r | FLIF r/w | MIFF r | PEF r/w | TORRENT r
4493
+ BTF r | FLV r | MKA r | PFA r | TTC r
4494
+ CHM r | FPF r | MKS r | PFB r | TTF r
4495
+ COS r | FPX r | MKV r | PFM r | TXT r
4496
+ CR2 r/w | GIF r/w | MNG r/w | PGF r | VCF r
4497
+ CR3 r/w | GPR r/w | MOBI r | PGM r/w | VRD r/w/c
4498
+ CRM r/w | GZ r | MODD r | PLIST r | VSD r
4499
+ CRW r/w | HDP r/w | MOI r | PICT r | WAV r
4500
+ CS1 r/w | HDR r | MOS r/w | PMP r | WDP r/w
4501
+ CSV r | HEIC r/w | MOV r/w | PNG r/w | WEBP r
4502
+ CZI r | HEIF r/w | MP3 r | PPM r/w | WEBM r
4503
+ DCM r | HTML r | MP4 r/w | PPT r | WMA r
4504
+ DCP r/w | ICC r/w/c | MPC r | PPTX r | WMV r
4505
+ DCR r | ICS r | MPG r | PS r/w | WTV r
4506
+ DFONT r | IDML r | MPO r/w | PSB r/w | WV r
4507
+ DIVX r | IIQ r/w | MQV r/w | PSD r/w | X3F r/w
4508
+ DJVU r | IND r/w | MRC r | PSP r | XCF r
4509
+ DLL r | INSP r/w | MRW r/w | QTIF r/w | XLS r
4510
+ DNG r/w | INSV r | MXF r | R3D r | XLSX r
4511
+ DOC r | INX r | NEF r/w | RA r | XMP r/w/c
4512
+ DOCX r | ISO r | NRW r/w | RAF r/w | ZIP r
4512
4513
 
4513
4514
  Meta Information
4514
4515
  ----------------------+----------------------+---------------------
@@ -5392,7 +5393,7 @@ with this command:
5392
5393
 
5393
5394
  produces output like this:
5394
5395
 
5395
- -- Generated by ExifTool 12.22 --
5396
+ -- Generated by ExifTool 12.25 --
5396
5397
  File: a.jpg - 2003:10:31 15:44:19
5397
5398
  (f/5.6, 1/60s, ISO 100)
5398
5399
  File: b.jpg - 2006:05:23 11:57:38
@@ -28,7 +28,7 @@ use vars qw($VERSION $RELEASE @ISA @EXPORT_OK %EXPORT_TAGS $AUTOLOAD @fileTypes
28
28
  %mimeType $swapBytes $swapWords $currentByteOrder %unpackStd
29
29
  %jpegMarker %specialTags %fileTypeLookup $testLen $exePath);
30
30
 
31
- $VERSION = '12.22';
31
+ $VERSION = '12.25';
32
32
  $RELEASE = '';
33
33
  @ISA = qw(Exporter);
34
34
  %EXPORT_TAGS = (
@@ -138,18 +138,18 @@ sub ReadValue($$$;$$$);
138
138
  @loadAllTables = qw(
139
139
  PhotoMechanic Exif GeoTiff CanonRaw KyoceraRaw Lytro MinoltaRaw PanasonicRaw
140
140
  SigmaRaw JPEG GIMP Jpeg2000 GIF BMP BMP::OS2 BMP::Extra BPG BPG::Extensions
141
- PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MIFF PCX PGF PSP PhotoCD Radiance
142
- PDF PostScript Photoshop::Header Photoshop::Layers Photoshop::ImageData
143
- FujiFilm::RAF FujiFilm::IFD Samsung::Trailer Sony::SRF2 Sony::SR2SubIFD
144
- Sony::PMP ITC ID3 ID3::Lyrics3 FLAC Ogg Vorbis APE APE::NewHeader
145
- APE::OldHeader Audible MPC MPEG::Audio MPEG::Video MPEG::Xing M2TS QuickTime
146
- QuickTime::ImageFile QuickTime::Stream QuickTime::Tags360Fly Matroska MOI
147
- MXF DV Flash Flash::FLV Real::Media Real::Audio Real::Metafile Red RIFF AIFF
148
- ASF WTV DICOM FITS MIE JSON HTML XMP::SVG Palm Palm::MOBI Palm::EXTH Torrent
149
- EXE EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF EXE::ELF EXE::AR
150
- EXE::CHM LNK Font VCard Text VCard::VCalendar RSRC Rawzor ZIP ZIP::GZIP
151
- ZIP::RAR RTF OOXML iWork ISO FLIR::AFF FLIR::FPF MacOS MacOS::MDItem
152
- FlashPix::DocTable
141
+ PICT PNG MNG FLIF DjVu DPX OpenEXR ZISRAW MRC MRC::FEI12 MIFF PCX PGF PSP
142
+ PhotoCD Radiance PDF PostScript Photoshop::Header Photoshop::Layers
143
+ Photoshop::ImageData FujiFilm::RAF FujiFilm::IFD Samsung::Trailer Sony::SRF2
144
+ Sony::SR2SubIFD Sony::PMP ITC ID3 ID3::Lyrics3 FLAC Ogg Vorbis APE
145
+ APE::NewHeader APE::OldHeader Audible MPC MPEG::Audio MPEG::Video MPEG::Xing
146
+ M2TS QuickTime QuickTime::ImageFile QuickTime::Stream QuickTime::Tags360Fly
147
+ Matroska MOI MXF DV Flash Flash::FLV Real::Media Real::Audio Real::Metafile
148
+ Red RIFF AIFF ASF WTV DICOM FITS MIE JSON HTML XMP::SVG Palm Palm::MOBI
149
+ Palm::EXTH Torrent EXE EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF
150
+ EXE::ELF EXE::AR EXE::CHM LNK Font VCard Text VCard::VCalendar RSRC Rawzor
151
+ ZIP ZIP::GZIP ZIP::RAR RTF OOXML iWork ISO FLIR::AFF FLIR::FPF MacOS
152
+ MacOS::MDItem FlashPix::DocTable
153
153
  );
154
154
 
155
155
  # alphabetical list of current Lang modules
@@ -189,12 +189,12 @@ $defaultLang = 'en'; # default language
189
189
  FLAC APE MPC MKV MXF DV PMP IND PGF ICC ITC FLIR FLIF FPF LFP
190
190
  HTML VRD RTF FITS XCF DSS QTIF FPX PICT ZIP GZIP PLIST RAR BZ2
191
191
  CZI TAR EXE EXR HDR CHM LNK WMF AVC DEX DPX RAW Font RSRC M2TS
192
- MacOS PHP PCX DCX DWF DWG WTV Torrent VCard LRI R3D AA PDB MOI
193
- ISO ALIAS JSON MP3 DICOM PCD TXT);
192
+ MacOS PHP PCX DCX DWF DWG DXF WTV Torrent VCard LRI R3D AA PDB
193
+ MRC JXL MOI ISO ALIAS JSON MP3 DICOM PCD TXT);
194
194
 
195
195
  # file types that we can write (edit)
196
196
  my @writeTypes = qw(JPEG TIFF GIF CRW MRW ORF RAF RAW PNG MIE PSD XMP PPM EPS
197
- X3F PS PDF ICC VRD DR4 JP2 EXIF AI AIT IND MOV EXV FLIF);
197
+ X3F PS PDF ICC VRD DR4 JP2 JXL EXIF AI AIT IND MOV EXV FLIF);
198
198
  my %writeTypes; # lookup for writable file types (hash filled if required)
199
199
 
200
200
  # file extensions that we can't write for various base types
@@ -292,6 +292,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
292
292
  DWF => ['DWF', 'Autodesk drawing (Design Web Format)'],
293
293
  DWG => ['DWG', 'AutoCAD Drawing'],
294
294
  DYLIB=> ['EXE', 'Mach-O Dynamic Link Library'],
295
+ DXF => ['DXF', 'AutoCAD Drawing Exchange Format'],
295
296
  EIP => ['ZIP', 'Capture One Enhanced Image Package'],
296
297
  EPS => ['EPS', 'Encapsulated PostScript Format'],
297
298
  EPS2 => 'EPS',
@@ -355,6 +356,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
355
356
  JPM => ['JP2', 'JPEG 2000 compound image'],
356
357
  JPX => ['JP2', 'JPEG 2000 with extensions'],
357
358
  JSON => ['JSON', 'JavaScript Object Notation'],
359
+ JXL => ['JXL', 'JPEG XL'],
358
360
  JXR => ['TIFF', 'JPEG XR'],
359
361
  K25 => ['TIFF', 'Kodak DC25 RAW'],
360
362
  KDC => ['TIFF', 'Kodak Digital Camera RAW'],
@@ -394,6 +396,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
394
396
  MPG => 'MPEG',
395
397
  MPO => ['JPEG', 'Extended Multi-Picture format'],
396
398
  MQV => ['MOV', 'Sony Mobile Quicktime Video'],
399
+ MRC => ['MRC', 'Medical Research Council image'],
397
400
  MRW => ['MRW', 'Minolta RAW format'],
398
401
  MTS => 'M2TS',
399
402
  MXF => ['MXF', 'Material Exchange Format'],
@@ -418,6 +421,7 @@ my %createTypes = map { $_ => 1 } qw(XMP ICC MIE VRD DR4 EXIF EXV);
418
421
  ONP => ['JSON', 'ON1 Presets'],
419
422
  OPUS => ['OGG', 'Ogg Opus audio file'],
420
423
  ORF => ['ORF', 'Olympus RAW format'],
424
+ ORI => 'ORF',
421
425
  OTF => ['Font', 'Open Type Font'],
422
426
  PAC => ['RIFF', 'Lossless Predictive Audio Compression'],
423
427
  PAGES => ['ZIP', 'Apple Pages document'],
@@ -614,6 +618,7 @@ my %fileDescription = (
614
618
  'DVR-MS' => 'video/x-ms-dvr',
615
619
  DWF => 'model/vnd.dwf',
616
620
  DWG => 'image/vnd.dwg',
621
+ DXF => 'application/dxf',
617
622
  EIP => 'application/x-captureone', #(NC)
618
623
  EPS => 'application/postscript',
619
624
  ERF => 'image/x-epson-erf',
@@ -651,6 +656,7 @@ my %fileDescription = (
651
656
  JPM => 'image/jpm',
652
657
  JPX => 'image/jpx',
653
658
  JSON => 'application/json',
659
+ JXL => 'image/jxl', #PH (NC)
654
660
  JXR => 'image/jxr',
655
661
  K25 => 'image/x-kodak-k25',
656
662
  KDC => 'image/x-kodak-kdc',
@@ -676,6 +682,7 @@ my %fileDescription = (
676
682
  MP4 => 'video/mp4',
677
683
  MPC => 'audio/x-musepack',
678
684
  MPEG => 'video/mpeg',
685
+ MRC => 'image/x-mrc',
679
686
  MRW => 'image/x-minolta-mrw',
680
687
  MXF => 'application/mxf',
681
688
  NEF => 'image/x-nikon-nef',
@@ -800,6 +807,7 @@ my %moduleName = (
800
807
  DSS => 'Olympus',
801
808
  DWF => 0,
802
809
  DWG => 0,
810
+ DXF => 0,
803
811
  EPS => 'PostScript',
804
812
  EXIF => '',
805
813
  EXR => 'OpenEXR',
@@ -813,6 +821,7 @@ my %moduleName = (
813
821
  HDR => 'Radiance',
814
822
  JP2 => 'Jpeg2000',
815
823
  JPEG => '',
824
+ JXL => 'Jpeg2000',
816
825
  LFP => 'Lytro',
817
826
  LRI => 0,
818
827
  MOV => 'QuickTime',
@@ -874,6 +883,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
874
883
  DV => '\x1f\x07\0[\x3f\xbf]', # (not tested if extension recognized)
875
884
  DWF => '\(DWF V\d',
876
885
  DWG => 'AC10\d{2}\0',
886
+ DXF => '\s*0\s+\0?\s*SECTION\s+2\s+HEADER',
877
887
  EPS => '(%!PS|%!Ad|\xc5\xd0\xd3\xc6)',
878
888
  EXE => '(MZ|\xca\xfe\xba\xbe|\xfe\xed\xfa[\xce\xcf]|[\xce\xcf]\xfa\xed\xfe|Joy!peff|\x7fELF|#!\s*/\S*bin/|!<arch>\x0a)',
879
889
  EXIF => '(II\x2a\0|MM\0\x2a)',
@@ -899,6 +909,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
899
909
  JP2 => '(\0\0\0\x0cjP( |\x1a\x1a)\x0d\x0a\x87\x0a|\xff\x4f\xff\x51\0)',
900
910
  JPEG => '\xff\xd8\xff',
901
911
  JSON => '(\xef\xbb\xbf)?\s*(\[\s*)?\{\s*"[^"]*"\s*:',
912
+ JXL => '\xff\x0a|\0\0\0\x0cJXL \x0d\x0a......ftypjxl ',
902
913
  LFP => '\x89LFP\x0d\x0a\x1a\x0a',
903
914
  LNK => '.{4}\x01\x14\x02\0{5}\xc0\0{6}\x46',
904
915
  LRI => 'LELR \0',
@@ -911,6 +922,7 @@ $testLen = 1024; # number of bytes to read when testing for magic number
911
922
  MPC => '(MP\+|ID3)',
912
923
  MOI => 'V6',
913
924
  MPEG => '\0\0\x01[\xb0-\xbf]',
925
+ MRC => '.{64}[\x01\x02\x03]\0\0\0[\x01\x02\x03]\0\0\0[\x01\x02\x03]\0\0\0.{132}MAP[\0 ](\x44\x44|\x44\x41|\x11\x11)\0\0',
914
926
  MRW => '\0MR[MI]',
915
927
  MXF => '\x06\x0e\x2b\x34\x02\x05\x01\x01\x0d\x01\x02', # (not tested if extension recognized)
916
928
  OGG => '(OggS|ID3)',
@@ -1756,7 +1768,10 @@ my %systemTagsNotes = (
1756
1768
  EmbeddedVideo => { Groups => { 0 => 'Trailer', 2 => 'Video' } },
1757
1769
  Trailer => {
1758
1770
  Groups => { 0 => 'Trailer' },
1759
- Notes => 'the full JPEG trailer data block. Extracted only if specifically requested',
1771
+ Notes => q{
1772
+ the full JPEG trailer data block. Extracted only if specifically requested
1773
+ or the RequestAll API option is set to 3 or higher
1774
+ },
1760
1775
  Writable => 1,
1761
1776
  Protected => 1,
1762
1777
  },
@@ -6120,9 +6135,10 @@ sub ProcessJPEG($$)
6120
6135
  my $out = $$options{TextOut};
6121
6136
  my $fast = $$options{FastScan} || 0;
6122
6137
  my $raf = $$dirInfo{RAF};
6138
+ my $req = $$self{REQ_TAG_LOOKUP};
6123
6139
  my $htmlDump = $$self{HTML_DUMP};
6124
6140
  my %dumpParms = ( Out => $out );
6125
- my ($success, $wantTrailer, $trailInfo, $foundSOS);
6141
+ my ($success, $wantTrailer, $trailInfo, $foundSOS, %jumbfChunk);
6126
6142
  my (@iccChunk, $iccChunkCount, $iccChunksTotal, @flirChunk, $flirCount, $flirTotal);
6127
6143
  my ($preview, $scalado, @dqt, $subSampling, $dumpEnd, %extendedXMP);
6128
6144
 
@@ -6133,7 +6149,7 @@ sub ProcessJPEG($$)
6133
6149
  $$self{FILE_TYPE} = 'EXV';
6134
6150
  }
6135
6151
  my $appBytes = 0;
6136
- my $calcImageLen = $$self{REQ_TAG_LOOKUP}{jpegimagelength};
6152
+ my $calcImageLen = $$req{jpegimagelength};
6137
6153
  if ($$options{RequestAll} and $$options{RequestAll} > 2) {
6138
6154
  $calcImageLen = 1;
6139
6155
  }
@@ -6267,7 +6283,7 @@ sub ProcessJPEG($$)
6267
6283
  } else {
6268
6284
  $self->Warn('Missing JPEG SOS');
6269
6285
  }
6270
- if ($$self{REQ_TAG_LOOKUP}{trailer}) {
6286
+ if ($$req{trailer}) {
6271
6287
  # read entire trailer into memory
6272
6288
  if ($raf->Seek(0,2)) {
6273
6289
  my $len = $raf->Tell() - $pos;
@@ -6401,7 +6417,7 @@ sub ProcessJPEG($$)
6401
6417
  next if $trailInfo or $wantTrailer or $verbose > 2 or $htmlDump;
6402
6418
  }
6403
6419
  # must scan to EOI if Validate or JpegCompressionFactor used
6404
- next if $$options{Validate} or $calcImageLen or $$self{REQ_TAG_LOOKUP}{trailer};
6420
+ next if $$options{Validate} or $calcImageLen or $$req{trailer};
6405
6421
  # nothing interesting to parse after start of scan (SOS)
6406
6422
  $success = 1;
6407
6423
  last; # all done parsing file
@@ -6421,7 +6437,7 @@ sub ProcessJPEG($$)
6421
6437
  # must use the RequestTags option to generate these tags if they have not been
6422
6438
  # specifically requested. The reason is that there is too much overhead involved
6423
6439
  # in the calculation of this tag to make this worth the CPU time.)
6424
- ($$self{REQ_TAG_LOOKUP}{jpegdigest} or $$self{REQ_TAG_LOOKUP}{jpegqualityestimate}
6440
+ ($$req{jpegdigest} or $$req{jpegqualityestimate}
6425
6441
  or ($$options{RequestAll} and $$options{RequestAll} > 2)))
6426
6442
  {
6427
6443
  my $num = unpack('C',$$segDataPt) & 0x0f; # get table index
@@ -6539,7 +6555,7 @@ sub ProcessJPEG($$)
6539
6555
  }
6540
6556
  if ($start and $plen and IsInt($start) and IsInt($plen) and
6541
6557
  $start + $plen > $$self{EXIF_POS} + length($$self{EXIF_DATA}) and
6542
- ($$self{REQ_TAG_LOOKUP}{previewimage} or
6558
+ ($$req{previewimage} or
6543
6559
  # (extracted normally, so check Binary option)
6544
6560
  ($$options{Binary} and not $$self{EXCL_TAG_LOOKUP}{previewimage})))
6545
6561
  {
@@ -6934,7 +6950,7 @@ sub ProcessJPEG($$)
6934
6950
  # (with number of elements N = ImageHeight / 16 - 1, ref PH/NealKrawetz)
6935
6951
  $xtra = 'segment (N=' . unpack('x6N', $$segDataPt) . ')';
6936
6952
  }
6937
- } elsif ($marker == 0xeb) { # APP11 (JPEG-HDR)
6953
+ } elsif ($marker == 0xeb) { # APP11 (JPEG-HDR, JUMBF)
6938
6954
  if ($$segDataPt =~ /^HDR_RI /) {
6939
6955
  $dumpType = 'JPEG-HDR';
6940
6956
  my $dataPt = $segDataPt;
@@ -6954,6 +6970,47 @@ sub ProcessJPEG($$)
6954
6970
  $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
6955
6971
  undef $combinedSegData;
6956
6972
  }
6973
+ } elsif ($$segDataPt =~ /^(JP..)/s and length($$segDataPt) >= 16) {
6974
+ # JUMBF extension marker
6975
+ my $hdr = $1;
6976
+ $dumpType = 'JUMBF';
6977
+ SetByteOrder('MM');
6978
+ my $seq = Get32u($segDataPt, 4) - 1; # (start from 0)
6979
+ my $len = Get32u($segDataPt, 8);
6980
+ my $type = substr($$segDataPt, 12, 4);
6981
+ my $hdrLen;
6982
+ if ($len == 1 and length($$segDataPt) >= 24) {
6983
+ $len = Get64u($$segDataPt, 16);
6984
+ $hdrLen = 16;
6985
+ } else {
6986
+ $hdrLen = 8;
6987
+ }
6988
+ $jumbfChunk{$type} or $jumbfChunk{$type} = [ ];
6989
+ if ($len < $hdrLen) {
6990
+ $self->Warn('Invalid JUMBF segment');
6991
+ } elsif ($seq < 0) {
6992
+ $self->Warn('Invalid JUMBF sequence number');
6993
+ } elsif (defined $jumbfChunk{$type}[$seq]) {
6994
+ $self->Warn('Duplicate JUMBF sequence number');
6995
+ } else {
6996
+ # add to list of JUMBF chunks
6997
+ $jumbfChunk{$type}[$seq] = substr($$segDataPt, 8 + $hdrLen);
6998
+ # check to see if we have a complete JUMBF box
6999
+ my $size = $hdrLen;
7000
+ foreach (@{$jumbfChunk{$type}}) {
7001
+ defined $_ or $size = 0, last;
7002
+ $size += length $_;
7003
+ }
7004
+ if ($size == $len) {
7005
+ my $buff = join '', substr($$segDataPt,8,$hdrLen), @{$jumbfChunk{$type}};
7006
+ $dirInfo{DataPt} = \$buff;
7007
+ $dirInfo{DataPos} = $segPos + 8; # (shows correct offsets for single-segment JUMBF)
7008
+ $dirInfo{DataLen} = $dirInfo{DirLen} = $size;
7009
+ my $tagTablePtr = GetTagTable('Image::ExifTool::Jpeg2000::Main');
7010
+ $self->ProcessDirectory(\%dirInfo, $tagTablePtr);
7011
+ delete $jumbfChunk{$type};
7012
+ }
7013
+ }
6957
7014
  }
6958
7015
  } elsif ($marker == 0xec) { # APP12 (Ducky, Picture Info)
6959
7016
  if ($$segDataPt =~ /^Ducky/) {
@@ -7005,7 +7062,7 @@ sub ProcessJPEG($$)
7005
7062
  } elsif ($marker == 0xee) { # APP14 (Adobe)
7006
7063
  if ($$segDataPt =~ /^Adobe/) {
7007
7064
  # extract as a block if requested, or if copying tags from file
7008
- if ($$self{REQ_TAG_LOOKUP}{adobe} or
7065
+ if ($$req{adobe} or
7009
7066
  # (not extracted normally, so check TAGS_FROM_FILE)
7010
7067
  ($$self{TAGS_FROM_FILE} and not $$self{EXCL_TAG_LOOKUP}{adobe}))
7011
7068
  {
@@ -7108,6 +7165,7 @@ sub ProcessJPEG($$)
7108
7165
  Image::ExifTool::JPEGDigest::Calculate($self, \@dqt, $subSampling);
7109
7166
  }
7110
7167
  # issue necessary warnings
7168
+ $self->Warn('Invalid JUMBF size or missing JUMBF chunk') if %jumbfChunk;
7111
7169
  $self->Warn('Incomplete ICC_Profile record', 1) if defined $iccChunkCount;
7112
7170
  $self->Warn('Incomplete FLIR record', 1) if defined $flirCount;
7113
7171
  $self->Warn('Error reading PreviewImage', 1) if $$self{PreviewError};
@@ -7776,7 +7834,8 @@ sub GetTagInfo($$$;$$$)
7776
7834
  }
7777
7835
  }
7778
7836
  if ($$tagInfo{Unknown} and not $$self{OPTIONS}{Unknown} and
7779
- not $$self{OPTIONS}{Verbose} and not $$self{HTML_DUMP})
7837
+ not $$self{OPTIONS}{Verbose} and not $$self{OPTIONS}{Validate} and
7838
+ not $$self{HTML_DUMP})
7780
7839
  {
7781
7840
  # don't return Unknown tags unless that option is set
7782
7841
  return undef;