exiftool_vendored 12.17.1 → 12.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +225 -1
  3. data/bin/MANIFEST +23 -0
  4. data/bin/META.json +1 -1
  5. data/bin/META.yml +1 -1
  6. data/bin/README +45 -43
  7. data/bin/arg_files/xmp2exif.args +2 -1
  8. data/bin/config_files/acdsee.config +193 -6
  9. data/bin/config_files/convert_regions.config +25 -14
  10. data/bin/config_files/cuepointlist.config +70 -0
  11. data/bin/config_files/example.config +2 -9
  12. data/bin/exiftool +142 -87
  13. data/bin/fmt_files/gpx.fmt +2 -2
  14. data/bin/fmt_files/gpx_wpt.fmt +2 -2
  15. data/bin/fmt_files/kml.fmt +1 -1
  16. data/bin/fmt_files/kml_track.fmt +1 -1
  17. data/bin/lib/Image/ExifTool/Apple.pm +3 -2
  18. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +30 -12
  19. data/bin/lib/Image/ExifTool/CBOR.pm +277 -0
  20. data/bin/lib/Image/ExifTool/Canon.pm +49 -18
  21. data/bin/lib/Image/ExifTool/DJI.pm +6 -6
  22. data/bin/lib/Image/ExifTool/DPX.pm +13 -2
  23. data/bin/lib/Image/ExifTool/DjVu.pm +6 -5
  24. data/bin/lib/Image/ExifTool/Exif.pm +28 -11
  25. data/bin/lib/Image/ExifTool/FITS.pm +13 -2
  26. data/bin/lib/Image/ExifTool/FlashPix.pm +35 -10
  27. data/bin/lib/Image/ExifTool/FujiFilm.pm +19 -8
  28. data/bin/lib/Image/ExifTool/GPS.pm +22 -11
  29. data/bin/lib/Image/ExifTool/Geotag.pm +13 -2
  30. data/bin/lib/Image/ExifTool/GoPro.pm +16 -1
  31. data/bin/lib/Image/ExifTool/ICC_Profile.pm +2 -2
  32. data/bin/lib/Image/ExifTool/ID3.pm +15 -3
  33. data/bin/lib/Image/ExifTool/JPEG.pm +74 -4
  34. data/bin/lib/Image/ExifTool/JSON.pm +27 -4
  35. data/bin/lib/Image/ExifTool/Jpeg2000.pm +393 -16
  36. data/bin/lib/Image/ExifTool/LIF.pm +153 -0
  37. data/bin/lib/Image/ExifTool/Lang/nl.pm +60 -59
  38. data/bin/lib/Image/ExifTool/M2TS.pm +137 -5
  39. data/bin/lib/Image/ExifTool/MIE.pm +4 -3
  40. data/bin/lib/Image/ExifTool/MRC.pm +341 -0
  41. data/bin/lib/Image/ExifTool/MWG.pm +3 -3
  42. data/bin/lib/Image/ExifTool/MXF.pm +1 -1
  43. data/bin/lib/Image/ExifTool/MacOS.pm +1 -1
  44. data/bin/lib/Image/ExifTool/Microsoft.pm +298 -82
  45. data/bin/lib/Image/ExifTool/Nikon.pm +19 -8
  46. data/bin/lib/Image/ExifTool/NikonSettings.pm +28 -11
  47. data/bin/lib/Image/ExifTool/Olympus.pm +6 -3
  48. data/bin/lib/Image/ExifTool/Other.pm +93 -0
  49. data/bin/lib/Image/ExifTool/PDF.pm +9 -12
  50. data/bin/lib/Image/ExifTool/PNG.pm +8 -7
  51. data/bin/lib/Image/ExifTool/Panasonic.pm +28 -3
  52. data/bin/lib/Image/ExifTool/Pentax.pm +28 -5
  53. data/bin/lib/Image/ExifTool/PhaseOne.pm +4 -3
  54. data/bin/lib/Image/ExifTool/Photoshop.pm +6 -0
  55. data/bin/lib/Image/ExifTool/QuickTime.pm +247 -88
  56. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +283 -141
  57. data/bin/lib/Image/ExifTool/README +3 -0
  58. data/bin/lib/Image/ExifTool/RIFF.pm +89 -12
  59. data/bin/lib/Image/ExifTool/Samsung.pm +48 -10
  60. data/bin/lib/Image/ExifTool/Shortcuts.pm +9 -0
  61. data/bin/lib/Image/ExifTool/Sony.pm +237 -78
  62. data/bin/lib/Image/ExifTool/TagInfoXML.pm +1 -0
  63. data/bin/lib/Image/ExifTool/TagLookup.pm +4125 -4028
  64. data/bin/lib/Image/ExifTool/TagNames.pod +644 -286
  65. data/bin/lib/Image/ExifTool/Torrent.pm +18 -11
  66. data/bin/lib/Image/ExifTool/WriteExif.pl +1 -1
  67. data/bin/lib/Image/ExifTool/WriteIPTC.pl +1 -1
  68. data/bin/lib/Image/ExifTool/WritePDF.pl +1 -0
  69. data/bin/lib/Image/ExifTool/WritePNG.pl +2 -0
  70. data/bin/lib/Image/ExifTool/WritePostScript.pl +1 -0
  71. data/bin/lib/Image/ExifTool/WriteQuickTime.pl +55 -21
  72. data/bin/lib/Image/ExifTool/WriteXMP.pl +7 -3
  73. data/bin/lib/Image/ExifTool/Writer.pl +47 -10
  74. data/bin/lib/Image/ExifTool/XMP.pm +39 -14
  75. data/bin/lib/Image/ExifTool/XMP2.pl +2 -1
  76. data/bin/lib/Image/ExifTool/XMPStruct.pl +3 -1
  77. data/bin/lib/Image/ExifTool/ZISRAW.pm +121 -2
  78. data/bin/lib/Image/ExifTool.pm +223 -72
  79. data/bin/lib/Image/ExifTool.pod +114 -93
  80. data/bin/perl-Image-ExifTool.spec +43 -42
  81. data/lib/exiftool_vendored/version.rb +1 -1
  82. metadata +28 -13
@@ -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.41';
38
+ $VERSION = '3.45';
39
39
  @ISA = qw(Exporter);
40
40
 
41
41
  sub NumbersFirst($$);
@@ -68,6 +68,7 @@ my %tweakOrder = (
68
68
  IPTC => 'Exif', # put IPTC after EXIF,
69
69
  GPS => 'XMP', # etc...
70
70
  Composite => 'Extra',
71
+ CBOR => 'JSON',
71
72
  GeoTiff => 'GPS',
72
73
  CanonVRD=> 'CanonCustom',
73
74
  DJI => 'Casio',
@@ -141,6 +142,9 @@ my %formatOK = (
141
142
  signed => 1,
142
143
  unsigned => 1,
143
144
  utf8 => 1,
145
+ Unicode => 1, # (Microsoft Xtra)
146
+ GUID => 1, # (Microsoft Xtra)
147
+ vt_filetime => 1, # (Microsoft Xtra)
144
148
  );
145
149
 
146
150
  # Descriptions for the TagNames documentation
@@ -431,11 +435,13 @@ L<UserData|Image::ExifTool::TagNames/QuickTime UserData Tags>, and
431
435
  finally in L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags>,
432
436
  but this order may be changed by setting the PREFERRED level of the
433
437
  appropriate table in the config file (see
434
- L<example.config|../config.html#PREF> in the full distribution for
435
- an example). ExifTool currently writes only top-level metadata in
436
- QuickTime-based files; it extracts other track-specific and timed
437
- metadata, but can not yet edit tags in these locations (with the
438
- exception of track-level date/time tags).
438
+ L<example.config|../config.html#PREF> in the full distribution for an
439
+ example). Note that some tags with the same name but different ID's may
440
+ exist in the same location, but the family 7 group names may be used to
441
+ differentiate these. ExifTool currently writes only top-level metadata in
442
+ QuickTime-based files; it extracts other track-specific and timed metadata,
443
+ but can not yet edit tags in these locations (with the exception of
444
+ track-level date/time tags).
439
445
 
440
446
  Alternate language tags may be accessed for
441
447
  L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and
@@ -460,8 +466,8 @@ local time when extracting.
460
466
 
461
467
  When writing string-based date/time tags, the system time zone is added if
462
468
  the PrintConv option is enabled and no time zone is specified. This is
463
- because Apple software may display a crazy values if the time zone is
464
- missing for some tags.
469
+ because Apple software may display crazy values if the time zone is missing
470
+ for some tags.
465
471
 
466
472
  See
467
473
  L<https://developer.apple.com/library/archive/documentation/QuickTime/QTFF/>
@@ -634,7 +640,7 @@ overlapping EXIF, IPTC and XMP tags to be reconciled when reading, and
634
640
  synchronized when writing. The MWG Composite tags below are designed to aid
635
641
  in the implementation of these recommendations. As well, the MWG defines
636
642
  new XMP tags which are listed in the subsequent tables below. See
637
- L<https://web.archive.org/web/20181006115950/http://www.metadataworkinggroup.org/specs/>
643
+ L<https://web.archive.org/web/20180919181934/http://www.metadataworkinggroup.org/pdf/mwg_guidance.pdf>
638
644
  for the official MWG specification.
639
645
  },
640
646
  MacOS => q{
@@ -699,10 +705,14 @@ my %shortcutNotes = (
699
705
  large binary data tags which may be excluded to reduce memory usage if
700
706
  memory limitations are a problem
701
707
  },
708
+ 'ls-l' => q{
709
+ mimics columns shown by Unix "ls -l" command. Includes some tags which are
710
+ extracted only if the API L<SystemTags|../ExifTool.html#SystemTags> option
711
+ is enabled
712
+ },
702
713
  );
703
714
 
704
-
705
- # same thing for RIFF INFO tags found in the EXIF spec
715
+ # lookup for RIFF INFO tags which are found in the EXIF spec
706
716
  my %riffSpec = (
707
717
  IARL => 1, ICRD => 1, IGNR => 1, IPLT => 1, ISRC => 1,
708
718
  IART => 1, ICRP => 1, IKEY => 1, IPRD => 1, ISRF => 1,
@@ -1320,6 +1330,7 @@ TagID: foreach $tagID (@keys) {
1320
1330
  my $count = $$tagInfo{Count} || 1;
1321
1331
  # adjust count to Writable size if different than Format
1322
1332
  if ($writable and $format and $writable ne $format and
1333
+ $writable ne 'string' and $format ne 'string' and
1323
1334
  $Image::ExifTool::Exif::formatNumber{$writable} and
1324
1335
  $Image::ExifTool::Exif::formatNumber{$format})
1325
1336
  {
@@ -2107,7 +2118,7 @@ sub WriteTagNames($$)
2107
2118
  $short = $$shortName{$tableName};
2108
2119
  my @names = split ' ', $short;
2109
2120
  my $class = shift @names;
2110
- if (@names) {
2121
+ if (@names and $class ne 'Other') {
2111
2122
  # add heading for tables without a Main
2112
2123
  unless ($heading eq $class) {
2113
2124
  $heading = $class;
@@ -2135,6 +2146,13 @@ sub WriteTagNames($$)
2135
2146
  $short = $$shortName{$tableName};
2136
2147
  $short = $tableName unless $short;
2137
2148
  $url = "$short.html";
2149
+ # handle various tables in "Other.pm"
2150
+ if ($short =~ /^Other (.*)/) {
2151
+ $short = $1;
2152
+ $url = 'Other.html#' . $1;
2153
+ } else {
2154
+ $url = "$short.html";
2155
+ }
2138
2156
  print HTMLFILE "<a href='${url}'>$short</a>";
2139
2157
  ++$count;
2140
2158
  }
@@ -0,0 +1,277 @@
1
+ #------------------------------------------------------------------------------
2
+ # File: CBOR.pm
3
+ #
4
+ # Description: Read CBOR format metadata
5
+ #
6
+ # Revisions: 2021-09-30 - P. Harvey Created
7
+ #
8
+ # References: 1) https://c2pa.org/public-draft/
9
+ # 2) https://datatracker.ietf.org/doc/html/rfc7049
10
+ #------------------------------------------------------------------------------
11
+
12
+ package Image::ExifTool::CBOR;
13
+ use strict;
14
+ use vars qw($VERSION);
15
+ use Image::ExifTool qw(:DataAccess :Utils);
16
+ use Image::ExifTool::JSON;
17
+
18
+ $VERSION = '1.00';
19
+
20
+ sub ProcessCBOR($$$);
21
+ sub ReadCBORValue($$$$);
22
+
23
+ # optional CBOR type codes
24
+ my %cborType6 = (
25
+ 0 => 'date/time string',
26
+ 1 => 'epoch-based date/time',
27
+ 2 => 'positive bignum',
28
+ 3 => 'negative bignum',
29
+ 4 => 'decimal fraction',
30
+ 5 => 'bigfloat',
31
+ 21 => 'expected base64url encoding',
32
+ 22 => 'expected base64 encoding',
33
+ 23 => 'expected base16 encoding',
34
+ 24 => 'encoded CBOR data',
35
+ 32 => 'URI',
36
+ 33 => 'base64url',
37
+ 34 => 'base64',
38
+ 35 => 'regular expression',
39
+ 36 => 'MIME message',
40
+ 55799 => 'CBOR magic number',
41
+ );
42
+
43
+ my %cborType7 = (
44
+ 20 => 'False',
45
+ 21 => 'True',
46
+ 22 => 'null',
47
+ 23 => 'undef',
48
+ );
49
+
50
+ %Image::ExifTool::CBOR::Main = (
51
+ GROUPS => { 0 => 'JUMBF', 1 => 'CBOR', 2 => 'Other' },
52
+ VARS => { NO_ID => 1 },
53
+ PROCESS_PROC => \&ProcessCBOR,
54
+ NOTES => q{
55
+ The tags below are extracted from CBOR (Concise Binary Object
56
+ Representation) metadata. The C2PA specification uses this format for some
57
+ metadata. As well as these tags, ExifTool will read any existing tags.
58
+ },
59
+ 'dc:title' => 'Title',
60
+ 'dc:format' => 'Format',
61
+ # my sample file has the following 2 tags in CBOR, but they should be JSON
62
+ authorName => { Name => 'AuthorName', Groups => { 2 => 'Author' } },
63
+ authorIdentifier=> { Name => 'AuthorIdentifier', Groups => { 2 => 'Author' } },
64
+ documentID => { },
65
+ instanceID => { },
66
+ thumbnailHash => { List => 1 },
67
+ thumbnailUrl => { Name => 'ThumbnailURL' },
68
+ relationship => { }
69
+ );
70
+
71
+ #------------------------------------------------------------------------------
72
+ # Read CBOR value
73
+ # Inputs: 0) ExifTool ref, 1) data ref, 2) position in data, 3) data end
74
+ # Returns: 0) value, 1) error string, 2) new data position
75
+ sub ReadCBORValue($$$$)
76
+ {
77
+ my ($et, $dataPt, $pos, $end) = @_;
78
+ return(undef, 'Truncated CBOR data', $pos) if $pos >= $end;
79
+ my $verbose = $$et{OPTIONS}{Verbose};
80
+ my $indent = $$et{INDENT};
81
+ my $fmt = Get8u($dataPt, $pos++);
82
+ my $dat = $fmt & 0x1f;
83
+ my ($num, $val, $err, $size);
84
+ $fmt >>= 5;
85
+ if ($dat < 24) {
86
+ $num = $dat;
87
+ } elsif ($dat == 31) { # indefinite count (not used in C2PA)
88
+ $num = -1; # (flag for indefinite count)
89
+ $et->VPrint(1, "$$et{INDENT} (indefinite count):\n");
90
+ } else {
91
+ my $format = { 24 => 'int8u', 25 => 'int16u', 26 => 'int32u', 27 => 'int64u' }->{$dat};
92
+ return(undef, "Invalid CBOR integer type $dat", $pos) unless $format;
93
+ $size = Image::ExifTool::FormatSize($format);
94
+ return(undef, 'Truncated CBOR integer value', $pos) if $pos + $size > $end;
95
+ $num = ReadValue($dataPt, $pos, $format, 1, $size);
96
+ $pos += $size;
97
+ }
98
+ my ($pre, $opt) = ('', ':');
99
+ if ($verbose and $fmt != 6) {
100
+ if (defined $$et{cbor_pre}) {
101
+ $pre = "$$et{cbor_pre}";
102
+ delete $$et{cbor_pre};
103
+ }
104
+ if (defined $$et{cbor_opt}) {
105
+ $opt = ", $$et{cbor_opt}:";
106
+ delete $$et{cbor_opt};
107
+ }
108
+ }
109
+ if ($fmt == 0) { # positive integer
110
+ $val = $num;
111
+ $et->VPrint(1, "$$et{INDENT} ${pre}int+$opt $val\n");
112
+ } elsif ($fmt == 1) { # negative integer
113
+ $val = -1 * $num;
114
+ $et->VPrint(1, "$$et{INDENT} ${pre}int-$opt $val\n");
115
+ } elsif ($fmt == 2 or $fmt == 3) { # byte/UTF8 string
116
+ return(undef, 'Truncated CBOR string value', $pos) if $pos + $num > $end;
117
+ if ($num < 0) { # (should not happen in C2PA)
118
+ my $string = '';
119
+ $$et{INDENT} .= ' ';
120
+ for (;;) {
121
+ ($val, $err, $pos) = ReadCBORValue($et, $dataPt, $pos, $end);
122
+ return(undef, $err, $pos) if $err;
123
+ last if not defined $val; # hit the break?
124
+ # (note: strictly we should be checking that this was a string we read)
125
+ $string .= $val;
126
+ }
127
+ $$et{INDENT} = $indent;
128
+ return($string, undef, $pos); # return concatenated strings
129
+ } else {
130
+ $val = substr($$dataPt, $pos, $num);
131
+ }
132
+ $pos += $num;
133
+ if ($fmt == 2) {
134
+ $et->VPrint(1, "$$et{INDENT} ${pre}byte$opt <binary data ".length($val)." bytes>\n");
135
+ return(\$val, undef, $pos); # (byte string)
136
+ }
137
+ $et->VPrint(1, "$$et{INDENT} ${pre}text$opt '${val}'\n");
138
+ } elsif ($fmt == 4 or $fmt == 5) { # list/hash
139
+ if ($fmt == 4) {
140
+ $et->VPrint(1, "$$et{INDENT} ${pre}list$opt <$num elements>\n");
141
+ } else {
142
+ $et->VPrint(1, "$$et{INDENT} ${pre}hash$opt <$num pairs>\n");
143
+ $num *= 2;
144
+ }
145
+ $$et{INDENT} .= ' ';
146
+ my $i = 0;
147
+ my @list;
148
+ while ($num) {
149
+ $$et{cbor_pre} = "$i) ";
150
+ if ($fmt == 4) {
151
+ ++$i;
152
+ } elsif ($num & 0x01) {
153
+ $$et{cbor_pre} = ' ' x length($$et{cbor_pre});
154
+ ++$i;
155
+ }
156
+ ($val, $err, $pos) = ReadCBORValue($et, $dataPt, $pos, $end);
157
+ return(undef, $err, $pos) if $err;
158
+ if (not defined $val) {
159
+ return(undef, 'Unexpected list terminator', $pos) unless $num < 0;
160
+ last;
161
+ }
162
+ push @list, $val;
163
+ --$num;
164
+ }
165
+ $$et{INDENT} = $indent;
166
+ if ($fmt == 5) {
167
+ my ($i, @keys);
168
+ my %hash = ( _ordered_keys_ => \@keys );
169
+ for ($i=0; $i<@list-1; $i+=2) {
170
+ $hash{$list[$i]} = $list[$i+1];
171
+ push @keys, $list[$i]; # save ordered list of keys
172
+ }
173
+ $val = \%hash;
174
+ } else {
175
+ $val = \@list;
176
+ }
177
+ } elsif ($fmt == 6) { # optional type
178
+ $$et{cbor_opt} = $cborType6{$num} || "<unknown type $num>";
179
+ ($val, $err, $pos) = ReadCBORValue($et, $dataPt, $pos, $end);
180
+ } elsif ($fmt == 7) {
181
+ if ($dat == 31) {
182
+ undef $val; # "break" = end of indefinite array/hash (not used in C2PA)
183
+ } elsif ($dat < 24) {
184
+ $val = $cborType7{$num};
185
+ $val = "Unknown ($val)" unless defined $val;
186
+ } elsif ($dat == 25) { # half-precision float
187
+ my $exp = ($num >> 10) & 0x1f;
188
+ my $mant = $num & 0x3ff;
189
+ if ($exp == 0) {
190
+ $val = $mant ** -24;
191
+ $val *= -1 if $num & 0x8000;
192
+ } elsif (exp != 31) {
193
+ $val = ($mant + 1024) ** ($exp - 25);
194
+ $val *= -1 if $num & 0x8000;
195
+ } else {
196
+ $val = $mant == 0 ? '<inf>' : '<nan>';
197
+ }
198
+ } elsif ($dat == 26) { # float
199
+ $val = GetFloat($dataPt, $pos - $size);
200
+ } elsif ($dat == 27) { # double
201
+ $val = GetDouble($dataPt, $pos - $size);
202
+ } else {
203
+ return(undef, "Invalid CBOR type 7 variant $num", $pos);
204
+ }
205
+ $et->VPrint(1, "$$et{INDENT} ${pre}typ7$opt ".(defined $val ? $val : '<break>')."\n");
206
+ } else {
207
+ return(undef, "Unknown CBOR format $fmt", $pos);
208
+ }
209
+ return($val, $err, $pos);
210
+ }
211
+
212
+ #------------------------------------------------------------------------------
213
+ # Read CBOR box
214
+ # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
215
+ # Returns: 1 on success
216
+ sub ProcessCBOR($$$)
217
+ {
218
+ my ($et, $dirInfo, $tagTablePtr) = @_;
219
+ my $dataPt = $$dirInfo{DataPt};
220
+ my $pos = $$dirInfo{DirStart};
221
+ my $end = $pos + $$dirInfo{DirLen};
222
+ $et->VerboseDir('CBOR', undef, $$dirInfo{DirLen});
223
+ my ($val, $err, $tag);
224
+ require Image::ExifTool::CBOR;
225
+ while ($pos < $end) {
226
+ ($val, $err, $pos) = ReadCBORValue($et, $dataPt, $pos, $end);
227
+ $err and $et->Warn($err), last;
228
+ ref $val eq 'HASH' or $et->VPrint(1, "$$et{INDENT} CBOR end: Non-hash encountered\n"), last;
229
+ foreach $tag (@{$$val{_ordered_keys_}}) {
230
+ Image::ExifTool::JSON::ProcessTag($et, $tagTablePtr, $tag, $$val{$tag});
231
+ }
232
+ }
233
+ return 1;
234
+ }
235
+
236
+ 1; # end
237
+
238
+ __END__
239
+
240
+ =head1 NAME
241
+
242
+ Image::ExifTool::CBOR - Read CBOR format metadata
243
+
244
+ =head1 SYNOPSIS
245
+
246
+ This module is used by Image::ExifTool
247
+
248
+ =head1 DESCRIPTION
249
+
250
+ This module contains definitions required by Image::ExifTool read Concise
251
+ Binary Object Representation (CBOR) formatted metadata, used by the C2PA
252
+ specification.
253
+
254
+ =head1 AUTHOR
255
+
256
+ Copyright 2003-2021, Phil Harvey (philharvey66 at gmail.com)
257
+
258
+ This library is free software; you can redistribute it and/or modify it
259
+ under the same terms as Perl itself.
260
+
261
+ =head1 REFERENCES
262
+
263
+ =over 4
264
+
265
+ =item L<https://c2pa.org/public-draft/>
266
+
267
+ =item L<https://datatracker.ietf.org/doc/html/rfc7049>
268
+
269
+ =back
270
+
271
+ =head1 SEE ALSO
272
+
273
+ L<Image::ExifTool::TagNames/CBOR Tags>,
274
+ L<Image::ExifTool(3pm)|Image::ExifTool>
275
+
276
+ =cut
277
+
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.43';
91
+ $VERSION = '4.51';
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)
@@ -473,7 +473,8 @@ $VERSION = '4.43';
473
473
  253 => 'Canon EF 70-200mm f/2.8L IS II USM + 2x', #PH (NC)
474
474
  253.1 => 'Canon EF 70-200mm f/2.8L IS III USM + 2x', #PH (NC)
475
475
  # 253.2 => 'Tamron SP 70-200mm f/2.8 Di VC USD G2 (A025) + 2x', #forum9367
476
- 254 => 'Canon EF 100mm f/2.8L Macro IS USM', #42
476
+ 254 => 'Canon EF 100mm f/2.8L Macro IS USM or Tamron Lens', #42
477
+ 254.1 => 'Tamron SP 90mm f/2.8 Di VC USD 1:1 Macro (F017)', #PH
477
478
  255 => 'Sigma 24-105mm f/4 DG OS HSM | A or Other Lens', #50
478
479
  255.1 => 'Sigma 180mm f/2.8 EX DG OS HSM APO Macro', #50
479
480
  255.2 => 'Tamron SP 70-200mm f/2.8 Di VC USD', #exiv issue 1202 (A009)
@@ -518,7 +519,8 @@ $VERSION = '4.43';
518
519
  507 => 'Canon EF 16-35mm f/4L IS USM', #42
519
520
  508 => 'Canon EF 11-24mm f/4L USM or Tamron Lens', #PH
520
521
  508.1 => 'Tamron 10-24mm f/3.5-4.5 Di II VC HLD (B023)', #PH
521
- 624 => 'Sigma 70-200mm f/2.8 DG OS HSM | S', #IB (018)
522
+ 624 => 'Sigma 70-200mm f/2.8 DG OS HSM | S or other Sigma Lens', #IB (018)
523
+ 624.1 => 'Sigma 150-600mm f/5-6.3 | C', #ChrisSkopec
522
524
  747 => 'Canon EF 100-400mm f/4.5-5.6L IS II USM or Tamron Lens', #JR
523
525
  747.1 => 'Tamron SP 150-600mm f/5-6.3 Di VC USD G2', #50
524
526
  748 => 'Canon EF 100-400mm f/4.5-5.6L IS II USM + 1.4x or Tamron Lens', #JR (1.4x Mk III)
@@ -556,7 +558,8 @@ $VERSION = '4.43';
556
558
  4158 => 'Canon EF-S 18-55mm f/4-5.6 IS STM', #PH
557
559
  4159 => 'Canon EF-M 32mm f/1.4 STM', #42
558
560
  4160 => 'Canon EF-S 35mm f/2.8 Macro IS STM', #42
559
- 4208 => 'Sigma 56mm f/1.4 DC DN | C', #forum10603
561
+ 4208 => 'Sigma 56mm f/1.4 DC DN | C or other Sigma Lens', #forum10603
562
+ 4208.1 => 'Sigma 30mm F1.4 DC DN | C', #git issue#83 (016)
560
563
  # (Nano USM lenses - 0x90xx)
561
564
  36910 => 'Canon EF 70-300mm f/4-5.6 IS II USM', #42
562
565
  36912 => 'Canon EF-S 18-135mm f/3.5-5.6 IS USM', #42
@@ -578,17 +581,21 @@ $VERSION = '4.43';
578
581
  61182.7 => 'Canon RF 15-35mm F2.8L IS USM',
579
582
  61182.8 => 'Canon RF 24-240mm F4-6.3 IS USM',
580
583
  61182.9 => 'Canon RF 70-200mm F2.8L IS USM',
581
- 61182.10 => 'Canon RF 85mm F2 MACRO IS STM',
582
- 61182.11 => 'Canon RF 600mm F11 IS STM',
583
- 61182.12 => 'Canon RF 600mm F11 IS STM + RF1.4x',
584
- 61182.13 => 'Canon RF 600mm F11 IS STM + RF2x',
585
- 61182.14 => 'Canon RF 800mm F11 IS STM',
586
- 61182.15 => 'Canon RF 800mm F11 IS STM + RF1.4x',
587
- 61182.16 => 'Canon RF 800mm F11 IS STM + RF2x',
588
- 61182.17 => 'Canon RF 24-105mm F4-7.1 IS STM',
589
- 61182.18 => 'Canon RF 100-500mm F4.5-7.1L IS USM',
590
- 61182.19 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
591
- 61182.20 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
584
+ '61182.10' => 'Canon RF 85mm F2 MACRO IS STM',
585
+ '61182.11' => 'Canon RF 600mm F11 IS STM',
586
+ '61182.12' => 'Canon RF 600mm F11 IS STM + RF1.4x',
587
+ '61182.13' => 'Canon RF 600mm F11 IS STM + RF2x',
588
+ '61182.14' => 'Canon RF 800mm F11 IS STM',
589
+ '61182.15' => 'Canon RF 800mm F11 IS STM + RF1.4x',
590
+ '61182.16' => 'Canon RF 800mm F11 IS STM + RF2x',
591
+ '61182.17' => 'Canon RF 24-105mm F4-7.1 IS STM',
592
+ '61182.18' => 'Canon RF 100-500mm F4.5-7.1L IS USM',
593
+ '61182.19' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
594
+ '61182.20' => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
595
+ '61182.21' => 'Canon RF 70-200mm F4L IS USM', #42
596
+ '61182.22' => 'Canon RF 50mm F1.8 STM', #42
597
+ '61182.23' => 'Canon RF 14-35mm F4L IS USM', #IB
598
+ #'61182.xx' => 'Canon RF 100mm F2.8L MACRO IS USM',
592
599
  65535 => 'n/a',
593
600
  );
594
601
 
@@ -945,6 +952,7 @@ $VERSION = '4.43';
945
952
  0x80000437 => 'EOS 90D', #IB
946
953
  0x80000453 => 'EOS R6', #PH
947
954
  0x80000467 => 'PowerShot ZOOM',
955
+ 0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
948
956
  0x80000520 => 'EOS D2000C', #IB
949
957
  0x80000560 => 'EOS D6000C', #PH (guess)
950
958
  );
@@ -4539,6 +4547,16 @@ my %ciMaxFocal = (
4539
4547
  2 => 'Rotate 270 CW',
4540
4548
  },
4541
4549
  },
4550
+ 0x3a => { #IB
4551
+ Name => 'CameraOrientation',
4552
+ Condition => '$$self{Model} =~ /\b(1200D|REBEL T5|Kiss X70)\b/',
4553
+ Notes => '1200D only',
4554
+ PrintConv => {
4555
+ 0 => 'Horizontal (normal)',
4556
+ 1 => 'Rotate 90 CW',
4557
+ 2 => 'Rotate 270 CW',
4558
+ },
4559
+ },
4542
4560
  0x55 => {
4543
4561
  Name => 'FocusDistanceUpper',
4544
4562
  Condition => '$$self{Model} =~ /EOS 60D$/',
@@ -4679,7 +4697,7 @@ my %ciMaxFocal = (
4679
4697
  FIRST_ENTRY => 0,
4680
4698
  PRIORITY => 0,
4681
4699
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
4682
- NOTES => 'CameraInfo tags for the EOS 70D.',
4700
+ NOTES => 'CameraInfo tags for the EOS 80D.',
4683
4701
  0x03 => { %ciFNumber },
4684
4702
  0x04 => { %ciExposureTime },
4685
4703
  0x06 => { %ciISO },
@@ -5255,6 +5273,14 @@ my %ciMaxFocal = (
5255
5273
  0x06 => { %ciISO },
5256
5274
  0x1b => { %ciCameraTemperature }, # (700D + 0)
5257
5275
  0x23 => { %ciFocalLength }, # (700D + 0)
5276
+ 0x96 => { #IB (700D + 0x19)
5277
+ Name => 'CameraOrientation',
5278
+ PrintConv => {
5279
+ 0 => 'Horizontal (normal)',
5280
+ 1 => 'Rotate 90 CW',
5281
+ 2 => 'Rotate 270 CW',
5282
+ },
5283
+ },
5258
5284
  0xa5 => { # (700D + 0x19)
5259
5285
  Name => 'FocusDistanceUpper',
5260
5286
  %focusDistanceByteSwap,
@@ -6736,6 +6762,10 @@ my %ciMaxFocal = (
6736
6762
  275 => 'Canon RF 100-500mm F4.5-7.1L IS USM',
6737
6763
  276 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF1.4x',
6738
6764
  277 => 'Canon RF 100-500mm F4.5-7.1L IS USM + RF2x',
6765
+ 278 => 'Canon RF 70-200mm F4L IS USM', #42
6766
+ 280 => 'Canon RF 50mm F1.8 STM', #42
6767
+ 281 => 'Canon RF 14-35mm F4L IS USM', #42/IB
6768
+ #xxx => 'Canon RF 100mm F2.8L MACRO IS USM',
6739
6769
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6740
6770
  },
6741
6771
  },
@@ -9229,8 +9259,9 @@ sub PrintLensID(@)
9229
9259
  push @likely, $tclens;
9230
9260
  if ($maxAperture) {
9231
9261
  # (not 100% sure that TC affects MaxAperture, but it should!)
9232
- next if $maxAperture < $sa * $tc - 0.15;
9233
- next if $maxAperture > $la * $tc + 0.15;
9262
+ # (RF 24-105mm F4L IS USM shows a MaxAperture of 4.177)
9263
+ next if $maxAperture < $sa * $tc - 0.18;
9264
+ next if $maxAperture > $la * $tc + 0.18;
9234
9265
  }
9235
9266
  push @matches, $tclens;
9236
9267
  }
@@ -15,7 +15,7 @@ use Image::ExifTool::Exif;
15
15
  use Image::ExifTool::XMP;
16
16
  use Image::ExifTool::GPS;
17
17
 
18
- $VERSION = '1.03';
18
+ $VERSION = '1.04';
19
19
 
20
20
  my %convFloat2 = (
21
21
  PrintConv => 'sprintf("%+.2f", $val)',
@@ -90,20 +90,20 @@ my %convFloat2 = (
90
90
  Writable => 'real',
91
91
  Avoid => 1,
92
92
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
93
- PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
93
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
94
94
  },
95
95
  GpsLongtitude => { # (sic)
96
96
  Name => 'GPSLongtitude',
97
97
  Writable => 'real',
98
98
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
99
- PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
99
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
100
100
  },
101
101
  GpsLongitude => { #PH (NC)
102
102
  Name => 'GPSLongitude',
103
103
  Writable => 'real',
104
104
  Avoid => 1,
105
105
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
106
- PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
106
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
107
107
  },
108
108
  FlightXSpeed => { Writable => 'real' },
109
109
  FlightYSpeed => { Writable => 'real' },
@@ -124,13 +124,13 @@ my %convFloat2 = (
124
124
  Name => 'Latitude',
125
125
  Writable => 'real',
126
126
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "N")',
127
- PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
127
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lat")',
128
128
  },
129
129
  Longitude => {
130
130
  Name => 'Longitude',
131
131
  Writable => 'real',
132
132
  PrintConv => 'Image::ExifTool::GPS::ToDMS($self, $val, 1, "E")',
133
- PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1)',
133
+ PrintConvInv => 'Image::ExifTool::GPS::ToDegrees($val, 1, "lon")',
134
134
  },
135
135
  );
136
136
 
@@ -15,7 +15,7 @@ use strict;
15
15
  use vars qw($VERSION);
16
16
  use Image::ExifTool qw(:DataAccess :Utils);
17
17
 
18
- $VERSION = '1.05';
18
+ $VERSION = '1.06';
19
19
 
20
20
  # DPX tags
21
21
  %Image::ExifTool::DPX::Main = (
@@ -156,7 +156,18 @@ $VERSION = '1.05';
156
156
  1532=> { Name => 'SourceCreateDate', Format => 'string[24]' },
157
157
  1556=> { Name => 'InputDeviceName', Format => 'string[32]' },
158
158
  1588=> { Name => 'InputDeviceSerialNumber', Format => 'string[32]' },
159
- # 1620=> { Name => 'AspectRatio', Format => 'int32u' },
159
+ # 1620 => { Name => 'Border', Format => 'int16u[4]' },
160
+ 1628 => {
161
+ Name => 'AspectRatio',
162
+ Format => 'int32u[2]',
163
+ RawConv => '$val =~ /4294967295/ ? undef : $val', # ignore undefined values
164
+ PrintConv => q{
165
+ return 'undef' if $val eq '0 0';
166
+ return 'inf' if $val=~/ 0$/;
167
+ my @a=split(' ',$val);
168
+ return join(':', Rationalize($a[0]/$a[1]));
169
+ },
170
+ },
160
171
  1724 => { Name => 'OriginalFrameRate',Format => 'float' },
161
172
  1728 => { Name => 'ShutterAngle', Format => 'float', RawConv => '($val =~ /\d/ and $val !~ /nan/i) ? $val : undef' }, #2
162
173
  1732 => { Name => 'FrameID', Format => 'string[32]' },
@@ -18,7 +18,7 @@ use strict;
18
18
  use vars qw($VERSION);
19
19
  use Image::ExifTool qw(:DataAccess :Utils);
20
20
 
21
- $VERSION = '1.06';
21
+ $VERSION = '1.07';
22
22
 
23
23
  sub ParseAnt($);
24
24
  sub ProcessAnt($$$);
@@ -227,10 +227,11 @@ Tok: for (;;) {
227
227
  last unless $tok =~ /(\\+)$/ and length($1) & 0x01;
228
228
  $tok .= '"'; # quote is part of the string
229
229
  }
230
- # must protect unescaped "$" and "@" symbols, and "\" at end of string
231
- $tok =~ s{\\(.)|([\$\@]|\\$)}{'\\'.($2 || $1)}sge;
232
- # convert C escape sequences (allowed in quoted text)
233
- $tok = eval qq{"$tok"};
230
+ # convert C escape sequences, allowed in quoted text
231
+ # (note: this only converts a few of them!)
232
+ my %esc = ( a => "\a", b => "\b", f => "\f", n => "\n",
233
+ r => "\r", t => "\t", '"' => '"', '\\' => '\\' );
234
+ $tok =~ s/\\(.)/$esc{$1}||'\\'.$1/egs;
234
235
  } else { # key name
235
236
  pos($$dataPt) = pos($$dataPt) - 1;
236
237
  # allow anything in key but whitespace, braces and double quotes