exiftool-vendored.exe 12.34.0 → 12.38.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 (30) hide show
  1. package/bin/exiftool_files/Changes +61 -2
  2. package/bin/exiftool_files/README +2 -2
  3. package/bin/exiftool_files/exiftool.pl +63 -35
  4. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +6 -2
  5. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +143 -9
  6. package/bin/exiftool_files/lib/Image/ExifTool/CanonCustom.pm +12 -2
  7. package/bin/exiftool_files/lib/Image/ExifTool/DarwinCore.pm +2 -2
  8. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +13 -1
  9. package/bin/exiftool_files/lib/Image/ExifTool/FLIR.pm +33 -8
  10. package/bin/exiftool_files/lib/Image/ExifTool/GIF.pm +5 -1
  11. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +14 -10
  12. package/bin/exiftool_files/lib/Image/ExifTool/ICC_Profile.pm +3 -3
  13. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +108 -11
  14. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1203 -96
  15. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +5 -1
  16. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +135 -71
  17. package/bin/exiftool_files/lib/Image/ExifTool/OpenEXR.pm +4 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +1 -0
  19. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +14 -2
  20. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +26 -1
  21. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +3 -1
  22. package/bin/exiftool_files/lib/Image/ExifTool/TagInfoXML.pm +9 -4
  23. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +6363 -5846
  24. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +1215 -39
  25. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +10 -11
  26. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +10 -5
  27. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +110 -24
  28. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +1 -1
  29. package/bin/exiftool_files/lib/Image/ExifTool.pm +51 -12
  30. package/package.json +2 -2
@@ -7,11 +7,67 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.30. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Dec. 20, 2021 - Version 12.38
11
+
12
+ - Decode a number of new tags for the Nikon Z9 (thanks Warren Hatch)
13
+ - Patched incorrect decoding of AEBShotCount for the Canon EOS 90D
14
+ - Patched EXR reader to support long tag names
15
+ - Patched security issue (thanks Joe Lothan)
16
+ - Fixed an incorrect tag ID for a new Nikon MakerNote tag (github #108)
17
+ - Fixed XMP-exif:GPSMeasureMode conversions to match EXIF
18
+ - Fixed problem where some namespaces may be undeclared in the -X output when
19
+ using the -struct option
20
+
21
+ Dec. 8, 2021 - Version 12.37
22
+
23
+ - Decode timed GPS from Vantrue S1 dashcam MP4 videos
24
+ - Decode ColorData tags for the Canon EOS R3 (thanks LibRaw)
25
+ - Decode more makernotes tags for Nikon Z cameras (thanks Warren Hatch)
26
+ - Extract TransparentColor from GIF images
27
+ - Improved parsing of input time values for GPSTimeStamp to properly handle a
28
+ "." separator
29
+ - Improved warning when incorrectly using "
30
+
31
+ Nov. 16, 2021 - Version 12.36
32
+
33
+ - IMPORTANT: Fixed bug introduced in 12.35 which corrupted JPEG 2000 images
34
+ when removing all metadata with -all=
35
+ - Added feature to bypass processing of specified XMP namespaces and
36
+ properties (to improve performance in cases where the XMP suffers from
37
+ Adobe-editing bloat)
38
+ - Added a number of new XMP tags used by Lightroom 11.0
39
+ - Decode a number of new Nikon tags (thanks Warren Hatch)
40
+ - Made the Composite GPSPosition tag writable
41
+ - Fixed erroneous "Skipped unknown bytes after JPEG SOS" warning
42
+ - Fixed group for new writable Jpeg2000 color tags in -listx output
43
+ - Fixed problem finding files in Windows when using wildcards in file name and
44
+ a drive letter with no slash
45
+
46
+ Nov. 11, 2021 - Version 12.35
47
+
48
+ - Added ability to write ICC_Profile (and other color specifications) to
49
+ Jpeg2000 images
50
+ - Added %o code to -W option format string
51
+ - Added %f code to -d option for fractional seconds
52
+ - Added a couple of new Sony LensType values (thanks Jos Roost)
53
+ - Added a new CanonModelID (thanks Norbert Wasser)
54
+ - Added a new Nikon LensID
55
+ - Decode more Nikon MakerNotes tags for some new models (thanks Warren Hatch)
56
+ - Extract ThumbnailImage from some DJI drone videos
57
+ - Enhanced -ee option to extract metadata from all frames in a SEQ file
58
+ - Patched to avoid possible "Use of uninitialized value" runtime warning
59
+ - Fixed a couple of misspelt new ICC_Profile tag names (thanks Herb)
60
+ - Fixed problem generating the correct file extension when extracting
61
+ OriginalRawImage from a DNG file using the -W option with the %s format code
62
+ - Fixed bug introduced in 11.91 where exiftool couldn't find its libraries
63
+ when run via a soft link. Also changed to look for config file in the link
64
+ target directory instead of the directory of the link itself
65
+
10
66
  Oct. 27, 2021 - Version 12.34
11
67
 
12
68
  - Added support for ICC.2:2019 (Profile version 5.0.0 - iccMAX) color profiles
13
69
  - Added ability to detect/delete a Windows Zone.Identifier alternate data
14
- stream (ADS) via the new ZoneIdentifier tag
70
+ stream (ADS) via the new ZoneIdentifier tag (thanks Alex Xu)
15
71
  - Added support for the Sony ILCE-7M4 (thanks Jos Roost)
16
72
  - Added a new Sony lens (thanks LibRaw and Jos Roost)
17
73
  - Added a new SonyModelID (thanks LibRaw)
@@ -19,7 +75,7 @@ Oct. 27, 2021 - Version 12.34
19
75
  - Improved handling of some SVG files
20
76
  - Patched -overwrite_original_in_place option to open the output file in
21
77
  update mode rather than write mode (to allow some write optimizations on
22
- certain filesystems)
78
+ certain filesystems) (thanks Joel Low)
23
79
  - Fixed case of tag ID for new XMP-iptcExt:EventID (thanks Michael Steidl)
24
80
  - Fixed problem extracting ICC_Profile information from some PDF files
25
81
  - API Changes:
@@ -153,6 +209,8 @@ May 20, 2021 - Version 12.26 (production release)
153
209
  - Fixed problem which could cause a "Wide character" warning and generate a
154
210
  corrupted output file when writing some illegal values
155
211
 
212
+ History of older versions (back to Nov. 19, 2003 - Version 1.00) -->
213
+
156
214
  Apr. 22, 2021 - Version 12.25
157
215
 
158
216
  - JPEG XL support is now official
@@ -635,6 +693,7 @@ Mar. 19, 2020 - Version 11.92
635
693
 
636
694
  Mar. 5, 2020 - Version 11.91
637
695
 
696
+ - Added undocumented -xpath option for use by alternate Windows version
638
697
  - Decode a couple of new Panasonic tags
639
698
  - Documented -ec option (available since version 11.54)
640
699
  - Reverted -htmlDump fix of 11.90 because it broke more than it fixed, and
@@ -107,8 +107,8 @@ your home directory, then you would type the following commands in a
107
107
  terminal window to extract and run ExifTool:
108
108
 
109
109
  cd ~/Desktop
110
- gzip -dc Image-ExifTool-12.34.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.34
110
+ gzip -dc Image-ExifTool-12.38.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.38
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
@@ -10,15 +10,15 @@
10
10
  use strict;
11
11
  require 5.004;
12
12
 
13
- my $version = '12.34';
13
+ my $version = '12.38';
14
14
 
15
15
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
16
- my $exeDir;
16
+ my $exePath;
17
17
  BEGIN {
18
18
  # (undocumented -xpath option added in 11.91, must come before other options)
19
- $Image::ExifTool::exePath = @ARGV && lc($ARGV[0]) eq '-xpath' && shift() ? $^X : $0;
19
+ $exePath = @ARGV && lc($ARGV[0]) eq '-xpath' && shift() ? $^X : $0;
20
20
  # get exe directory
21
- $exeDir = ($Image::ExifTool::exePath =~ /(.*)[\\\/]/) ? $1 : '.';
21
+ $Image::ExifTool::exeDir = ($exePath =~ /(.*)[\\\/]/) ? $1 : '.';
22
22
  # (no link following for Windows exe version)
23
23
  # add lib directory at start of include path
24
24
  unshift @INC, ($0 =~ /(.*)[\\\/]/) ? "$1/lib" : './lib';
@@ -350,7 +350,7 @@ sub Cleanup() {
350
350
  #
351
351
 
352
352
  # add arguments embedded in filename (Windows .exe version only)
353
- if ($Image::ExifTool::exePath =~ /\(([^\\\/]+)\)(.exe|.pl)?$/i) {
353
+ if ($exePath =~ /\(([^\\\/]+)\)(.exe|.pl)?$/i) {
354
354
  my $argstr = $1;
355
355
  # divide into separate quoted or whitespace-delineated arguments
356
356
  my (@args, $arg, $quote);
@@ -773,7 +773,7 @@ for (;;) {
773
773
  }
774
774
  my $fp = ($stayOpen == 1 ? \*STAYOPEN : \*ARGFILE);
775
775
  unless ($mt->Open($fp, $argFile)) {
776
- unless ($argFile !~ /^\// and $mt->Open($fp, "$exeDir/$argFile")) {
776
+ unless ($argFile !~ /^\// and $mt->Open($fp, "$Image::ExifTool::exeDir/$argFile")) {
777
777
  Error "Error opening arg file $argFile\n";
778
778
  $badCmd = 1;
779
779
  next
@@ -1251,7 +1251,7 @@ for (;;) {
1251
1251
  $textOverwrite += 2 if $t2 =~ /\+/; # append
1252
1252
  if ($t1 ne 'W' and lc($t1) ne 'tagout') {
1253
1253
  undef $tagOut;
1254
- } elsif ($textOverwrite >= 2 and $textOut !~ /%[-+]?\d*[.:]?\d*[lu]?[tgs]/) {
1254
+ } elsif ($textOverwrite >= 2 and $textOut !~ /%[-+]?\d*[.:]?\d*[lu]?[tgso]/) {
1255
1255
  $tagOut = 0; # append tags to one file
1256
1256
  } else {
1257
1257
  $tagOut = 1; # separate file for each tag
@@ -1967,6 +1967,7 @@ sub GetImageInfo($$)
1967
1967
  } else {
1968
1968
  $pipe = qq{bzip2 -dc "$file" |};
1969
1969
  }
1970
+ $$et{TRUST_PIPE} = 1;
1970
1971
  }
1971
1972
  }
1972
1973
  # evaluate -if expression for conditional processing
@@ -2237,12 +2238,13 @@ sub GetImageInfo($$)
2237
2238
  next unless defined $forcePrint;
2238
2239
  $grp0 = $grp1 = 'Unknown';
2239
2240
  }
2241
+ # add groups from structure fields
2242
+ AddGroups($$info{$tag}, $grp0, \%groups, \@groups) if ref $$info{$tag};
2240
2243
  next if $groups{$grp1};
2241
2244
  # include family 0 and 1 groups in URI except for internal tags
2242
2245
  # (this will put internal tags in the "XML" group on readback)
2243
2246
  $groups{$grp1} = $grp0;
2244
2247
  push @groups, $grp1;
2245
- AddGroups($$info{$tag}, $grp0, \%groups, \@groups) if ref $$info{$tag};
2246
2248
  }
2247
2249
  foreach $grp1 (@groups) {
2248
2250
  my $grp = $groups{$grp1};
@@ -2365,7 +2367,8 @@ TAG: foreach $tag (@foundTags) {
2365
2367
  }
2366
2368
  my @groups = $et->GetGroup($tag);
2367
2369
  $outfile and close($fp), undef($tmpText); # (shouldn't happen)
2368
- ($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext);
2370
+ my $org = $et->GetValue('OriginalRawFileName') || $et->GetValue('OriginalFileName');
2371
+ ($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext, $org);
2369
2372
  $fp or ++$countBad, next TAG;
2370
2373
  $tmpText = $outfile unless $append;
2371
2374
  }
@@ -3464,18 +3467,26 @@ sub ConvertBinary($)
3464
3467
  }
3465
3468
 
3466
3469
  #------------------------------------------------------------------------------
3467
- # Compare two tag values to see if they are equal
3470
+ # Compare ValueConv and PrintConv values of a tag to see if they are equal
3468
3471
  # Inputs: 0) value1, 1) value2
3469
3472
  # Returns: true if they are equal
3470
3473
  sub IsEqual($$)
3471
3474
  {
3472
- return 1 if ref $_[0] eq 'SCALAR' or $_[0] eq $_[1];
3473
- return 0 if ref $_[0] ne 'ARRAY' or ref $_[1] ne 'ARRAY' or
3474
- @{$_[0]} ne @{$_[1]};
3475
- # test all elements of an array
3476
- my $i = 0;
3477
- for ($i=0; $i<scalar(@{$_[0]}); ++$i) {
3478
- return 0 if $_[0][$i] ne $_[1][$i];
3475
+ my ($a, $b) = @_;
3476
+ # (scalar values are not print-converted)
3477
+ return 1 if $a eq $b or ref $a eq 'SCALAR';
3478
+ if (ref $a eq 'HASH' and ref $b eq 'HASH') {
3479
+ return 0 if scalar(keys %$a) != scalar(keys %$b);
3480
+ my $key;
3481
+ foreach $key (keys %$a) {
3482
+ return 0 unless IsEqual($$a{$key}, $$b{$key});
3483
+ }
3484
+ } else {
3485
+ return 0 if ref $a ne 'ARRAY' or ref $b ne 'ARRAY' or @$a != @$b;
3486
+ my $i;
3487
+ for ($i=0; $i<scalar(@$a); ++$i) {
3488
+ return 0 unless IsEqual($$a[$i], $$b[$i]);
3489
+ }
3479
3490
  }
3480
3491
  return 1;
3481
3492
  }
@@ -3803,7 +3814,7 @@ sub FindFileWindows($$)
3803
3814
  my $enc = $et->Options('CharsetFileName');
3804
3815
  $wildfile = $et->Decode($wildfile, $enc, undef, 'UTF8') if $enc and $enc ne 'UTF8';
3805
3816
  $wildfile =~ tr/\\/\//; # use forward slashes
3806
- my ($dir, $wildname) = ($wildfile =~ m{(.*/)(.*)}) ? ($1, $2) : ('', $wildfile);
3817
+ my ($dir, $wildname) = ($wildfile =~ m{(.*[:/])(.*)}) ? ($1, $2) : ('', $wildfile);
3807
3818
  if ($dir =~ /[*?]/) {
3808
3819
  Warn "Wildcards don't work in the directory specification\n";
3809
3820
  return ();
@@ -3943,7 +3954,7 @@ sub SuggestedExtension($$$)
3943
3954
  $ext = 'xml';
3944
3955
  } elsif ($$valPt =~ /^RIFF....WAVE/s) {
3945
3956
  $ext = 'wav';
3946
- } elsif ($tag eq 'OriginalRawFileData' and defined($ext = $et->GetValue('OriginalRawFileName'))) {
3957
+ } elsif ($tag eq 'OriginalRawImage' and defined($ext = $et->GetValue('OriginalRawFileName'))) {
3947
3958
  $ext =~ s/^.*\.//s;
3948
3959
  $ext = $ext ? lc($ext) : 'raw';
3949
3960
  } elsif ($tag eq 'EXIF') {
@@ -3995,14 +4006,15 @@ sub LoadPrintFormat($)
3995
4006
  # A sort of sprintf for filenames
3996
4007
  # Inputs: 0) format string (%d=dir, %f=file name, %e=ext),
3997
4008
  # 1) source filename or undef to test format string
3998
- # 2-4) [%t %g %s only] tag name, ref to array of group names, suggested extension
4009
+ # 2-4) [%t %g %s %o only] tag name, ref to array of group names,
4010
+ # suggested extension, original raw file name
3999
4011
  # Returns: new filename or undef on error (or if no file and fmt contains token)
4000
4012
  sub FilenameSPrintf($;$@)
4001
4013
  {
4002
4014
  my ($fmt, $file, @extra) = @_;
4003
4015
  local $_;
4004
4016
  # return format string straight away if no tokens
4005
- return $fmt unless $fmt =~ /%[-+]?\d*[.:]?\d*[lu]?[dDfFeEtgs]/;
4017
+ return $fmt unless $fmt =~ /%[-+]?\d*[.:]?\d*[lu]?[dDfFeEtgso]/;
4006
4018
  return undef unless defined $file;
4007
4019
  CleanFilename($file); # make sure we are using forward slashes
4008
4020
  # split filename into directory, file, extension
@@ -4016,9 +4028,9 @@ sub FilenameSPrintf($;$@)
4016
4028
  }
4017
4029
  $part{F} = $part{f} . $part{E};
4018
4030
  ($part{D} = $part{d}) =~ s{/+$}{};
4019
- @part{qw(t g s)} = @extra;
4031
+ @part{qw(t g s o)} = @extra;
4020
4032
  my ($filename, $pos) = ('', 0);
4021
- while ($fmt =~ /(%([-+]?)(\d*)([.:]?)(\d*)([lu]?)([dDfFeEtgs]))/g) {
4033
+ while ($fmt =~ /(%([-+]?)(\d*)([.:]?)(\d*)([lu]?)([dDfFeEtgso]))/g) {
4022
4034
  $filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1));
4023
4035
  $pos = pos($fmt);
4024
4036
  my ($sign, $wid, $dot, $skip, $mod, $code) = ($2, $3, $4, $5 || 0, $6, $7);
@@ -4181,7 +4193,7 @@ sub OpenOutputFile($;@)
4181
4193
  if ($textOut) {
4182
4194
  $outfile = $file;
4183
4195
  CleanFilename($outfile);
4184
- if ($textOut =~ /%[-+]?\d*[.:]?\d*[lun]?[dDfFeEtgscC]/ or defined $tagOut) {
4196
+ if ($textOut =~ /%[-+]?\d*[.:]?\d*[lun]?[dDfFeEtgsocC]/ or defined $tagOut) {
4185
4197
  # make filename from printf-like $textOut
4186
4198
  $outfile = FilenameSPrintf($textOut, $file, @args);
4187
4199
  return () unless defined $outfile;
@@ -4726,6 +4738,15 @@ OPTIONS
4726
4738
  4 below). Instead, individual tags may be recovered using the
4727
4739
  -tagsFromFile option (eg. "-all= -tagsfromfile @ -artist").
4728
4740
 
4741
+ To speed processing when reading XMP, exclusions in XMP groups also
4742
+ bypass processing of the corresponding XMP property and any
4743
+ contained properties. For example, "--xmp-crs:all" may speed
4744
+ processing significantly in cases where a large number of XMP-crs
4745
+ tags exist. To use this feature to bypass processing of a specific
4746
+ XMP property, the property name must be used instead of the
4747
+ ExifTool tag name (eg. "--xmp-crs:dabs"). Also, "XMP-all" may be
4748
+ used to to indicate any XMP namespace (eg. <C--xmp-all:dabs>).
4749
+
4729
4750
  -*TAG*[+-^]=[*VALUE*]
4730
4751
  Write a new value for the specified tag (eg. "-comment=wow"), or
4731
4752
  delete the tag if no *VALUE* is given (eg. "-comment="). "+=" and
@@ -4736,7 +4757,8 @@ OPTIONS
4736
4757
  may be used to conditionally delete or replace a tag (see "WRITING
4737
4758
  EXAMPLES" for examples). "^=" is used to write an empty string
4738
4759
  instead of deleting the tag when no *VALUE* is given, but otherwise
4739
- it is equivalent to "=".
4760
+ it is equivalent to "=", but note that the caret must be quoted on
4761
+ the Windows command line.
4740
4762
 
4741
4763
  *TAG* may contain one or more leading family 0, 1, 2 or 7 group
4742
4764
  names, prefixed by optional family numbers, and separated colons.
@@ -5192,7 +5214,10 @@ OPTIONS
5192
5214
  "strftime" man page on your system for details. The default format
5193
5215
  is equivalent to "%Y:%m:%d %H:%M:%S". This option has no effect on
5194
5216
  date-only or time-only tags and ignores timezone information if
5195
- present. Only one -d option may be used per command. Requires
5217
+ present. ExifTool adds a %f format code to represent fractional
5218
+ seconds, and supports an optional width to specify the number of
5219
+ digits after the decimal point (eg. %3f would give something like
5220
+ .437). Only one -d option may be used per command. Requires
5196
5221
  POSIX::strptime or Time::Piece for the inversion conversion when
5197
5222
  writing.
5198
5223
 
@@ -5421,7 +5446,8 @@ OPTIONS
5421
5446
  beginning with "#" are output for each processed file. Lines
5422
5447
  beginning with "#[IF]" are not output, but all BODY lines are
5423
5448
  skipped if any tag on an IF line doesn't exist. Other lines
5424
- beginning with "#" are ignored. For example, this format file:
5449
+ beginning with "#" are ignored. (To output a line beginning with
5450
+ "#", use "#[BODY]#".) For example, this format file:
5425
5451
 
5426
5452
  # this is a comment line
5427
5453
  #[HEAD]-- Generated by ExifTool $exifToolVersion --
@@ -5435,7 +5461,7 @@ OPTIONS
5435
5461
 
5436
5462
  produces output like this:
5437
5463
 
5438
- -- Generated by ExifTool 12.34 --
5464
+ -- Generated by ExifTool 12.38 --
5439
5465
  File: a.jpg - 2003:10:31 15:44:19
5440
5466
  (f/5.6, 1/60s, ISO 100)
5441
5467
  File: b.jpg - 2006:05:23 11:57:38
@@ -5692,13 +5718,15 @@ OPTIONS
5692
5718
 
5693
5719
  1) With -W, a new output file is created for each extracted tag.
5694
5720
 
5695
- 2) -W supports three additional format codes: %t, %g and %s
5721
+ 2) -W supports four additional format codes: %t, %g and %s
5696
5722
  represent the tag name, group name, and suggested extension for the
5697
- output file (based on the format of the data). The %g code may be
5698
- followed by a single digit to specify the group family number (eg.
5699
- %g1), otherwise family 0 is assumed. The substring
5700
- width/position/case specifiers may be used with these format codes
5701
- in exactly the same way as with %f and %e.
5723
+ output file (based on the format of the data), and %o represents
5724
+ the value of the OriginalRawFileName or OriginalFileName tag from
5725
+ the input file (including extension). The %g code may be followed
5726
+ by a single digit to specify the group family number (eg. %g1),
5727
+ otherwise family 0 is assumed. The substring width/position/case
5728
+ specifiers may be used with these format codes in exactly the same
5729
+ way as with %f and %e.
5702
5730
 
5703
5731
  3) The argument for -W is interpreted as a file name if it contains
5704
5732
  no format codes. (For -w, this would be a file extension.) This
@@ -5720,7 +5748,7 @@ OPTIONS
5720
5748
  file names to the console instead of giving a verbose dump of the
5721
5749
  entire file. (Unless appending all output to one file for each
5722
5750
  source file by using -W+ with an output file *FMT* that does not
5723
- contain %t, $g or %s.)
5751
+ contain %t, %g, %s or %o.)
5724
5752
 
5725
5753
  5) Individual list items are stored in separate files when -W is
5726
5754
  combined with -b, but note that for separate files to be created %c
@@ -35,7 +35,7 @@ use Image::ExifTool::Sony;
35
35
  use Image::ExifTool::Validate;
36
36
  use Image::ExifTool::MacOS;
37
37
 
38
- $VERSION = '3.46';
38
+ $VERSION = '3.47';
39
39
  @ISA = qw(Exporter);
40
40
 
41
41
  sub NumbersFirst($$);
@@ -757,7 +757,7 @@ sub new
757
757
  my (%tagNameInfo, %id, %longID, %longName, %shortName, %tableNum,
758
758
  %tagLookup, %tagExists, %noLookup, %tableWritable, %sepTable, %case,
759
759
  %structs, %compositeModules, %isPlugin, %flattened, %structLookup,
760
- @writePseudo);
760
+ @writePseudo, %dupXmpTag);
761
761
  $self->{TAG_NAME_INFO} = \%tagNameInfo;
762
762
  $self->{ID_LOOKUP} = \%id;
763
763
  $self->{LONG_ID} = \%longID;
@@ -905,6 +905,10 @@ TagID: foreach $tagID (@keys) {
905
905
  foreach (@grps) {
906
906
  warn "Group name starts with 'ID-' for $short $name\n" if /^ID-/i;
907
907
  }
908
+ if ($isXMP and not $$tagInfo{Avoid} and not $$tagInfo{Struct}) {
909
+ $dupXmpTag{$name} and warn "Duplicate XMP tag $name\n";
910
+ $dupXmpTag{$name} = 1;
911
+ }
908
912
  # validate Name (must not start with a digit or else XML output will not be valid;
909
913
  # must not start with a dash or exiftool command line may get confused)
910
914
  if ($name !~ /^[_A-Za-z][-\w]+$/ and
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.53';
91
+ $VERSION = '4.55';
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)
@@ -954,6 +954,7 @@ $VERSION = '4.53';
954
954
  0x80000435 => 'EOS Rebel T8i / 850D / X10i', #JR/PH
955
955
  0x80000436 => 'EOS SL3 / 250D / Kiss X10', #25
956
956
  0x80000437 => 'EOS 90D', #IB
957
+ 0x80000450 => 'EOS R3', #42
957
958
  0x80000453 => 'EOS R6', #PH
958
959
  0x80000467 => 'PowerShot ZOOM',
959
960
  0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
@@ -1918,6 +1919,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
1918
1919
  Name => 'ColorData10',
1919
1920
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData10' },
1920
1921
  },
1922
+ { # (int16u[3973]) - R3 ref IB
1923
+ Condition => '$count == 3973',
1924
+ Name => 'ColorData11',
1925
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorData11' },
1926
+ },
1921
1927
  {
1922
1928
  Name => 'ColorDataUnknown',
1923
1929
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorDataUnknown' },
@@ -7719,7 +7725,10 @@ my %ciMaxFocal = (
7719
7725
  # Color data (MakerNotes tag 0x4001, count=1312,1313,1316) (ref PH)
7720
7726
  %Image::ExifTool::Canon::ColorData7 = (
7721
7727
  %binaryDataAttrs,
7722
- NOTES => 'These tags are used by the EOS 1DX, 5DmkIII, 6D, 100D, 650D, 700D, M and 7DmkII.',
7728
+ NOTES => q{
7729
+ These tags are used by the EOS 1DX, 5DmkIII, 6D, 7DmkII, 100D, 650D, 700D,
7730
+ 8000D, M and M2.
7731
+ },
7723
7732
  FORMAT => 'int16s',
7724
7733
  FIRST_ENTRY => 0,
7725
7734
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -7730,8 +7739,8 @@ my %ciMaxFocal = (
7730
7739
  DataMember => 'ColorDataVersion',
7731
7740
  RawConv => '$$self{ColorDataVersion} = $val',
7732
7741
  PrintConv => {
7733
- 10 => '10 (1DX/5DmkIII/6D/70D/100D/650D/700D/M)',
7734
- 11 => '11 (7DmkII/750D/760D)',
7742
+ 10 => '10 (1DX/5DmkIII/6D/70D/100D/650D/700D/M/M2)',
7743
+ 11 => '11 (7DmkII/750D/760D/8000D)',
7735
7744
  },
7736
7745
  },
7737
7746
  # not really sure about the AsShot, Auto and Measured values any more - PH
@@ -7866,6 +7875,10 @@ my %ciMaxFocal = (
7866
7875
  # Color data (MakerNotes tag 0x4001, count=1560,etc) (ref IB)
7867
7876
  %Image::ExifTool::Canon::ColorData8 = (
7868
7877
  %binaryDataAttrs,
7878
+ NOTES => q{
7879
+ These tags are used by the EOS 1DXmkII, 5DS, 5DSR, 5DmkIV, 6DmkII, 77D, 80D,
7880
+ 200D, 800D, 1300D, 2000D, 4000D and 9000D.
7881
+ },
7869
7882
  FORMAT => 'int16s',
7870
7883
  FIRST_ENTRY => 0,
7871
7884
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -7876,10 +7889,10 @@ my %ciMaxFocal = (
7876
7889
  DataMember => 'ColorDataVersion',
7877
7890
  RawConv => '$$self{ColorDataVersion} = $val',
7878
7891
  PrintConv => {
7879
- 12 => '12 (5DS/5DSR)',
7880
- 13 => '13 (80D)', #PH
7892
+ 12 => '12 (1DXmkII/5DS/5DSR)',
7893
+ 13 => '13 (80D/5DmkIV)', #PH
7881
7894
  14 => '14 (1300D/2000D/4000D)', #IB
7882
- 15 => '15 (6DmkII/77D/200D/800D)', #IB
7895
+ 15 => '15 (6DmkII/77D/200D/800D,9000D)', #IB
7883
7896
  },
7884
7897
  },
7885
7898
  0x3f => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
@@ -8026,6 +8039,7 @@ my %ciMaxFocal = (
8026
8039
  # Color data (MakerNotes tag 0x4001, count=1820,etc) (ref PH)
8027
8040
  %Image::ExifTool::Canon::ColorData9 = (
8028
8041
  %binaryDataAttrs,
8042
+ NOTES => 'These tags are used by the M6mkII, M50, M200, EOS R, RP, 90D, 250D and 850D',
8029
8043
  FORMAT => 'int16s',
8030
8044
  FIRST_ENTRY => 0,
8031
8045
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -8038,8 +8052,8 @@ my %ciMaxFocal = (
8038
8052
  PrintConv => {
8039
8053
  16 => '16 (M50)',
8040
8054
  17 => '17 (EOS R)', # (and PowerShot SX740HS)
8041
- 18 => '18 (EOS RP)', # (and PowerShot SX70HS)
8042
- 19 => '19 (90D/M6mkII/M200)',# (and PowerShot G7XmkIII)
8055
+ 18 => '18 (EOS RP/250D)', # (and PowerShot SX70HS)
8056
+ 19 => '19 (90D/850D/M6mkII/M200)',# (and PowerShot G7XmkIII)
8043
8057
  },
8044
8058
  },
8045
8059
  0x47 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
@@ -8150,6 +8164,7 @@ my %ciMaxFocal = (
8150
8164
  # (same as ColorData9 but shifted up by 0x0e, ref PH)
8151
8165
  %Image::ExifTool::Canon::ColorData10 = (
8152
8166
  %binaryDataAttrs,
8167
+ NOTES => 'These tags are used by the R5, R5 and EOS 1DXmkIII.',
8153
8168
  FORMAT => 'int16s',
8154
8169
  FIRST_ENTRY => 0,
8155
8170
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
@@ -8268,6 +8283,125 @@ my %ciMaxFocal = (
8268
8283
  },
8269
8284
  );
8270
8285
 
8286
+ # Color data (MakerNotes tag 0x4001, count=3973, ref IB)
8287
+ %Image::ExifTool::Canon::ColorData11 = (
8288
+ %binaryDataAttrs,
8289
+ NOTES => 'These tags are used by the EOS R3',
8290
+ FORMAT => 'int16s',
8291
+ FIRST_ENTRY => 0,
8292
+ GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
8293
+ DATAMEMBER => [ 0 ],
8294
+ IS_SUBDIR => [ 0x12c ],
8295
+ 0x00 => {
8296
+ Name => 'ColorDataVersion',
8297
+ DataMember => 'ColorDataVersion',
8298
+ RawConv => '$$self{ColorDataVersion} = $val',
8299
+ PrintConv => {
8300
+ 34 => '34 (R3)', #IB
8301
+ },
8302
+ },
8303
+ 0x69 => { Name => 'WB_RGGBLevelsAsShot', Format => 'int16s[4]' },
8304
+ 0x6d => 'ColorTempAsShot',
8305
+ 0x6e => { Name => 'WB_RGGBLevelsAuto', Format => 'int16s[4]' },
8306
+ 0x72 => 'ColorTempAuto',
8307
+ 0x73 => { Name => 'WB_RGGBLevelsMeasured', Format => 'int16s[4]' },
8308
+ 0x77 => 'ColorTempMeasured',
8309
+ 0x78 => { Name => 'WB_RGGBLevelsUnknown', Format => 'int16s[4]', Unknown => 1 },
8310
+ 0x7c => { Name => 'ColorTempUnknown', Unknown => 1 },
8311
+ 0x7d => { Name => 'WB_RGGBLevelsUnknown2', Format => 'int16s[4]', Unknown => 1 },
8312
+ 0x81 => { Name => 'ColorTempUnknown2', Unknown => 1 },
8313
+ 0x82 => { Name => 'WB_RGGBLevelsUnknown3', Format => 'int16s[4]', Unknown => 1 },
8314
+ 0x86 => { Name => 'ColorTempUnknown3', Unknown => 1 },
8315
+ 0x87 => { Name => 'WB_RGGBLevelsUnknown4', Format => 'int16s[4]', Unknown => 1 },
8316
+ 0x8b => { Name => 'ColorTempUnknown4', Unknown => 1 },
8317
+ 0x8c => { Name => 'WB_RGGBLevelsUnknown5', Format => 'int16s[4]', Unknown => 1 },
8318
+ 0x90 => { Name => 'ColorTempUnknown5', Unknown => 1 },
8319
+ 0x91 => { Name => 'WB_RGGBLevelsUnknown6', Format => 'int16s[4]', Unknown => 1 },
8320
+ 0x95 => { Name => 'ColorTempUnknown6', Unknown => 1 },
8321
+ 0x96 => { Name => 'WB_RGGBLevelsUnknown7', Format => 'int16s[4]', Unknown => 1 },
8322
+ 0x9a => { Name => 'ColorTempUnknown7', Unknown => 1 },
8323
+ 0x9b => { Name => 'WB_RGGBLevelsUnknown8', Format => 'int16s[4]', Unknown => 1 },
8324
+ 0x9f => { Name => 'ColorTempUnknown8', Unknown => 1 },
8325
+ 0xa0 => { Name => 'WB_RGGBLevelsUnknown9', Format => 'int16s[4]', Unknown => 1 },
8326
+ 0xa4 => { Name => 'ColorTempUnknown9', Unknown => 1 },
8327
+ 0xa5 => { Name => 'WB_RGGBLevelsUnknown10', Format => 'int16s[4]', Unknown => 1 },
8328
+ 0xa9 => { Name => 'ColorTempUnknown10', Unknown => 1 },
8329
+ 0xaa => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 },
8330
+ 0xae => { Name => 'ColorTempUnknown11', Unknown => 1 },
8331
+ 0xaf => { Name => 'WB_RGGBLevelsUnknown11', Format => 'int16s[4]', Unknown => 1 },
8332
+ 0xb3 => { Name => 'ColorTempUnknown11', Unknown => 1 },
8333
+ 0xb4 => { Name => 'WB_RGGBLevelsUnknown12', Format => 'int16s[4]', Unknown => 1 },
8334
+ 0xb8 => { Name => 'ColorTempUnknown12', Unknown => 1 },
8335
+ 0xb9 => { Name => 'WB_RGGBLevelsUnknown13', Format => 'int16s[4]', Unknown => 1 },
8336
+ 0xbd => { Name => 'ColorTempUnknown13', Unknown => 1 },
8337
+ 0xbe => { Name => 'WB_RGGBLevelsUnknown14', Format => 'int16s[4]', Unknown => 1 },
8338
+ 0xc2 => { Name => 'ColorTempUnknown14', Unknown => 1 },
8339
+ 0xc3 => { Name => 'WB_RGGBLevelsUnknown15', Format => 'int16s[4]', Unknown => 1 },
8340
+ 0xc7 => { Name => 'ColorTempUnknown15', Unknown => 1 },
8341
+ 0xc8 => { Name => 'WB_RGGBLevelsUnknown16', Format => 'int16s[4]', Unknown => 1 },
8342
+ 0xcc => { Name => 'ColorTempUnknown16', Unknown => 1 },
8343
+ 0xcd => { Name => 'WB_RGGBLevelsDaylight', Format => 'int16s[4]' },
8344
+ 0xd1 => 'ColorTempDaylight',
8345
+ 0xd2 => { Name => 'WB_RGGBLevelsShade', Format => 'int16s[4]' },
8346
+ 0xd6 => 'ColorTempShade',
8347
+ 0xd7 => { Name => 'WB_RGGBLevelsCloudy', Format => 'int16s[4]' },
8348
+ 0xdb => 'ColorTempCloudy',
8349
+ 0xdc => { Name => 'WB_RGGBLevelsTungsten', Format => 'int16s[4]' },
8350
+ 0xe0 => 'ColorTempTungsten',
8351
+ 0xe1 => { Name => 'WB_RGGBLevelsFluorescent',Format => 'int16s[4]' },
8352
+ 0xe5 => 'ColorTempFluorescent',
8353
+ 0xe6 => { Name => 'WB_RGGBLevelsKelvin', Format => 'int16s[4]' },
8354
+ 0xea => 'ColorTempKelvin',
8355
+ 0xeb => { Name => 'WB_RGGBLevelsFlash', Format => 'int16s[4]' },
8356
+ 0xef => 'ColorTempFlash',
8357
+ 0xf0 => { Name => 'WB_RGGBLevelsUnknown17', Format => 'int16s[4]', Unknown => 1 },
8358
+ 0xf4 => { Name => 'ColorTempUnknown17', Unknown => 1 },
8359
+ 0xf5 => { Name => 'WB_RGGBLevelsUnknown18', Format => 'int16s[4]', Unknown => 1 },
8360
+ 0xf9 => { Name => 'ColorTempUnknown18', Unknown => 1 },
8361
+ 0xfa => { Name => 'WB_RGGBLevelsUnknown19', Format => 'int16s[4]', Unknown => 1 },
8362
+ 0xfe => { Name => 'ColorTempUnknown19', Unknown => 1 },
8363
+ 0xff => { Name => 'WB_RGGBLevelsUnknown20', Format => 'int16s[4]', Unknown => 1 },
8364
+ 0x103 => { Name => 'ColorTempUnknown20', Unknown => 1 },
8365
+ 0x104 => { Name => 'WB_RGGBLevelsUnknown21', Format => 'int16s[4]', Unknown => 1 },
8366
+ 0x108 => { Name => 'ColorTempUnknown21', Unknown => 1 },
8367
+ 0x109 => { Name => 'WB_RGGBLevelsUnknown22', Format => 'int16s[4]', Unknown => 1 },
8368
+ 0x10d => { Name => 'ColorTempUnknown22', Unknown => 1 },
8369
+ 0x10e => { Name => 'WB_RGGBLevelsUnknown23', Format => 'int16s[4]', Unknown => 1 },
8370
+ 0x112 => { Name => 'ColorTempUnknown23', Unknown => 1 },
8371
+ 0x113 => { Name => 'WB_RGGBLevelsUnknown24', Format => 'int16s[4]', Unknown => 1 },
8372
+ 0x117 => { Name => 'ColorTempUnknown24', Unknown => 1 },
8373
+ 0x118 => { Name => 'WB_RGGBLevelsUnknown25', Format => 'int16s[4]', Unknown => 1 },
8374
+ 0x11c => { Name => 'ColorTempUnknown25', Unknown => 1 },
8375
+ 0x11d => { Name => 'WB_RGGBLevelsUnknown26', Format => 'int16s[4]', Unknown => 1 },
8376
+ 0x121 => { Name => 'ColorTempUnknown26', Unknown => 1 },
8377
+ 0x122 => { Name => 'WB_RGGBLevelsUnknown27', Format => 'int16s[4]', Unknown => 1 },
8378
+ 0x126 => { Name => 'ColorTempUnknown27', Unknown => 1 },
8379
+ 0x12c => {
8380
+ Name => 'ColorCalib',
8381
+ Format => 'undef[120]',
8382
+ Unknown => 1,
8383
+ SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
8384
+ },
8385
+ 0x16b => {
8386
+ Name => 'PerChannelBlackLevel',
8387
+ Format => 'int16u[4]',
8388
+ },
8389
+ # 0x27c - PerChannelBlackLevel again
8390
+ 0x280 => {
8391
+ Name => 'NormalWhiteLevel',
8392
+ Format => 'int16u',
8393
+ RawConv => '$val || undef',
8394
+ },
8395
+ 0x281 => {
8396
+ Name => 'SpecularWhiteLevel',
8397
+ Format => 'int16u',
8398
+ },
8399
+ 0x282 => {
8400
+ Name => 'LinearityUpperMargin',
8401
+ Format => 'int16u',
8402
+ },
8403
+ );
8404
+
8271
8405
  # Unknown color data (MakerNotes tag 0x4001)
8272
8406
  %Image::ExifTool::Canon::ColorDataUnknown = (
8273
8407
  PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
@@ -1290,9 +1290,19 @@ my %convPFn = ( PrintConv => \&ConvertPfn, PrintConvInv => \&ConvertPfnInv );
1290
1290
  },
1291
1291
  },
1292
1292
  0x0106 => [{
1293
+ Name => 'AEBShotCount',
1294
+ Condition => '$$self{Model} =~ /\b90D\b/',
1295
+ Notes => 'EOS 90D', # (and who knows what others?)
1296
+ PrintConv => {
1297
+ 2 => '2 shots',
1298
+ 3 => '3 shots',
1299
+ 5 => '5 shots',
1300
+ 7 => '7 shots',
1301
+ },
1302
+ },{
1293
1303
  Name => 'AEBShotCount',
1294
1304
  Condition => '$count == 1',
1295
- Notes => 'one value for some models...',
1305
+ Notes => 'other models storing a single value',
1296
1306
  PrintConv => {
1297
1307
  0 => '3 shots',
1298
1308
  1 => '2 shots',
@@ -1302,7 +1312,7 @@ my %convPFn = ( PrintConv => \&ConvertPfn, PrintConvInv => \&ConvertPfnInv );
1302
1312
  },{
1303
1313
  Name => 'AEBShotCount',
1304
1314
  Count => 2,
1305
- Notes => 'two values for others',
1315
+ Notes => 'models storing two values',
1306
1316
  PrintConv => {
1307
1317
  '3 0' => '3 shots',
1308
1318
  '2 1' => '2 shots',