exiftool-vendored.pl 13.30.0 → 13.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/Changes +35 -0
- package/bin/META.json +2 -2
- package/bin/META.yml +2 -2
- package/bin/README +2 -2
- package/bin/exiftool +23 -12
- package/bin/lib/Image/ExifTool/BuildTagLookup.pm +3 -3
- package/bin/lib/Image/ExifTool/Canon.pm +11 -4
- package/bin/lib/Image/ExifTool/Exif.pm +6 -3
- package/bin/lib/Image/ExifTool/FujiFilm.pm +3 -0
- package/bin/lib/Image/ExifTool/GoPro.pm +10 -3
- package/bin/lib/Image/ExifTool/LNK.pm +21 -3
- package/bin/lib/Image/ExifTool/Lang/de.pm +2 -1
- package/bin/lib/Image/ExifTool/Lang/fr.pm +2 -1
- package/bin/lib/Image/ExifTool/LigoGPS.pm +14 -6
- package/bin/lib/Image/ExifTool/Nikon.pm +13 -5
- package/bin/lib/Image/ExifTool/Olympus.pm +2 -1
- package/bin/lib/Image/ExifTool/PDF.pm +1 -0
- package/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
- package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
- package/bin/lib/Image/ExifTool/Pentax.pm +179 -52
- package/bin/lib/Image/ExifTool/Plot.pm +2 -3
- package/bin/lib/Image/ExifTool/QuickTime.pm +3 -2
- package/bin/lib/Image/ExifTool/QuickTimeStream.pl +41 -17
- package/bin/lib/Image/ExifTool/Sigma.pm +19 -1
- package/bin/lib/Image/ExifTool/Sony.pm +2 -1
- package/bin/lib/Image/ExifTool/TagLookup.pm +3760 -3750
- package/bin/lib/Image/ExifTool/TagNames.pod +32 -9
- package/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
- package/bin/lib/Image/ExifTool/Writer.pl +134 -131
- package/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
- package/bin/lib/Image/ExifTool.pm +6 -4
- package/bin/perl-Image-ExifTool.spec +1 -1
- package/bin/windows_exiftool.txt +14 -11
- package/package.json +12 -5
package/bin/Changes
CHANGED
|
@@ -7,6 +7,39 @@ RSS feed: https://exiftool.org/rss.xml
|
|
|
7
7
|
Note: The most recent production release is Version 13.30. (Other versions are
|
|
8
8
|
considered development releases, and are not uploaded to MetaCPAN.)
|
|
9
9
|
|
|
10
|
+
July 2, 2025 - Version 13.32
|
|
11
|
+
|
|
12
|
+
- Added a new Olympus CameraType (thanks Herb and Albert Shan)
|
|
13
|
+
- Added a new Sony LensType (github #335)
|
|
14
|
+
- Added a new Nikon CropHiSpeed value (thanks Albert Shan)
|
|
15
|
+
- Added a warning if a tag value couldn't be packed for writing to a binary
|
|
16
|
+
data structure
|
|
17
|
+
- Decode more Ricoh/Pentax AF tags for some models (thanks Karsten Gieselmann)
|
|
18
|
+
- Decode Canon HDR-PQ tag (github #336)
|
|
19
|
+
- Extract a couple more EXIF tags
|
|
20
|
+
- Patched to allow a dot (.) in the name of a structure element when writing
|
|
21
|
+
- Fixed "uninitialized value" bug when using -w with the -stay_open feature
|
|
22
|
+
- Fixed bug in -file option when tag names were used to specify the name of
|
|
23
|
+
the alternate file (the tags were taken only from the first input file
|
|
24
|
+
unless a file name formatting code was also specified)
|
|
25
|
+
|
|
26
|
+
June 19, 2025 - Version 13.31
|
|
27
|
+
|
|
28
|
+
- Added a new CanonModelID and RFLensType (thanks Norbert Wasser)
|
|
29
|
+
- Added some new FujiFilm AdvancedFilter values (thanks Greybeard)
|
|
30
|
+
- Added a new Nikon Z LensID (thanks Warren Hatch)
|
|
31
|
+
- Decode a few new Sigma tags
|
|
32
|
+
- Decode two more types of timed GPS from MP4 videos
|
|
33
|
+
- Decode more Pentax AF tags for some models (thanks Karsten Gieselmann)
|
|
34
|
+
- Extract Pages MediaBox from PDF files (github #333)
|
|
35
|
+
- Enhanced Validate feature to check some embedded images
|
|
36
|
+
- Remove sub-seconds if they exist when writing a PDF date
|
|
37
|
+
- Removed a debugging warning left in the -plot update of 13.28
|
|
38
|
+
- Changed DNG ProfileIFD RGBTables to Binary-type tag (github #334)
|
|
39
|
+
- Internal code improvements in the handling of some trailers
|
|
40
|
+
- Patched LNK string parsing for Windows nonconformity (github #332)
|
|
41
|
+
- Fixed a few possible "uninitialized value" warnings
|
|
42
|
+
|
|
10
43
|
May 22, 2025 - Version 13.30 (production release)
|
|
11
44
|
|
|
12
45
|
- Added a new Canon RF lens (thanks Norbert Wasser)
|
|
@@ -50,6 +83,8 @@ Apr. 25, 2025 - Version 13.28
|
|
|
50
83
|
- Decode ShutterCount for Canon EOS R8 and R50 (github #325)
|
|
51
84
|
- Decode ThumbnailTIFF from some Insta360 videos
|
|
52
85
|
- Decode AROT:HDRGainCurveSize from APP10
|
|
86
|
+
- Enhanced the -plot feature to allow Multi option to specify a different
|
|
87
|
+
number of datasets for each plot
|
|
53
88
|
- Updated to the 2025 MPF specification
|
|
54
89
|
- Renamed K-3III AFPoints to AFPointsSelected and changed decoding
|
|
55
90
|
- Fixed bug introduced in 13.23 that could cause an incorrect parsing of XMP
|
package/bin/META.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
],
|
|
11
11
|
"meta-spec" : {
|
|
12
12
|
"url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
|
|
13
|
-
"version" :
|
|
13
|
+
"version" : 2
|
|
14
14
|
},
|
|
15
15
|
"name" : "Image-ExifTool",
|
|
16
16
|
"no_index" : {
|
|
@@ -50,6 +50,6 @@
|
|
|
50
50
|
}
|
|
51
51
|
},
|
|
52
52
|
"release_status" : "stable",
|
|
53
|
-
"version" : "13.
|
|
53
|
+
"version" : "13.32",
|
|
54
54
|
"x_serialization_backend" : "JSON::PP version 4.06"
|
|
55
55
|
}
|
package/bin/META.yml
CHANGED
package/bin/README
CHANGED
|
@@ -109,8 +109,8 @@ your home directory, then you would type the following commands in a
|
|
|
109
109
|
terminal window to extract and run ExifTool:
|
|
110
110
|
|
|
111
111
|
cd ~/Desktop
|
|
112
|
-
gzip -dc Image-ExifTool-13.
|
|
113
|
-
cd Image-ExifTool-13.
|
|
112
|
+
gzip -dc Image-ExifTool-13.32.tar.gz | tar -xf -
|
|
113
|
+
cd Image-ExifTool-13.32
|
|
114
114
|
./exiftool t/images/ExifTool.jpg
|
|
115
115
|
|
|
116
116
|
Note: These commands extract meta information from one of the test images.
|
package/bin/exiftool
CHANGED
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use warnings;
|
|
12
12
|
require 5.004;
|
|
13
13
|
|
|
14
|
-
my $version = '13.
|
|
14
|
+
my $version = '13.32';
|
|
15
15
|
|
|
16
16
|
$^W = 1; # enable global warnings
|
|
17
17
|
|
|
@@ -101,9 +101,9 @@ my @csvFiles; # list of files when reading with CSV option (in ExifTool Ch
|
|
|
101
101
|
my @csvTags; # order of tags for first file with CSV option (lower case)
|
|
102
102
|
my @delFiles; # list of files to delete
|
|
103
103
|
my @dynamicFiles; # list of -tagsFromFile files with dynamic names and -TAG<=FMT pairs
|
|
104
|
+
my (@echo3, @echo4);# stdout and stderr echo after processing is complete
|
|
104
105
|
my @efile; # files for writing list of error/fail/same file names
|
|
105
106
|
my @exclude; # list of excluded tags
|
|
106
|
-
my (@echo3, @echo4);# stdout and stderr echo after processing is complete
|
|
107
107
|
my @files; # list of files and directories to scan
|
|
108
108
|
my @moreArgs; # more arguments to process after -stay_open -@
|
|
109
109
|
my @newValues; # list of new tag values to set
|
|
@@ -118,7 +118,6 @@ my %csvTags; # lookup for all found tags with CSV option (lower case keys
|
|
|
118
118
|
my %database; # lookup for database information based on file name (in ExifTool Charset)
|
|
119
119
|
my %filterExt; # lookup for filtered extensions
|
|
120
120
|
my %ignore; # directory names to ignore
|
|
121
|
-
my $ignoreHidden; # flag to ignore hidden files
|
|
122
121
|
my %outComma; # flag that output text file needs a comma
|
|
123
122
|
my %outTrailer; # trailer for output text file
|
|
124
123
|
my %preserveTime; # preserved timestamps for files
|
|
@@ -130,6 +129,7 @@ my %usedFileName; # lookup for file names we already used in TestName feature
|
|
|
130
129
|
my %utf8FileName; # lookup for file names that are UTF-8 encoded
|
|
131
130
|
my %warnedOnce; # lookup for once-only warnings
|
|
132
131
|
my %wext; # -W extensions to write
|
|
132
|
+
my %wroteHEAD; # list of output txt files to which we wrote HEAD
|
|
133
133
|
my $allGroup; # show group name for all tags
|
|
134
134
|
my $altEnc; # alternate character encoding if not UTF-8
|
|
135
135
|
my $argFormat; # use exiftool argument-format output
|
|
@@ -175,6 +175,7 @@ my $forcePrint; # string to use for missing tag values (undef to not print t
|
|
|
175
175
|
my $geoOnly; # flag to extract Geolocation tags only
|
|
176
176
|
my $helped; # flag to avoid printing help if no tags specified
|
|
177
177
|
my $html; # flag for html-formatted output (2=html dump)
|
|
178
|
+
my $ignoreHidden; # flag to ignore hidden files
|
|
178
179
|
my $interrupted; # flag set if CTRL-C is pressed during a critical process
|
|
179
180
|
my $isBinary; # true if value is a SCALAR ref
|
|
180
181
|
my $isWriting; # flag set if we are writing tags
|
|
@@ -227,7 +228,6 @@ my $validFile; # flag indicating we processed a valid file
|
|
|
227
228
|
my $verbose; # verbose setting
|
|
228
229
|
my $vout; # verbose output file reference (\*STDOUT or \*STDERR by default)
|
|
229
230
|
my $windowTitle; # title for console window
|
|
230
|
-
my %wroteHEAD; # list of output txt files to which we wrote HEAD
|
|
231
231
|
my $xml; # flag for XML-formatted output
|
|
232
232
|
|
|
233
233
|
# flag to keep the input -@ argfile open:
|
|
@@ -451,8 +451,10 @@ undef @efile;
|
|
|
451
451
|
undef @exclude;
|
|
452
452
|
undef @files;
|
|
453
453
|
undef @newValues;
|
|
454
|
+
undef @requestTags;
|
|
454
455
|
undef @srcFmt;
|
|
455
456
|
undef @tags;
|
|
457
|
+
undef %altFile;
|
|
456
458
|
undef %appended;
|
|
457
459
|
undef %countLink;
|
|
458
460
|
undef %created;
|
|
@@ -472,6 +474,7 @@ undef %usedFileName;
|
|
|
472
474
|
undef %utf8FileName;
|
|
473
475
|
undef %warnedOnce;
|
|
474
476
|
undef %wext;
|
|
477
|
+
undef %wroteHEAD;
|
|
475
478
|
undef $allGroup;
|
|
476
479
|
undef $altEnc;
|
|
477
480
|
undef $argFormat;
|
|
@@ -488,8 +491,8 @@ undef $doSetFileName;
|
|
|
488
491
|
undef $doUnzip;
|
|
489
492
|
undef $end;
|
|
490
493
|
undef $endDir;
|
|
491
|
-
undef $escapeHTML;
|
|
492
494
|
undef $escapeC;
|
|
495
|
+
undef $escapeHTML;
|
|
493
496
|
undef $evalWarning;
|
|
494
497
|
undef $executeID;
|
|
495
498
|
undef $failCondition;
|
|
@@ -500,18 +503,22 @@ undef $fixLen;
|
|
|
500
503
|
undef $forcePrint;
|
|
501
504
|
undef $geoOnly;
|
|
502
505
|
undef $ignoreHidden;
|
|
506
|
+
undef $isBinary;
|
|
503
507
|
undef $joinLists;
|
|
504
508
|
undef $langOpt;
|
|
509
|
+
undef $listDir;
|
|
505
510
|
undef $listItem;
|
|
506
511
|
undef $multiFile;
|
|
507
512
|
undef $noBinary;
|
|
508
513
|
undef $outOpt;
|
|
514
|
+
undef $plot;
|
|
509
515
|
undef $preserveTime;
|
|
510
516
|
undef $progress;
|
|
511
517
|
undef $progressCount;
|
|
512
518
|
undef $progressIncr;
|
|
513
519
|
undef $progressMax;
|
|
514
520
|
undef $progressNext;
|
|
521
|
+
undef $rafStdin;
|
|
515
522
|
undef $recurse;
|
|
516
523
|
undef $scanWritable;
|
|
517
524
|
undef $sectHeader;
|
|
@@ -521,6 +528,7 @@ undef $showTagID;
|
|
|
521
528
|
undef $structOpt;
|
|
522
529
|
undef $tagOut;
|
|
523
530
|
undef $textOut;
|
|
531
|
+
undef $textOut2;
|
|
524
532
|
undef $textOverwrite;
|
|
525
533
|
undef $tmpFile;
|
|
526
534
|
undef $tmpText;
|
|
@@ -5595,7 +5603,9 @@ Output requested metadata in binary format without tag names or descriptions
|
|
|
5595
5603
|
images or other binary data, but it may also be useful for some text strings
|
|
5596
5604
|
since control characters (such as newlines) are not replaced by '.' as they
|
|
5597
5605
|
are in the default output. By default, list items are separated by a
|
|
5598
|
-
newline when extracted with the B<-b> option
|
|
5606
|
+
newline when extracted with the B<-b> option and no terminator is added
|
|
5607
|
+
after each tag value, but the list separator may be changed with a B<-sep>
|
|
5608
|
+
option and a terminator may be set by adding a second B<-sep> option (see
|
|
5599
5609
|
the B<-sep> option for details). May be combined with B<-j>, B<-php> or
|
|
5600
5610
|
B<-X> to extract binary data in JSON, PHP or XML format, but note that
|
|
5601
5611
|
"Unsafe" tags are not extracted as binary unless they are specified
|
|
@@ -6052,7 +6062,7 @@ with this command:
|
|
|
6052
6062
|
|
|
6053
6063
|
produces output like this:
|
|
6054
6064
|
|
|
6055
|
-
-- Generated by ExifTool 13.
|
|
6065
|
+
-- Generated by ExifTool 13.32 --
|
|
6056
6066
|
File: a.jpg - 2003:10:31 15:44:19
|
|
6057
6067
|
(f/5.6, 1/60s, ISO 100)
|
|
6058
6068
|
File: b.jpg - 2006:05:23 11:57:38
|
|
@@ -6863,9 +6873,10 @@ otherwise family 0 is assumed. The B<-l> or B<-v> option may be combined
|
|
|
6863
6873
|
with B<-listf>, B<-listr> or B<-listwf> to add file descriptions to the
|
|
6864
6874
|
list. The B<-lang> option may be combined with B<-listx> to output
|
|
6865
6875
|
descriptions in a single language, and the B<-sort> and/or B<-lang> options
|
|
6866
|
-
may be combined with B<-listgeo
|
|
6867
|
-
|
|
6868
|
-
|
|
6876
|
+
may be combined with B<-listgeo> (installation of the alternate database is
|
|
6877
|
+
required for the additional languages). Also, the API GeolocMinPop,
|
|
6878
|
+
GeolocFeature and GeolocAltNames options apply to the B<-listgeo> output.
|
|
6879
|
+
Here are some examples:
|
|
6869
6880
|
|
|
6870
6881
|
-list # list all tag names
|
|
6871
6882
|
-list -EXIF:All # list all EXIF tags
|
|
@@ -7295,6 +7306,8 @@ used in file names.)
|
|
|
7295
7306
|
|
|
7296
7307
|
=head4 Helper functions
|
|
7297
7308
|
|
|
7309
|
+
Note that function names are case sensitive.
|
|
7310
|
+
|
|
7298
7311
|
C<DateFmt>
|
|
7299
7312
|
|
|
7300
7313
|
Simplifies reformatting of individual date/time values. This function acts
|
|
@@ -7332,8 +7345,6 @@ rewritten unnecessarily:
|
|
|
7332
7345
|
|
|
7333
7346
|
exiftool -sep '##' '-keywords<${keywords;NoDups(1)}' a.jpg
|
|
7334
7347
|
|
|
7335
|
-
Note that function names are case sensitive.
|
|
7336
|
-
|
|
7337
7348
|
ExifTool 12.64 adds an API NoDups option which makes the NoDups helper
|
|
7338
7349
|
function largely redundant, with all the functionality except the ability to
|
|
7339
7350
|
avoid rewriting the file if there are no duplicates, but with the advantage
|
|
@@ -271,11 +271,11 @@ tags remain.
|
|
|
271
271
|
|
|
272
272
|
The table below lists all EXIF tags. Also listed are TIFF, DNG, HDP and
|
|
273
273
|
other tags which are not part of the EXIF specification, but may co-exist
|
|
274
|
-
with EXIF tags in some images. Tags which are part of the EXIF
|
|
274
|
+
with EXIF tags in some images. Tags which are part of the EXIF 3.0
|
|
275
275
|
specification have an underlined B<Tag Name> in the HTML version of this
|
|
276
276
|
documentation. See
|
|
277
|
-
L<https://
|
|
278
|
-
for the official EXIF
|
|
277
|
+
L<https://www.cipa.jp/std/documents/download_e.html?CIPA_DC-008-2024-E>
|
|
278
|
+
for the official EXIF 3.0 specification.
|
|
279
279
|
},
|
|
280
280
|
GPS => q{
|
|
281
281
|
These GPS tags are part of the EXIF standard, and are stored in a separate
|
|
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
|
|
|
88
88
|
sub ProcessExifInfo($$$);
|
|
89
89
|
sub SwapWords($);
|
|
90
90
|
|
|
91
|
-
$VERSION = '4.
|
|
91
|
+
$VERSION = '4.93';
|
|
92
92
|
|
|
93
93
|
# Note: Removed 'USM' from 'L' lenses since it is redundant - PH
|
|
94
94
|
# (or is it? Ref 32 shows 5 non-USM L-type lenses)
|
|
@@ -636,9 +636,10 @@ $VERSION = '4.91';
|
|
|
636
636
|
'61182.58' => 'Canon RF 70-200mm F2.8 L IS USM Z + RF1.4x', #42
|
|
637
637
|
'61182.59' => 'Canon RF 70-200mm F2.8 L IS USM Z + RF2x', #42
|
|
638
638
|
'61182.60' => 'Canon RF 16-28mm F2.8 IS STM', #42
|
|
639
|
-
'61182.61' => 'Canon RF
|
|
640
|
-
'61182.62' => 'Canon RF
|
|
641
|
-
'61182.63' => 'Canon RF
|
|
639
|
+
'61182.61' => 'Canon RF-S 14-30mm F4-6.3 IS STM PZ', #42
|
|
640
|
+
'61182.62' => 'Canon RF 50mm F1.4 L VCM', #42
|
|
641
|
+
'61182.63' => 'Canon RF 24mm F1.4 L VCM', #42
|
|
642
|
+
'61182.64' => 'Canon RF 20mm F1.4 L VCM', #42
|
|
642
643
|
65535 => 'n/a',
|
|
643
644
|
);
|
|
644
645
|
|
|
@@ -1006,6 +1007,7 @@ $VERSION = '4.91';
|
|
|
1006
1007
|
0x80000495 => 'EOS R1', #PH
|
|
1007
1008
|
0x80000496 => 'R5 Mark II', #forum16406
|
|
1008
1009
|
0x80000498 => 'EOS R100', #25
|
|
1010
|
+
0x80000516 => 'EOS R50 V', #42
|
|
1009
1011
|
0x80000520 => 'EOS D2000C', #IB
|
|
1010
1012
|
0x80000560 => 'EOS D6000C', #PH (guess)
|
|
1011
1013
|
);
|
|
@@ -2626,6 +2628,10 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
|
|
|
2626
2628
|
0x7fff => 'n/a',
|
|
2627
2629
|
},
|
|
2628
2630
|
},
|
|
2631
|
+
52 => { #github336
|
|
2632
|
+
Name => 'HDR-PQ',
|
|
2633
|
+
PrintConv => { %offOn, -1 => 'n/a' },
|
|
2634
|
+
},
|
|
2629
2635
|
);
|
|
2630
2636
|
|
|
2631
2637
|
# focal length information (MakerNotes tag 0x02)
|
|
@@ -7032,6 +7038,7 @@ my %ciMaxFocal = (
|
|
|
7032
7038
|
320 => 'Canon RF 70-200mm F2.8 L IS USM Z + RF1.4x', #42
|
|
7033
7039
|
321 => 'Canon RF 70-200mm F2.8 L IS USM Z + RF2x', #42
|
|
7034
7040
|
323 => 'Canon RF 16-28mm F2.8 IS STM', #42
|
|
7041
|
+
324 => 'Canon RF-S 14-30mm F4-6.3 IS STM PZ', #42
|
|
7035
7042
|
325 => 'Canon RF 50mm F1.4 L VCM', #42
|
|
7036
7043
|
326 => 'Canon RF 24mm F1.4 L VCM', #42
|
|
7037
7044
|
327 => 'Canon RF 20mm F1.4 L VCM', #42
|
|
@@ -57,7 +57,7 @@ use vars qw($VERSION $AUTOLOAD @formatSize @formatName %formatNumber %intFormat
|
|
|
57
57
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
58
58
|
use Image::ExifTool::MakerNotes;
|
|
59
59
|
|
|
60
|
-
$VERSION = '4.
|
|
60
|
+
$VERSION = '4.59';
|
|
61
61
|
|
|
62
62
|
sub ProcessExif($$$);
|
|
63
63
|
sub WriteExif($$$);
|
|
@@ -2029,7 +2029,7 @@ my %opcodeInfo = (
|
|
|
2029
2029
|
OffsetPair => -1,
|
|
2030
2030
|
},
|
|
2031
2031
|
0x8782 => 'T88Options', #20
|
|
2032
|
-
0x87ac => 'ImageLayer',
|
|
2032
|
+
0x87ac => 'ImageLayer', # Defined in the Mixed Raster Content part of RFC 2301
|
|
2033
2033
|
0x87af => { #30
|
|
2034
2034
|
Name => 'GeoTiffDirectory',
|
|
2035
2035
|
Format => 'undef',
|
|
@@ -2081,7 +2081,7 @@ my %opcodeInfo = (
|
|
|
2081
2081
|
0x8822 => {
|
|
2082
2082
|
Name => 'ExposureProgram',
|
|
2083
2083
|
Groups => { 2 => 'Camera' },
|
|
2084
|
-
Notes => 'the value of 9 is not standard EXIF, but is used by
|
|
2084
|
+
Notes => 'the value of 9 is not standard EXIF, but is used by some Canon models',
|
|
2085
2085
|
Writable => 'int16u',
|
|
2086
2086
|
PrintConv => {
|
|
2087
2087
|
0 => 'Not Defined',
|
|
@@ -4209,6 +4209,8 @@ my %opcodeInfo = (
|
|
|
4209
4209
|
},
|
|
4210
4210
|
},
|
|
4211
4211
|
# 0xc7d6 - int8u: 1 (SubIFD1 of Nikon Z6/Z7 NEF)
|
|
4212
|
+
0xc7d7 => { Name => 'ZIFMetadata', Binary => 1 },
|
|
4213
|
+
0xc7d8 => { Name => 'ZIFAnnotations', Binary => 1 },
|
|
4212
4214
|
0xc7e9 => { # DNG 1.5
|
|
4213
4215
|
Name => 'DepthFormat',
|
|
4214
4216
|
Writable => 'int16u',
|
|
@@ -4350,6 +4352,7 @@ my %opcodeInfo = (
|
|
|
4350
4352
|
Writable => 'undef',
|
|
4351
4353
|
WriteGroup => 'IFD0',
|
|
4352
4354
|
Protected => 1,
|
|
4355
|
+
Binary => 1,
|
|
4353
4356
|
},
|
|
4354
4357
|
0xcd40 => { # DNG 1.7
|
|
4355
4358
|
Name => 'ProfileGainTableMap2',
|
|
@@ -629,6 +629,9 @@ my %faceCategories = (
|
|
|
629
629
|
0x70000 => 'Soft Focus',
|
|
630
630
|
0x90000 => 'Low Key',
|
|
631
631
|
0x100000 => 'Light Leak', #forum17392
|
|
632
|
+
0x130000 => 'Expired Film Green', #forum17392
|
|
633
|
+
0x130001 => 'Expired Film Red', #forum17392 (NC)
|
|
634
|
+
0x130002 => 'Expired Film Neutral', #forum17392
|
|
632
635
|
},
|
|
633
636
|
},
|
|
634
637
|
0x1210 => { #2
|
|
@@ -17,7 +17,7 @@ use vars qw($VERSION);
|
|
|
17
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
18
18
|
use Image::ExifTool::QuickTime;
|
|
19
19
|
|
|
20
|
-
$VERSION = '1.
|
|
20
|
+
$VERSION = '1.13';
|
|
21
21
|
|
|
22
22
|
sub ProcessGoPro($$$);
|
|
23
23
|
sub ProcessString($$$);
|
|
@@ -762,7 +762,7 @@ sub ProcessString($$$)
|
|
|
762
762
|
}
|
|
763
763
|
|
|
764
764
|
#------------------------------------------------------------------------------
|
|
765
|
-
# Process "GP\x06\0" records in MP4 'mdat'atom
|
|
765
|
+
# Process "GP\x06\0" records in MP4 'mdat' atom
|
|
766
766
|
# Inputs: 0) ExifTool object ref, 1) dirInfo ref (RAF and DirLen)
|
|
767
767
|
# Returns: size of GoPro record, or 0 on error
|
|
768
768
|
sub ProcessGP6($$)
|
|
@@ -815,9 +815,16 @@ sub ProcessGoPro($$$)
|
|
|
815
815
|
|
|
816
816
|
for (; $pos+8<=$dirEnd; $pos+=($size+3)&0xfffffffc) {
|
|
817
817
|
my ($tag,$fmt,$len,$count) = unpack("x${pos}a4CCn", $$dataPt);
|
|
818
|
+
if ($tag =~ /[^-_a-zA-Z0-9 ]/) {
|
|
819
|
+
$et->Warn('Unrecognized GoPro record') unless $tag eq "\0\0\0\0";
|
|
820
|
+
last;
|
|
821
|
+
}
|
|
818
822
|
$size = $len * $count;
|
|
819
823
|
$pos += 8;
|
|
820
|
-
|
|
824
|
+
if ($pos + $size > $dirEnd) {
|
|
825
|
+
$et->Warn('Truncated GoPro record');
|
|
826
|
+
last;
|
|
827
|
+
}
|
|
821
828
|
my $tagInfo = $et->GetTagInfo($tagTablePtr, $tag);
|
|
822
829
|
last if $tag eq "\0\0\0\0"; # stop at null tag
|
|
823
830
|
next unless $size or $verbose; # don't save empty values unless verbose
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
#
|
|
8
8
|
# References: 1) http://msdn.microsoft.com/en-us/library/dd871305(PROT.10).aspx
|
|
9
9
|
# 2) http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf
|
|
10
|
+
# 3) https://harfanglab.io/insidethelab/sadfuture-xdspy-latest-evolution/#tid_specifications_ignored
|
|
10
11
|
#------------------------------------------------------------------------------
|
|
11
12
|
|
|
12
13
|
package Image::ExifTool::LNK;
|
|
@@ -15,7 +16,7 @@ use strict;
|
|
|
15
16
|
use vars qw($VERSION);
|
|
16
17
|
use Image::ExifTool qw(:DataAccess :Utils);
|
|
17
18
|
|
|
18
|
-
$VERSION = '1.
|
|
19
|
+
$VERSION = '1.10';
|
|
19
20
|
|
|
20
21
|
sub ProcessItemID($$$);
|
|
21
22
|
sub ProcessLinkInfo($$$);
|
|
@@ -647,17 +648,32 @@ sub ProcessLNK($$)
|
|
|
647
648
|
my @strings = qw(Description RelativePath WorkingDirectory
|
|
648
649
|
CommandLineArguments IconFileName);
|
|
649
650
|
for ($i=0; $i<@strings; ++$i) {
|
|
651
|
+
my ($val, $limit);
|
|
650
652
|
my $mask = 0x04 << $i;
|
|
651
653
|
next unless $flags & $mask;
|
|
652
654
|
$raf->Read($buff, 2) or return 1;
|
|
655
|
+
my $pos = $raf->Tell();
|
|
653
656
|
$len = unpack('v', $buff) or next;
|
|
657
|
+
# Windows doesn't follow their own specification and limits the length
|
|
658
|
+
# for most of these strings (ref 3)
|
|
659
|
+
if ($i != 3 and $len >= 260) {
|
|
660
|
+
$limit = 1;
|
|
661
|
+
if ($len > 260) {
|
|
662
|
+
$len = 260;
|
|
663
|
+
$et->Warn('LNK string data overrun! Possible security issue');
|
|
664
|
+
}
|
|
665
|
+
}
|
|
654
666
|
$len *= 2 if $flags & 0x80; # characters are 2 bytes if Unicode flag is set
|
|
655
667
|
$raf->Read($buff, $len) or return 1;
|
|
656
|
-
|
|
668
|
+
# remove last character if string is at length limit (Windows treats this as a null)
|
|
669
|
+
if ($limit) {
|
|
670
|
+
$len -= $flags & 0x80 ? 2 : 1;
|
|
671
|
+
$buff = substr($buff, 0, $len);
|
|
672
|
+
}
|
|
657
673
|
$val = $et->Decode($buff, 'UCS2') if $flags & 0x80;
|
|
658
674
|
$et->HandleTag($tagTablePtr, 0x30000 | $mask, $val,
|
|
659
675
|
DataPt => \$buff,
|
|
660
|
-
DataPos => $
|
|
676
|
+
DataPos => $pos,
|
|
661
677
|
Size => $len,
|
|
662
678
|
);
|
|
663
679
|
}
|
|
@@ -716,6 +732,8 @@ under the same terms as Perl itself.
|
|
|
716
732
|
|
|
717
733
|
=item L<http://www.i2s-lab.com/Papers/The_Windows_Shortcut_File_Format.pdf>
|
|
718
734
|
|
|
735
|
+
=item L<https://harfanglab.io/insidethelab/sadfuture-xdspy-latest-evolution/#tid_specifications_ignored>
|
|
736
|
+
|
|
719
737
|
=back
|
|
720
738
|
|
|
721
739
|
=head1 SEE ALSO
|
|
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::de;
|
|
|
11
11
|
use strict;
|
|
12
12
|
use vars qw($VERSION);
|
|
13
13
|
|
|
14
|
-
$VERSION = '1.
|
|
14
|
+
$VERSION = '1.38';
|
|
15
15
|
|
|
16
16
|
%Image::ExifTool::Lang::de::Translate = (
|
|
17
17
|
'AEAperture' => 'AE-Blende',
|
|
@@ -5126,6 +5126,7 @@ $VERSION = '1.37';
|
|
|
5126
5126
|
'LensType' => {
|
|
5127
5127
|
Description => 'Objektivtyp',
|
|
5128
5128
|
PrintConv => {
|
|
5129
|
+
'None' => 'Keiner',
|
|
5129
5130
|
'Uncoded lens' => 'Nicht kodiertes Objektiv',
|
|
5130
5131
|
},
|
|
5131
5132
|
},
|
|
@@ -11,7 +11,7 @@ package Image::ExifTool::Lang::fr;
|
|
|
11
11
|
use strict;
|
|
12
12
|
use vars qw($VERSION);
|
|
13
13
|
|
|
14
|
-
$VERSION = '1.
|
|
14
|
+
$VERSION = '1.37';
|
|
15
15
|
|
|
16
16
|
%Image::ExifTool::Lang::fr::Translate = (
|
|
17
17
|
'AEAperture' => 'Ouverture AE',
|
|
@@ -6607,6 +6607,7 @@ $VERSION = '1.36';
|
|
|
6607
6607
|
'LensType' => {
|
|
6608
6608
|
Description => 'Type d\'objectif',
|
|
6609
6609
|
PrintConv => {
|
|
6610
|
+
'None' => 'Aucun',
|
|
6610
6611
|
'n/a' => 'Non applicable',
|
|
6611
6612
|
'smc PENTAX-F 100-300mm F4.5-5.6 or Sigma Lens' => 'smc PENTAX-F 100-300mm F4.5-5.6 ou objectif Sigma',
|
|
6612
6613
|
'smc PENTAX-F 28-80mm F3.5-4.5 or Tokina Lens' => 'smc PENTAX-F 28-80mm F3.5-4.5 ou objectif Tokina',
|
|
@@ -11,7 +11,7 @@ use strict;
|
|
|
11
11
|
use vars qw($VERSION);
|
|
12
12
|
use Image::ExifTool;
|
|
13
13
|
|
|
14
|
-
$VERSION = '1.
|
|
14
|
+
$VERSION = '1.06';
|
|
15
15
|
|
|
16
16
|
sub ProcessLigoGPS($$$;$);
|
|
17
17
|
sub ProcessLigoJSON($$$);
|
|
@@ -223,11 +223,12 @@ sub DecipherLigoGPS($$$;$)
|
|
|
223
223
|
#------------------------------------------------------------------------------
|
|
224
224
|
# Parse decrypted/deciphered (but not defuzzed) LIGOGPSINFO record
|
|
225
225
|
# (record starts with 4-byte int32u counter followed by date/time, etc)
|
|
226
|
-
# Inputs: 0) ExifTool ref, 1) GPS string, 2) tag table ref,
|
|
226
|
+
# Inputs: 0) ExifTool ref, 1) GPS string, 2) tag table ref,
|
|
227
|
+
# 3) flags: 0x01=not fuzzed, 0x02=spd in km/h
|
|
227
228
|
# Returns: nothing
|
|
228
229
|
sub ParseLigoGPS($$$;$)
|
|
229
230
|
{
|
|
230
|
-
my ($et, $str, $tagTbl, $
|
|
231
|
+
my ($et, $str, $tagTbl, $flags) = @_;
|
|
231
232
|
|
|
232
233
|
# example string input
|
|
233
234
|
# "....2022/09/19 12:45:24 N:31.285065 W:124.759483 46.93 km/h x:-0.000 y:-0.000 z:-0.000"
|
|
@@ -235,15 +236,16 @@ sub ParseLigoGPS($$$;$)
|
|
|
235
236
|
$et->Warn('LIGOGPSINFO format error');
|
|
236
237
|
return;
|
|
237
238
|
}
|
|
239
|
+
$flags or $flags = 0;
|
|
238
240
|
my ($time,$latRef,$latNeg,$lat,$lonRef,$lonNeg,$lon,$spd) = ($1,$2,$3,$4,$5,$6,$7,$8);
|
|
239
241
|
my %gpsScl = ( 1 => 1.524855137, 2 => 1.456027985, 3 => 1.15368 );
|
|
240
|
-
my $spdScl = $
|
|
242
|
+
my $spdScl = $flags & 0x01 ? ($flags & 0x02 ? 1 : $knotsToKph) : 1.85407333;
|
|
241
243
|
$$et{DOC_NUM} = ++$$et{DOC_COUNT};
|
|
242
244
|
$time =~ tr(/)(:);
|
|
243
245
|
# convert from DDMM.MMMMMM to DD.DDDDDD if necessary
|
|
244
246
|
# (speed wasn't scaled in my 1 sample with this format)
|
|
245
247
|
$lat =~ /^\d{3}/ and Image::ExifTool::QuickTime::ConvertLatLon($lat,$lon), $spdScl = 1;
|
|
246
|
-
unless ($
|
|
248
|
+
unless ($flags & 0x01) { # unfuzz the coordinates if necessary
|
|
247
249
|
my $scl = $$et{OPTIONS}{LigoGPSScale} || $$et{LigoGPSScale} || 1;
|
|
248
250
|
$scl = $gpsScl{$scl} if $gpsScl{$scl};
|
|
249
251
|
($lat, $lon) = UnfuzzLigoGPS($lat, $lon, $scl);
|
|
@@ -298,7 +300,13 @@ sub ProcessLigoGPS($$$;$)
|
|
|
298
300
|
$et->VerboseDir($dirName);
|
|
299
301
|
for (; $pos + 0x84 <= length($$dataPt); $pos+=0x84) {
|
|
300
302
|
my $dat = substr($$dataPt, $pos, 0x84);
|
|
301
|
-
$dat =~ /^####/
|
|
303
|
+
unless ($dat =~ /^####/) {
|
|
304
|
+
next unless $dat =~ m(^.{4}\d{4}/\d{2}/\d{2} )s; # (have seen blank records filled with zeros, so keep trying)
|
|
305
|
+
# non-encrypted format written by Redtiger F9 4K
|
|
306
|
+
$dat =~ s/\0+$//; # remove trailing nulls
|
|
307
|
+
ParseLigoGPS($et, $dat, $tagTbl, 0x03);
|
|
308
|
+
next;
|
|
309
|
+
}
|
|
302
310
|
# decipher if we already know the encryption
|
|
303
311
|
$cipherInfo and $$cipherInfo{decipher} and DecipherLigoGPS($et, $dat, $tagTbl, $noFuzz) and next;
|
|
304
312
|
my $str = DecryptLigoGPS($dat);
|
|
@@ -65,7 +65,7 @@ use Image::ExifTool::Exif;
|
|
|
65
65
|
use Image::ExifTool::GPS;
|
|
66
66
|
use Image::ExifTool::XMP;
|
|
67
67
|
|
|
68
|
-
$VERSION = '4.
|
|
68
|
+
$VERSION = '4.48';
|
|
69
69
|
|
|
70
70
|
sub LensIDConv($$$);
|
|
71
71
|
sub ProcessNikonAVI($$$);
|
|
@@ -1691,14 +1691,15 @@ my %cropHiSpeed = ( #IB
|
|
|
1691
1691
|
4 => '3:2 Crop', # (1.2x, ref 36)
|
|
1692
1692
|
6 => '16:9 Crop',
|
|
1693
1693
|
8 => '2.7x Crop', #36 (D4/D500)
|
|
1694
|
-
9 => 'DX Movie Crop', # (DX during movie recording, Large)
|
|
1694
|
+
9 => 'DX Movie 16:9 Crop', # (DX during movie recording, Large)
|
|
1695
1695
|
10 => '1.3x Movie Crop', #36 (D4/D500)
|
|
1696
1696
|
11 => 'FX Uncropped',
|
|
1697
1697
|
12 => 'DX Uncropped',
|
|
1698
1698
|
13 => '2.8x Movie Crop', #28 (D5/D6) 5584/1936
|
|
1699
1699
|
14 => '1.4x Movie Crop', #28 (D5/D6) 5584/3856
|
|
1700
1700
|
15 => '1.5x Movie Crop', #36 (D4/D500) 5600/3872
|
|
1701
|
-
17 => '1:1 Crop',
|
|
1701
|
+
17 => 'FX 1:1 Crop',
|
|
1702
|
+
18 => 'DX 1:1 Crop',
|
|
1702
1703
|
OTHER => sub {
|
|
1703
1704
|
my ($val, $inv, $conv) = @_;
|
|
1704
1705
|
return undef if $inv;
|
|
@@ -5856,6 +5857,7 @@ my %nikonFocalConversions = (
|
|
|
5856
5857
|
46 => 'Nikkor Z 135mm f/1.8 S Plena', #28
|
|
5857
5858
|
47 => 'Nikkor Z 35mm f/1.2 S', #28
|
|
5858
5859
|
48 => 'Nikkor Z 28-400mm f/4-8 VR', #30
|
|
5860
|
+
49 => 'Nikkor Z 28-135mm f/4 PZ', #28
|
|
5859
5861
|
51 => 'Nikkor Z 35mm f/1.4', #28
|
|
5860
5862
|
52 => 'Nikkor Z 50mm f/1.4', #28
|
|
5861
5863
|
2305 => 'Laowa FFII 10mm F2.8 C&D Dreamer', #30
|
|
@@ -12791,7 +12793,7 @@ my %nikonFocalConversions = (
|
|
|
12791
12793
|
Name => 'UnknownInfo',
|
|
12792
12794
|
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::UnknownInfo' },
|
|
12793
12795
|
},
|
|
12794
|
-
# 0x200002d - int16u[3]: "512 0 0"
|
|
12796
|
+
# 0x200002d - int16u[3]: "512 0 0", "512 1 14", "512 3 10"
|
|
12795
12797
|
0x2000032 => {
|
|
12796
12798
|
Name => 'UnknownInfo2',
|
|
12797
12799
|
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::UnknownInfo2' },
|
|
@@ -12804,10 +12806,12 @@ my %nikonFocalConversions = (
|
|
|
12804
12806
|
# 0x200003f - rational64s[2]: "0 0"
|
|
12805
12807
|
# 0x2000042 - undef[6]: "0100\x03\0"
|
|
12806
12808
|
# 0x2000043 - undef[12]: all zeros
|
|
12809
|
+
# 0x200004d - undef[84]: "0100\0\0\0\0x020100\0\0\0\x010100\0\0\0\x05\0\0\..."
|
|
12807
12810
|
0x200004e => {
|
|
12808
12811
|
Name => 'NikonSettings',
|
|
12809
12812
|
SubDirectory => { TagTable => 'Image::ExifTool::NikonSettings::Main' },
|
|
12810
12813
|
},
|
|
12814
|
+
# 0x2000055 - undef[8]: "0100\x01\0\0\0"
|
|
12811
12815
|
0x2000083 => {
|
|
12812
12816
|
Name => 'LensType',
|
|
12813
12817
|
# credit to Tom Christiansen (ref 7) for figuring this out...
|
|
@@ -13011,7 +13015,11 @@ my %nikonFocalConversions = (
|
|
|
13011
13015
|
Condition => '$$valPt =~ /^040[012]/',
|
|
13012
13016
|
SubDirectory => { TagTable => 'Image::ExifTool::Nikon::AFInfo2V0400' },
|
|
13013
13017
|
}],
|
|
13014
|
-
# 0x20000c0 - undef[8]
|
|
13018
|
+
# 0x20000c0 - undef[8]:
|
|
13019
|
+
# 34 01 0c 00 90 01 0c 00
|
|
13020
|
+
# 34 01 0c 00 9c 01 0c 00
|
|
13021
|
+
# 3c 01 0c 00 9c 01 0c 00
|
|
13022
|
+
# 3c 01 0c 00 a8 01 0c 00
|
|
13015
13023
|
0x20000c3 => {
|
|
13016
13024
|
Name => 'BarometerInfo',
|
|
13017
13025
|
SubDirectory => {
|
|
@@ -40,7 +40,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
|
|
|
40
40
|
use Image::ExifTool::Exif;
|
|
41
41
|
use Image::ExifTool::APP12;
|
|
42
42
|
|
|
43
|
-
$VERSION = '2.
|
|
43
|
+
$VERSION = '2.87';
|
|
44
44
|
|
|
45
45
|
sub PrintLensInfo($$$);
|
|
46
46
|
|
|
@@ -447,6 +447,7 @@ my %olympusCameraTypes = (
|
|
|
447
447
|
S0101 => 'OM-5', #IB
|
|
448
448
|
S0121 => 'OM-1MarkII', #forum15652
|
|
449
449
|
S0123 => 'OM-3', #forum17208
|
|
450
|
+
S0130 => 'OM-5MarkII', #forum17465
|
|
450
451
|
SR45 => 'D220',
|
|
451
452
|
SR55 => 'D320L',
|
|
452
453
|
SR83 => 'D340L',
|
|
@@ -1439,7 +1439,7 @@ my %shootingMode = (
|
|
|
1439
1439
|
0xde => { #forum17299
|
|
1440
1440
|
Name => 'AFAreaSize',
|
|
1441
1441
|
Writable => 'rational64u',
|
|
1442
|
-
Notes => 'relative to size of image',
|
|
1442
|
+
Notes => 'relative to size of image. "n/a" for manual focus',
|
|
1443
1443
|
Count => 2,
|
|
1444
1444
|
PrintConv => '$val =~ /^4194303.999/ ? "n/a" : $val',
|
|
1445
1445
|
PrintConvInv => '$val eq "n/a" ? "4194303.999 4194303.999" : $val',
|