exiftool_vendored 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.
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,