exiftool_vendored 12.34.0 → 12.38.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab3c45f9ea8ba8771084a357dc9e5b8deb7eef973b4edee129f974899a412bf2
4
- data.tar.gz: 12d0a164cf31c3283809dae4e5cccd9bb8b7e667216fe6b1f104c0247da3b62d
3
+ metadata.gz: 11f1787f2c127a865c214cd1180708242a072c13219978b737518a30ff123c88
4
+ data.tar.gz: 85f5ca776ddb9b2c60171ef608fe574a5eb94a5b723c5ab62ed50046b4f051d8
5
5
  SHA512:
6
- metadata.gz: 57a16498bc569f83ec79e0ca6179b073ebe2b8c468ba93c397d44f90259d28a37390a1a2b06770b4ffc8c36c7e63abfa055e82771b6cddfac3f6e1de78c7f3b9
7
- data.tar.gz: 7eec435a6bd1a16cf49aa3324a0633cec6a319e9358ff5277c6601b509b9c967636092137237cfa9c265b28b0fd7209719f4b90432b8761c25d47d626b5f679d
6
+ metadata.gz: 526d5db616ff1f9b5f42fece2a56b670810b0a0865ebf7161ac55f5567dab893f137fef4226475776280b17272a8fde9689c06c3057517f417e5accaa925b39c
7
+ data.tar.gz: 2345cf3345e75e7fbace25c2293ffecdc503c5b744c85b794febccc24322aac3a8c2f052d07dd50b921cceca67ad9c197c5e4ce87eccea4efeb99ab200919f41
data/bin/Changes CHANGED
@@ -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
data/bin/META.json CHANGED
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.34"
50
+ "version" : "12.38"
51
51
  }
data/bin/META.yml CHANGED
@@ -28,4 +28,4 @@ recommends:
28
28
  Time::HiRes: 0
29
29
  requires:
30
30
  perl: 5.004
31
- version: 12.34
31
+ version: 12.38
data/bin/README CHANGED
@@ -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.
data/bin/exiftool CHANGED
@@ -10,24 +10,26 @@
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;
17
16
  BEGIN {
18
17
  # (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;
18
+ my $exePath = @ARGV && lc($ARGV[0]) eq '-xpath' && shift() ? $^X : $0;
20
19
  # get exe directory
21
- $exeDir = ($Image::ExifTool::exePath =~ /(.*)[\\\/]/) ? $1 : '.';
20
+ my $exeDir = ($exePath =~ /(.*)[\\\/]/) ? $1 : '.';
21
+ my $incDir = ($0 =~ /(.*)[\\\/]/) ? "$1/lib" : './lib';
22
22
  if (-l $0) {
23
23
  my $lnk = eval { readlink $0 };
24
24
  if (defined $lnk) {
25
25
  my $lnkDir = ($lnk =~ /(.*)[\\\/]/) ? $1 : '.';
26
26
  $exeDir = (($lnk =~ m(^/)) ? '' : $exeDir . '/') . $lnkDir;
27
+ $incDir = "$exeDir/lib";
27
28
  }
28
29
  }
30
+ $Image::ExifTool::exeDir = $exeDir; # use our exeDir for loading config file
29
31
  # add lib directory at start of include path
30
- unshift @INC, ($0 =~ /(.*)[\\\/]/) ? "$1/lib" : './lib';
32
+ unshift @INC, $incDir;
31
33
  # load or disable config file if specified
32
34
  if (@ARGV and lc($ARGV[0]) eq '-config') {
33
35
  shift;
@@ -757,7 +759,7 @@ for (;;) {
757
759
  }
758
760
  my $fp = ($stayOpen == 1 ? \*STAYOPEN : \*ARGFILE);
759
761
  unless ($mt->Open($fp, $argFile)) {
760
- unless ($argFile !~ /^\// and $mt->Open($fp, "$exeDir/$argFile")) {
762
+ unless ($argFile !~ /^\// and $mt->Open($fp, "$Image::ExifTool::exeDir/$argFile")) {
761
763
  Error "Error opening arg file $argFile\n";
762
764
  $badCmd = 1;
763
765
  next
@@ -1235,7 +1237,7 @@ for (;;) {
1235
1237
  $textOverwrite += 2 if $t2 =~ /\+/; # append
1236
1238
  if ($t1 ne 'W' and lc($t1) ne 'tagout') {
1237
1239
  undef $tagOut;
1238
- } elsif ($textOverwrite >= 2 and $textOut !~ /%[-+]?\d*[.:]?\d*[lu]?[tgs]/) {
1240
+ } elsif ($textOverwrite >= 2 and $textOut !~ /%[-+]?\d*[.:]?\d*[lu]?[tgso]/) {
1239
1241
  $tagOut = 0; # append tags to one file
1240
1242
  } else {
1241
1243
  $tagOut = 1; # separate file for each tag
@@ -1967,6 +1969,7 @@ sub GetImageInfo($$)
1967
1969
  } else {
1968
1970
  $pipe = qq{bzip2 -dc "$file" |};
1969
1971
  }
1972
+ $$et{TRUST_PIPE} = 1;
1970
1973
  }
1971
1974
  }
1972
1975
  # evaluate -if expression for conditional processing
@@ -2237,12 +2240,13 @@ sub GetImageInfo($$)
2237
2240
  next unless defined $forcePrint;
2238
2241
  $grp0 = $grp1 = 'Unknown';
2239
2242
  }
2243
+ # add groups from structure fields
2244
+ AddGroups($$info{$tag}, $grp0, \%groups, \@groups) if ref $$info{$tag};
2240
2245
  next if $groups{$grp1};
2241
2246
  # include family 0 and 1 groups in URI except for internal tags
2242
2247
  # (this will put internal tags in the "XML" group on readback)
2243
2248
  $groups{$grp1} = $grp0;
2244
2249
  push @groups, $grp1;
2245
- AddGroups($$info{$tag}, $grp0, \%groups, \@groups) if ref $$info{$tag};
2246
2250
  }
2247
2251
  foreach $grp1 (@groups) {
2248
2252
  my $grp = $groups{$grp1};
@@ -2365,7 +2369,8 @@ TAG: foreach $tag (@foundTags) {
2365
2369
  }
2366
2370
  my @groups = $et->GetGroup($tag);
2367
2371
  $outfile and close($fp), undef($tmpText); # (shouldn't happen)
2368
- ($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext);
2372
+ my $org = $et->GetValue('OriginalRawFileName') || $et->GetValue('OriginalFileName');
2373
+ ($fp, $outfile, $append) = OpenOutputFile($orig, $tagName, \@groups, $ext, $org);
2369
2374
  $fp or ++$countBad, next TAG;
2370
2375
  $tmpText = $outfile unless $append;
2371
2376
  }
@@ -3464,18 +3469,26 @@ sub ConvertBinary($)
3464
3469
  }
3465
3470
 
3466
3471
  #------------------------------------------------------------------------------
3467
- # Compare two tag values to see if they are equal
3472
+ # Compare ValueConv and PrintConv values of a tag to see if they are equal
3468
3473
  # Inputs: 0) value1, 1) value2
3469
3474
  # Returns: true if they are equal
3470
3475
  sub IsEqual($$)
3471
3476
  {
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];
3477
+ my ($a, $b) = @_;
3478
+ # (scalar values are not print-converted)
3479
+ return 1 if $a eq $b or ref $a eq 'SCALAR';
3480
+ if (ref $a eq 'HASH' and ref $b eq 'HASH') {
3481
+ return 0 if scalar(keys %$a) != scalar(keys %$b);
3482
+ my $key;
3483
+ foreach $key (keys %$a) {
3484
+ return 0 unless IsEqual($$a{$key}, $$b{$key});
3485
+ }
3486
+ } else {
3487
+ return 0 if ref $a ne 'ARRAY' or ref $b ne 'ARRAY' or @$a != @$b;
3488
+ my $i;
3489
+ for ($i=0; $i<scalar(@$a); ++$i) {
3490
+ return 0 unless IsEqual($$a[$i], $$b[$i]);
3491
+ }
3479
3492
  }
3480
3493
  return 1;
3481
3494
  }
@@ -3803,7 +3816,7 @@ sub FindFileWindows($$)
3803
3816
  my $enc = $et->Options('CharsetFileName');
3804
3817
  $wildfile = $et->Decode($wildfile, $enc, undef, 'UTF8') if $enc and $enc ne 'UTF8';
3805
3818
  $wildfile =~ tr/\\/\//; # use forward slashes
3806
- my ($dir, $wildname) = ($wildfile =~ m{(.*/)(.*)}) ? ($1, $2) : ('', $wildfile);
3819
+ my ($dir, $wildname) = ($wildfile =~ m{(.*[:/])(.*)}) ? ($1, $2) : ('', $wildfile);
3807
3820
  if ($dir =~ /[*?]/) {
3808
3821
  Warn "Wildcards don't work in the directory specification\n";
3809
3822
  return ();
@@ -3943,7 +3956,7 @@ sub SuggestedExtension($$$)
3943
3956
  $ext = 'xml';
3944
3957
  } elsif ($$valPt =~ /^RIFF....WAVE/s) {
3945
3958
  $ext = 'wav';
3946
- } elsif ($tag eq 'OriginalRawFileData' and defined($ext = $et->GetValue('OriginalRawFileName'))) {
3959
+ } elsif ($tag eq 'OriginalRawImage' and defined($ext = $et->GetValue('OriginalRawFileName'))) {
3947
3960
  $ext =~ s/^.*\.//s;
3948
3961
  $ext = $ext ? lc($ext) : 'raw';
3949
3962
  } elsif ($tag eq 'EXIF') {
@@ -3995,14 +4008,15 @@ sub LoadPrintFormat($)
3995
4008
  # A sort of sprintf for filenames
3996
4009
  # Inputs: 0) format string (%d=dir, %f=file name, %e=ext),
3997
4010
  # 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
4011
+ # 2-4) [%t %g %s %o only] tag name, ref to array of group names,
4012
+ # suggested extension, original raw file name
3999
4013
  # Returns: new filename or undef on error (or if no file and fmt contains token)
4000
4014
  sub FilenameSPrintf($;$@)
4001
4015
  {
4002
4016
  my ($fmt, $file, @extra) = @_;
4003
4017
  local $_;
4004
4018
  # return format string straight away if no tokens
4005
- return $fmt unless $fmt =~ /%[-+]?\d*[.:]?\d*[lu]?[dDfFeEtgs]/;
4019
+ return $fmt unless $fmt =~ /%[-+]?\d*[.:]?\d*[lu]?[dDfFeEtgso]/;
4006
4020
  return undef unless defined $file;
4007
4021
  CleanFilename($file); # make sure we are using forward slashes
4008
4022
  # split filename into directory, file, extension
@@ -4016,9 +4030,9 @@ sub FilenameSPrintf($;$@)
4016
4030
  }
4017
4031
  $part{F} = $part{f} . $part{E};
4018
4032
  ($part{D} = $part{d}) =~ s{/+$}{};
4019
- @part{qw(t g s)} = @extra;
4033
+ @part{qw(t g s o)} = @extra;
4020
4034
  my ($filename, $pos) = ('', 0);
4021
- while ($fmt =~ /(%([-+]?)(\d*)([.:]?)(\d*)([lu]?)([dDfFeEtgs]))/g) {
4035
+ while ($fmt =~ /(%([-+]?)(\d*)([.:]?)(\d*)([lu]?)([dDfFeEtgso]))/g) {
4022
4036
  $filename .= substr($fmt, $pos, pos($fmt) - $pos - length($1));
4023
4037
  $pos = pos($fmt);
4024
4038
  my ($sign, $wid, $dot, $skip, $mod, $code) = ($2, $3, $4, $5 || 0, $6, $7);
@@ -4181,7 +4195,7 @@ sub OpenOutputFile($;@)
4181
4195
  if ($textOut) {
4182
4196
  $outfile = $file;
4183
4197
  CleanFilename($outfile);
4184
- if ($textOut =~ /%[-+]?\d*[.:]?\d*[lun]?[dDfFeEtgscC]/ or defined $tagOut) {
4198
+ if ($textOut =~ /%[-+]?\d*[.:]?\d*[lun]?[dDfFeEtgsocC]/ or defined $tagOut) {
4185
4199
  # make filename from printf-like $textOut
4186
4200
  $outfile = FilenameSPrintf($textOut, $file, @args);
4187
4201
  return () unless defined $outfile;
@@ -4718,6 +4732,14 @@ group delete (unless a family 2 group is specified, see note 4 below).
4718
4732
  Instead, individual tags may be recovered using the B<-tagsFromFile> option
4719
4733
  (eg. C<-all= -tagsfromfile @ -artist>).
4720
4734
 
4735
+ To speed processing when reading XMP, exclusions in XMP groups also bypass
4736
+ processing of the corresponding XMP property and any contained properties.
4737
+ For example, C<--xmp-crs:all> may speed processing significantly in cases
4738
+ where a large number of XMP-crs tags exist. To use this feature to bypass
4739
+ processing of a specific XMP property, the property name must be used
4740
+ instead of the ExifTool tag name (eg. C<--xmp-crs:dabs>). Also, C<XMP-all>
4741
+ may be used to to indicate any XMP namespace (eg. <C--xmp-all:dabs>).
4742
+
4721
4743
  =item B<->I<TAG>[+-^]B<=>[I<VALUE>]
4722
4744
 
4723
4745
  Write a new value for the specified tag (eg. C<-comment=wow>), or delete the
@@ -4728,7 +4750,8 @@ for more details). C<+=> may also be used to increment numerical values (or
4728
4750
  decrement if I<VALUE> is negative), and C<-=> may be used to conditionally
4729
4751
  delete or replace a tag (see L</WRITING EXAMPLES> for examples). C<^=> is
4730
4752
  used to write an empty string instead of deleting the tag when no I<VALUE>
4731
- is given, but otherwise it is equivalent to C<=>.
4753
+ is given, but otherwise it is equivalent to C<=>, but note that the caret
4754
+ must be quoted on the Windows command line.
4732
4755
 
4733
4756
  I<TAG> may contain one or more leading family 0, 1, 2 or 7 group names,
4734
4757
  prefixed by optional family numbers, and separated colons. If no group name
@@ -5167,9 +5190,11 @@ various components of a date/time value. The specifics of the I<FMT> syntax
5167
5190
  are system dependent -- consult the C<strftime> man page on your system for
5168
5191
  details. The default format is equivalent to "%Y:%m:%d %H:%M:%S". This
5169
5192
  option has no effect on date-only or time-only tags and ignores timezone
5170
- information if present. Only one B<-d> option may be used per command.
5171
- Requires POSIX::strptime or Time::Piece for the inversion conversion when
5172
- writing.
5193
+ information if present. ExifTool adds a C<%f> format code to represent
5194
+ fractional seconds, and supports an optional width to specify the number of
5195
+ digits after the decimal point (eg. C<%3f> would give something like
5196
+ C<.437>). Only one B<-d> option may be used per command. Requires
5197
+ POSIX::strptime or Time::Piece for the inversion conversion when writing.
5173
5198
 
5174
5199
  =item B<-D> (B<-decimal>)
5175
5200
 
@@ -5396,7 +5421,8 @@ directory if C<#[SECT]> contains C<$directory>). Lines beginning with
5396
5421
  C<#[BODY]> and lines not beginning with C<#> are output for each processed
5397
5422
  file. Lines beginning with C<#[IF]> are not output, but all BODY lines are
5398
5423
  skipped if any tag on an IF line doesn't exist. Other lines beginning with
5399
- C<#> are ignored. For example, this format file:
5424
+ C<#> are ignored. (To output a line beginning with C<#>, use C<#[BODY]#>.)
5425
+ For example, this format file:
5400
5426
 
5401
5427
  # this is a comment line
5402
5428
  #[HEAD]-- Generated by ExifTool $exifToolVersion --
@@ -5410,7 +5436,7 @@ with this command:
5410
5436
 
5411
5437
  produces output like this:
5412
5438
 
5413
- -- Generated by ExifTool 12.34 --
5439
+ -- Generated by ExifTool 12.38 --
5414
5440
  File: a.jpg - 2003:10:31 15:44:19
5415
5441
  (f/5.6, 1/60s, ISO 100)
5416
5442
  File: b.jpg - 2006:05:23 11:57:38
@@ -5665,12 +5691,14 @@ between B<-W> and B<-w>:
5665
5691
 
5666
5692
  1) With B<-W>, a new output file is created for each extracted tag.
5667
5693
 
5668
- 2) B<-W> supports three additional format codes: %t, %g and %s represent
5669
- the tag name, group name, and suggested extension for the output file (based
5670
- on the format of the data). The %g code may be followed by a single digit
5671
- to specify the group family number (eg. %g1), otherwise family 0 is assumed.
5672
- The substring width/position/case specifiers may be used with these format
5673
- codes in exactly the same way as with %f and %e.
5694
+ 2) B<-W> supports four additional format codes: %t, %g and %s represent the
5695
+ tag name, group name, and suggested extension for the output file (based on
5696
+ the format of the data), and %o represents the value of the
5697
+ OriginalRawFileName or OriginalFileName tag from the input file (including
5698
+ extension). The %g code may be followed by a single digit to specify the
5699
+ group family number (eg. %g1), otherwise family 0 is assumed. The substring
5700
+ width/position/case specifiers may be used with these format codes in
5701
+ exactly the same way as with %f and %e.
5674
5702
 
5675
5703
  3) The argument for B<-W> is interpreted as a file name if it contains no
5676
5704
  format codes. (For B<-w>, this would be a file extension.) This change
@@ -5690,7 +5718,7 @@ example, the following pairs of commands give the same result:
5690
5718
  4) Adding the B<-v> option to B<-W> sends a list of the tags and output file
5691
5719
  names to the console instead of giving a verbose dump of the entire file.
5692
5720
  (Unless appending all output to one file for each source file by using
5693
- B<-W+> with an output file I<FMT> that does not contain %t, $g or %s.)
5721
+ B<-W+> with an output file I<FMT> that does not contain %t, %g, %s or %o.)
5694
5722
 
5695
5723
  5) Individual list items are stored in separate files when B<-W> is combined
5696
5724
  with B<-b>, but note that for separate files to be created %c or %C must be
@@ -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,