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.
Files changed (34) hide show
  1. package/bin/Changes +35 -0
  2. package/bin/META.json +2 -2
  3. package/bin/META.yml +2 -2
  4. package/bin/README +2 -2
  5. package/bin/exiftool +23 -12
  6. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +3 -3
  7. package/bin/lib/Image/ExifTool/Canon.pm +11 -4
  8. package/bin/lib/Image/ExifTool/Exif.pm +6 -3
  9. package/bin/lib/Image/ExifTool/FujiFilm.pm +3 -0
  10. package/bin/lib/Image/ExifTool/GoPro.pm +10 -3
  11. package/bin/lib/Image/ExifTool/LNK.pm +21 -3
  12. package/bin/lib/Image/ExifTool/Lang/de.pm +2 -1
  13. package/bin/lib/Image/ExifTool/Lang/fr.pm +2 -1
  14. package/bin/lib/Image/ExifTool/LigoGPS.pm +14 -6
  15. package/bin/lib/Image/ExifTool/Nikon.pm +13 -5
  16. package/bin/lib/Image/ExifTool/Olympus.pm +2 -1
  17. package/bin/lib/Image/ExifTool/PDF.pm +1 -0
  18. package/bin/lib/Image/ExifTool/Panasonic.pm +1 -1
  19. package/bin/lib/Image/ExifTool/Parrot.pm +1 -1
  20. package/bin/lib/Image/ExifTool/Pentax.pm +179 -52
  21. package/bin/lib/Image/ExifTool/Plot.pm +2 -3
  22. package/bin/lib/Image/ExifTool/QuickTime.pm +3 -2
  23. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +41 -17
  24. package/bin/lib/Image/ExifTool/Sigma.pm +19 -1
  25. package/bin/lib/Image/ExifTool/Sony.pm +2 -1
  26. package/bin/lib/Image/ExifTool/TagLookup.pm +3760 -3750
  27. package/bin/lib/Image/ExifTool/TagNames.pod +32 -9
  28. package/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
  29. package/bin/lib/Image/ExifTool/Writer.pl +134 -131
  30. package/bin/lib/Image/ExifTool/XMPStruct.pl +1 -1
  31. package/bin/lib/Image/ExifTool.pm +6 -4
  32. package/bin/perl-Image-ExifTool.spec +1 -1
  33. package/bin/windows_exiftool.txt +14 -11
  34. 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" : "2"
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.30",
53
+ "version" : "13.32",
54
54
  "x_serialization_backend" : "JSON::PP version 4.06"
55
55
  }
package/bin/META.yml CHANGED
@@ -31,5 +31,5 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.30'
35
- x_serialization_backend: 'JSON::PP version 4.06'
34
+ version: '13.32'
35
+ x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
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.30.tar.gz | tar -xf -
113
- cd Image-ExifTool-13.30
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.30';
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, but this may be changed (see
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.30 --
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>. Also, the API GeolocMinPop, GeolocFeature
6867
- and GeolocAltNames options apply to the B<-listgeo> output. Here are some
6868
- examples:
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 2.32
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://web.archive.org/web/20190624045241if_/http://www.cipa.jp:80/std/documents/e/DC-008-Translation-2019-E.pdf>
278
- for the official EXIF 2.32 specification.
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';
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 50mm F1.4 L VCM', #42
640
- '61182.62' => 'Canon RF 24mm F1.4 L VCM', #42
641
- '61182.63' => 'Canon RF 20mm F1.4 L VCM', #42
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.57';
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 the Canon EOS 7D',
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.12';
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
- last if $pos + $size > $dirEnd;
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.09';
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
- my $val;
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 => $raf->Tell() - $len,
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.37';
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.36';
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.05';
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, 3) not fuzzed
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, $noFuzz) = @_;
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 = $noFuzz ? $knotsToKph : 1.85407333;
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 ($noFuzz) { # unfuzz the coordinates if necessary
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 =~ /^####/ or next; # (have seen blank records filled with zeros, so keep trying)
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.46';
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.86';
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',
@@ -234,6 +234,7 @@ my %supportedFilter = (
234
234
  Kids => {
235
235
  SubDirectory => { TagTable => 'Image::ExifTool::PDF::Kids' },
236
236
  },
237
+ MediaBox => { Name => 'MediaBox', List => 1 },
237
238
  );
238
239
 
239
240
  # tags in PDF Perms dictionary
@@ -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',