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.
- checksums.yaml +4 -4
- data/bin/Changes +50 -0
- data/bin/MANIFEST +11 -0
- data/bin/META.json +1 -1
- data/bin/META.yml +1 -1
- data/bin/README +44 -43
- data/bin/config_files/acdsee.config +193 -6
- data/bin/config_files/cuepointlist.config +70 -0
- data/bin/exiftool +45 -44
- data/bin/lib/Image/ExifTool.pm +85 -26
- data/bin/lib/Image/ExifTool.pod +61 -50
- data/bin/lib/Image/ExifTool/BuildTagLookup.pm +1 -1
- data/bin/lib/Image/ExifTool/Canon.pm +3 -2
- data/bin/lib/Image/ExifTool/DjVu.pm +6 -5
- data/bin/lib/Image/ExifTool/Exif.pm +16 -7
- data/bin/lib/Image/ExifTool/FujiFilm.pm +18 -8
- data/bin/lib/Image/ExifTool/JPEG.pm +6 -2
- data/bin/lib/Image/ExifTool/JSON.pm +24 -3
- data/bin/lib/Image/ExifTool/Jpeg2000.pm +361 -16
- data/bin/lib/Image/ExifTool/MRC.pm +341 -0
- data/bin/lib/Image/ExifTool/MWG.pm +3 -3
- data/bin/lib/Image/ExifTool/MXF.pm +1 -1
- data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
- data/bin/lib/Image/ExifTool/Microsoft.pm +5 -3
- data/bin/lib/Image/ExifTool/Nikon.pm +3 -2
- data/bin/lib/Image/ExifTool/NikonSettings.pm +10 -1
- data/bin/lib/Image/ExifTool/PNG.pm +2 -2
- data/bin/lib/Image/ExifTool/Panasonic.pm +14 -1
- data/bin/lib/Image/ExifTool/PhaseOne.pm +4 -3
- data/bin/lib/Image/ExifTool/QuickTime.pm +102 -44
- data/bin/lib/Image/ExifTool/QuickTimeStream.pl +88 -29
- data/bin/lib/Image/ExifTool/RIFF.pm +83 -11
- data/bin/lib/Image/ExifTool/Samsung.pm +2 -1
- data/bin/lib/Image/ExifTool/Sony.pm +98 -24
- data/bin/lib/Image/ExifTool/TagLookup.pm +56 -15
- data/bin/lib/Image/ExifTool/TagNames.pod +388 -173
- data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -0
- data/bin/lib/Image/ExifTool/WriteQuickTime.pl +37 -12
- data/bin/lib/Image/ExifTool/WriteXMP.pl +6 -2
- data/bin/lib/Image/ExifTool/Writer.pl +1 -0
- data/bin/lib/Image/ExifTool/XMP.pm +20 -7
- data/bin/perl-Image-ExifTool.spec +42 -42
- data/lib/exiftool_vendored/version.rb +1 -1
- 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.
|
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 |
|
4472
|
-
3FR r | DR4 r/w/c | J2C r |
|
4473
|
-
3G2 r/w | DSS r | JNG r/w |
|
4474
|
-
3GP r/w | DV r | JP2 r/w |
|
4475
|
-
A r | DVB r/w | JPEG r/w |
|
4476
|
-
AA r | DVR-MS r | JSON r |
|
4477
|
-
AAE r | DYLIB r |
|
4478
|
-
AAX r/w | EIP r |
|
4479
|
-
ACR r | EPS r/w |
|
4480
|
-
AFM r | EPUB r |
|
4481
|
-
AI r/w | ERF r/w |
|
4482
|
-
AIFF r | EXE r |
|
4483
|
-
APE r | EXIF r/w/c |
|
4484
|
-
ARQ r/w | EXR r |
|
4485
|
-
ARW r/w | EXV r/w/c |
|
4486
|
-
ASF r | F4A/V r/w |
|
4487
|
-
AVI r | FFF r/w |
|
4488
|
-
AVIF r/w | FITS r |
|
4489
|
-
AZW r | FLA r |
|
4490
|
-
BMP r | FLAC r |
|
4491
|
-
BPG r | FLIF r/w |
|
4492
|
-
BTF r | FLV r |
|
4493
|
-
CHM r | FPF r |
|
4494
|
-
COS r | FPX r |
|
4495
|
-
CR2 r/w | GIF r/w |
|
4496
|
-
CR3 r/w | GPR r/w |
|
4497
|
-
CRM r/w | GZ r |
|
4498
|
-
CRW r/w | HDP r/w |
|
4499
|
-
CS1 r/w | HDR r |
|
4500
|
-
CSV r | HEIC r/w |
|
4501
|
-
CZI r | HEIF r/w |
|
4502
|
-
DCM r | HTML r |
|
4503
|
-
DCP r/w | ICC r/w/c |
|
4504
|
-
DCR r | ICS r |
|
4505
|
-
DFONT r | IDML r |
|
4506
|
-
DIVX r | IIQ r/w |
|
4507
|
-
DJVU r | IND r/w |
|
4508
|
-
DLL r | INSP r/w |
|
4509
|
-
DNG r/w | INSV r |
|
4510
|
-
DOC r | INX r |
|
4511
|
-
DOCX r | ISO r |
|
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.
|
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
|
data/bin/lib/Image/ExifTool.pm
CHANGED
@@ -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.
|
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
|
142
|
-
PDF PostScript Photoshop::Header Photoshop::Layers
|
143
|
-
FujiFilm::RAF FujiFilm::IFD Samsung::Trailer Sony::SRF2
|
144
|
-
Sony::PMP ITC ID3 ID3::Lyrics3 FLAC Ogg Vorbis APE
|
145
|
-
APE::OldHeader Audible MPC MPEG::Audio MPEG::Video MPEG::Xing
|
146
|
-
QuickTime::ImageFile QuickTime::Stream QuickTime::Tags360Fly
|
147
|
-
MXF DV Flash Flash::FLV Real::Media Real::Audio Real::Metafile
|
148
|
-
ASF WTV DICOM FITS MIE JSON HTML XMP::SVG Palm Palm::MOBI
|
149
|
-
EXE EXE::PEVersion EXE::PEString EXE::MachO EXE::PEF
|
150
|
-
EXE::CHM LNK Font VCard Text VCard::VCalendar RSRC Rawzor
|
151
|
-
ZIP::RAR RTF OOXML iWork ISO FLIR::AFF FLIR::FPF MacOS
|
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
|
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 =>
|
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 = $$
|
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 ($$
|
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 $$
|
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
|
-
($$
|
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
|
-
($$
|
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 ($$
|
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{
|
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;
|