exiftool-vendored.pl 12.55.0 → 12.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/bin/Changes +97 -4
  2. package/bin/MANIFEST +9 -0
  3. package/bin/META.json +1 -1
  4. package/bin/META.yml +1 -1
  5. package/bin/README +19 -19
  6. package/bin/arg_files/xmp2exif.args +4 -1
  7. package/bin/config_files/example.config +1 -0
  8. package/bin/config_files/rotate_regions.config +1 -1
  9. package/bin/exiftool +197 -122
  10. package/bin/fmt_files/kml.fmt +3 -0
  11. package/bin/fmt_files/kml_track.fmt +3 -0
  12. package/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  13. package/bin/lib/Image/ExifTool/APE.pm +2 -2
  14. package/bin/lib/Image/ExifTool/BuildTagLookup.pm +25 -19
  15. package/bin/lib/Image/ExifTool/Canon.pm +33 -7
  16. package/bin/lib/Image/ExifTool/CanonRaw.pm +5 -1
  17. package/bin/lib/Image/ExifTool/DJI.pm +28 -2
  18. package/bin/lib/Image/ExifTool/Exif.pm +107 -20
  19. package/bin/lib/Image/ExifTool/FlashPix.pm +92 -9
  20. package/bin/lib/Image/ExifTool/FujiFilm.pm +9 -4
  21. package/bin/lib/Image/ExifTool/GPS.pm +7 -2
  22. package/bin/lib/Image/ExifTool/Geotag.pm +30 -7
  23. package/bin/lib/Image/ExifTool/InfiRay.pm +227 -0
  24. package/bin/lib/Image/ExifTool/JPEG.pm +53 -7
  25. package/bin/lib/Image/ExifTool/Jpeg2000.pm +5 -5
  26. package/bin/lib/Image/ExifTool/LIF.pm +10 -2
  27. package/bin/lib/Image/ExifTool/LNK.pm +5 -4
  28. package/bin/lib/Image/ExifTool/MIE.pm +3 -3
  29. package/bin/lib/Image/ExifTool/MPEG.pm +2 -2
  30. package/bin/lib/Image/ExifTool/MakerNotes.pm +3 -2
  31. package/bin/lib/Image/ExifTool/Minolta.pm +6 -7
  32. package/bin/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
  33. package/bin/lib/Image/ExifTool/Nikon.pm +1199 -1325
  34. package/bin/lib/Image/ExifTool/NikonCustom.pm +2 -2
  35. package/bin/lib/Image/ExifTool/NikonSettings.pm +1 -1
  36. package/bin/lib/Image/ExifTool/Olympus.pm +88 -6
  37. package/bin/lib/Image/ExifTool/OpenEXR.pm +32 -15
  38. package/bin/lib/Image/ExifTool/PNG.pm +89 -3
  39. package/bin/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
  40. package/bin/lib/Image/ExifTool/Pentax.pm +8 -5
  41. package/bin/lib/Image/ExifTool/PhaseOne.pm +14 -1
  42. package/bin/lib/Image/ExifTool/Photoshop.pm +38 -7
  43. package/bin/lib/Image/ExifTool/QuickTime.pm +44 -13
  44. package/bin/lib/Image/ExifTool/QuickTimeStream.pl +63 -20
  45. package/bin/lib/Image/ExifTool/README +19 -2
  46. package/bin/lib/Image/ExifTool/RIFF.pm +34 -13
  47. package/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
  48. package/bin/lib/Image/ExifTool/Real.pm +2 -2
  49. package/bin/lib/Image/ExifTool/Ricoh.pm +2 -1
  50. package/bin/lib/Image/ExifTool/Sigma.pm +5 -4
  51. package/bin/lib/Image/ExifTool/SigmaRaw.pm +9 -3
  52. package/bin/lib/Image/ExifTool/Sony.pm +28 -1
  53. package/bin/lib/Image/ExifTool/TagLookup.pm +4691 -4624
  54. package/bin/lib/Image/ExifTool/TagNames.pod +511 -117
  55. package/bin/lib/Image/ExifTool/VCard.pm +19 -5
  56. package/bin/lib/Image/ExifTool/Validate.pm +5 -5
  57. package/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
  58. package/bin/lib/Image/ExifTool/WriteXMP.pl +1 -1
  59. package/bin/lib/Image/ExifTool/Writer.pl +150 -36
  60. package/bin/lib/Image/ExifTool/XMP.pm +19 -4
  61. package/bin/lib/Image/ExifTool/XMP2.pl +2 -1
  62. package/bin/lib/Image/ExifTool.pm +248 -54
  63. package/bin/lib/Image/ExifTool.pod +94 -58
  64. package/bin/perl-Image-ExifTool.spec +18 -18
  65. package/bin/pp_build_exe.args +7 -6
  66. package/package.json +3 -3
@@ -24,6 +24,9 @@
24
24
  # extension is used.
25
25
  # 5) The -fileOrder option may be used to control the order of the
26
26
  # generated placemarks when processing multiple files.
27
+ # 6) The "0" in the coordinates line may be changed to "$gpsaltitude#"
28
+ # and the altitudeMode may be changed to "absolute" to store
29
+ # altitude information if it exists in the track log.
27
30
  #------------------------------------------------------------------------------
28
31
  #[HEAD]<?xml version="1.0" encoding="UTF-8"?>
29
32
  #[HEAD]<kml xmlns="http://earth.google.com/kml/2.0">
@@ -21,6 +21,9 @@
21
21
  # 2) The -fileOrder option may be used to control the order of the
22
22
  # waypoints when processing multiple still-image files, or the
23
23
  # order of the tracks when processing multiple video files.
24
+ # 3) The "0" in the BODY line below may be changed to "$gpsaltitude#"
25
+ # and the altitudeMode may be changed to "absolute" to store
26
+ # altitude information if it exists in the track log.
24
27
  #------------------------------------------------------------------------------
25
28
  #[HEAD]<?xml version="1.0" encoding="UTF-8"?>
26
29
  #[HEAD]<kml xmlns="http://earth.google.com/kml/2.0">
@@ -18,7 +18,7 @@ use vars qw($VERSION);
18
18
  use Image::ExifTool qw(:DataAccess :Utils);
19
19
  use Image::ExifTool::ID3;
20
20
 
21
- $VERSION = '1.11';
21
+ $VERSION = '1.12';
22
22
 
23
23
  # information for time/date-based tags (time zero is Jan 1, 1904)
24
24
  my %timeInfo = (
@@ -203,7 +203,7 @@ sub ProcessAIFF($$)
203
203
  return 1 if $fast3;
204
204
  $tagTablePtr = GetTagTable('Image::ExifTool::DjVu::Main');
205
205
  # modify FileType to indicate a multi-page document
206
- $$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM';
206
+ $$et{VALUE}{FileType} .= " (multi-page)" if $buf2 eq 'DJVM' and $$et{VALUE}{FileType};
207
207
  $type = 'DjVu';
208
208
  } else {
209
209
  return 0 unless $buff =~ /^FORM....(AIF(F|C))/s;
@@ -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.06';
18
+ $VERSION = '1.07';
19
19
 
20
20
  # APE metadata blocks
21
21
  %Image::ExifTool::APE::Main = (
@@ -133,7 +133,7 @@ sub ProcessAPE($$)
133
133
 
134
134
  # check APE signature and process audio information
135
135
  # unless this is some other type of file
136
- unless ($$et{VALUE}{FileType}) {
136
+ unless ($$et{FileType}) {
137
137
  $raf->Read($buff, 32) == 32 or return 0;
138
138
  $buff =~ /^(MAC |APETAGEX)/ or return 0;
139
139
  $et->SetFileType();
@@ -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.50';
38
+ $VERSION = '3.52';
39
39
  @ISA = qw(Exporter);
40
40
 
41
41
  sub NumbersFirst($$);
@@ -184,7 +184,8 @@ gives the order of values for a serial data stream.
184
184
  A B<Tag Name> is the handle by which the information is accessed in
185
185
  ExifTool. In some instances, more than one name may correspond to a single
186
186
  tag ID. In these cases, the actual name used depends on the context in
187
- which the information is found. Case is not significant for tag names. A
187
+ which the information is found. Valid characters in a tag name are A-Z,
188
+ a-z, 0-9, hyphen (-) and underline (_). Case is not significant. A
188
189
  question mark (C<?>) after a tag name indicates that the information is
189
190
  either not understood, not verified, or not very useful -- these tags are
190
191
  not extracted by ExifTool unless the L<Unknown|../ExifTool.html#Unknown> (-u) option is enabled. Be
@@ -314,10 +315,12 @@ C<integer> is a string of digits (possibly beginning with a '+' or '-'),
314
315
  C<real> is a floating point number, C<rational> is entered as a floating
315
316
  point number but stored as two C<integer> strings separated by a '/'
316
317
  character, C<date> is a date/time string entered in the format "YYYY:mm:dd
317
- HH:MM:SS[.ss][+/-HH:MM]", C<boolean> is either "True" or "False" (but "true"
318
- and "false" may be written as a ValueConv value for compatibility with
319
- non-conforming applications), C<struct> indicates a structured tag, and
320
- C<lang-alt> is a tag that supports alternate languages.
318
+ HH:MM:SS[.ss][+/-HH:MM]" but some partial date/time formats are also
319
+ accepted (see L<https://exiftool.org/faq.html#Q5>), C<boolean> is either
320
+ "True" or "False" (but "true" and "false" may be written as a ValueConv
321
+ value for compatibility with non-conforming applications), C<struct>
322
+ indicates a structured tag, and C<lang-alt> is a tag that supports alternate
323
+ languages.
321
324
 
322
325
  When reading, C<struct> tags are extracted only if the L<Struct|../ExifTool.html#Struct> (-struct)
323
326
  option is used. Otherwise the corresponding I<Flattened> tags, indicated by
@@ -443,6 +446,11 @@ QuickTime-based files; it extracts other track-specific and timed metadata,
443
446
  but can not yet edit tags in these locations (with the exception of
444
447
  track-level date/time tags).
445
448
 
449
+ Beware that the Keys tags are actually stored inside the ItemList in the
450
+ file, so deleting the ItemList group as a block (ie. C<-ItemList:all=>) also
451
+ deletes Keys tags. Instead, to preserve Keys tags the ItemList tags may be
452
+ deleted individually with C<-QuickTime:ItemList:all=>.
453
+
446
454
  Alternate language tags may be accessed for
447
455
  L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and
448
456
  L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags> tags by adding
@@ -1049,7 +1057,7 @@ TagID: foreach $tagID (@keys) {
1049
1057
  if ($$tagInfo{SubIFD}) {
1050
1058
  warn "Warning: Wrong SubDirectory Start for SubIFD tag - $short $name\n" unless $isSub;
1051
1059
  } else {
1052
- warn "Warning: SubIFD flag not set for $short $name\n" if $isSub;
1060
+ warn "Warning: SubIFD flag not set for $short $name\n" if $isSub and not $processBinaryData;
1053
1061
  }
1054
1062
  if ($$tagInfo{Notes}) {
1055
1063
  my $note = $$tagInfo{Notes};
@@ -1199,6 +1207,7 @@ TagID: foreach $tagID (@keys) {
1199
1207
  $sepTable{$s} = $printConv;
1200
1208
  # add PrintHex flag to PrintConv so we can check it later
1201
1209
  $$printConv{PrintHex} = 1 if $$tagInfo{PrintHex};
1210
+ $$printConv{PrintInt} = 1 if $$tagInfo{PrintInt};
1202
1211
  $$printConv{PrintString} = 1 if $$tagInfo{PrintString};
1203
1212
  } else {
1204
1213
  $caseInsensitive = 0;
@@ -1214,22 +1223,18 @@ TagID: foreach $tagID (@keys) {
1214
1223
  next if $_ eq '' and $$printConv{$_} eq '';
1215
1224
  $_ eq 'BITMASK' and $bits = $$printConv{$_}, next;
1216
1225
  $_ eq 'OTHER' and next;
1217
- my $index;
1218
- if (($$tagInfo{PrintHex} or $$printConv{BITMASK}) and /^-?\d+$/) {
1226
+ my $index = $_;
1227
+ $index =~ s/\.\d+$// if $$tagInfo{PrintInt};
1228
+ if (($$tagInfo{PrintHex} or $$printConv{BITMASK}) and $index =~ /^-?\d+$/) {
1219
1229
  my $dig = $$tagInfo{PrintHex} || 1;
1220
- if ($_ >= 0) {
1221
- $index = sprintf('0x%.*x', $dig, $_);
1230
+ if ($index >= 0) {
1231
+ $index = sprintf('0x%.*x', $dig, $index);
1222
1232
  } elsif ($format and $format =~ /int(16|32)/) {
1223
1233
  # mask off unused bits of signed integer hex value
1224
1234
  my $mask = { 16 => 0xffff, 32 => 0xffffffff }->{$1};
1225
- $index = sprintf('0x%.*x', $dig, $_ & $mask);
1226
- } else {
1227
- $index = $_;
1235
+ $index = sprintf('0x%.*x', $dig, $index & $mask);
1228
1236
  }
1229
- } elsif (/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/ and not $$tagInfo{PrintString}) {
1230
- $index = $_;
1231
- } else {
1232
- $index = $_;
1237
+ } elsif ($$tagInfo{PrintString} or not /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/) {
1233
1238
  # translate unprintable values
1234
1239
  if ($index =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg) {
1235
1240
  $index = qq{"$index"};
@@ -2203,7 +2208,7 @@ sub WriteTagNames($$)
2203
2208
  my $wid = 0;
2204
2209
  my @keys;
2205
2210
  foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
2206
- next if /^(Notes|PrintHex|PrintString|OTHER)$/;
2211
+ next if /^(Notes|PrintHex|PrintInt|PrintString|OTHER)$/;
2207
2212
  $align = '' if $align and /[^\d]/;
2208
2213
  my $w = length($_) + length($$printConv{$_});
2209
2214
  $wid = $w if $wid < $w;
@@ -2231,6 +2236,7 @@ sub WriteTagNames($$)
2231
2236
  if (defined $key) {
2232
2237
  $index = $key;
2233
2238
  $prt = '= ' . EscapeHTML($$printConv{$key});
2239
+ $index =~ s/\.\d+$// if $$printConv{PrintInt};
2234
2240
  if ($$printConv{PrintHex}) {
2235
2241
  $index =~ s/(\.\d+)$//; # remove decimal
2236
2242
  $index = sprintf('0x%x',$index);
@@ -88,18 +88,13 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '4.64';
91
+ $VERSION = '4.66';
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)
95
95
  # --> have relaxed this for new lenses because Canon has been
96
96
  # consistent about keeping "USM" in the model name
97
97
  %canonLensTypes = ( #4
98
- Notes => q{
99
- Decimal values have been added to differentiate lenses which would otherwise
100
- have the same LensType, and are used by the Composite LensID tag when
101
- attempting to identify the specific lens model.
102
- },
103
98
  -1 => 'n/a',
104
99
  1 => 'Canon EF 50mm f/1.8',
105
100
  2 => 'Canon EF 28mm f/2.8 or Sigma Lens',
@@ -621,8 +616,10 @@ $VERSION = '4.64';
621
616
  '61182.41' => 'Canon RF 1200mm F8L IS USM + RF1.4x', #42
622
617
  '61182.42' => 'Canon RF 1200mm F8L IS USM + RF2x', #42
623
618
  '61182.43' => 'Canon RF 135mm F1.8 L IS USM', #42
619
+ '61182.44' => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
620
+ '61182.45' => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
624
621
  # we need the RFLensType values for the following...
625
- '61182.44' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
622
+ '61182.46' => 'Canon RF 5.2mm F2.8L Dual Fisheye 3D VR', #PH (NC)
626
623
  65535 => 'n/a',
627
624
  );
628
625
 
@@ -983,7 +980,9 @@ $VERSION = '4.64';
983
980
  0x80000465 => 'EOS R10', #42
984
981
  0x80000467 => 'PowerShot ZOOM',
985
982
  0x80000468 => 'EOS M50 Mark II / Kiss M2', #IB
983
+ 0x80000480 => 'EOS R50', #42
986
984
  0x80000481 => 'EOS R6 Mark II', #42
985
+ 0x80000487 => 'EOS R8', #42
987
986
  0x80000520 => 'EOS D2000C', #IB
988
987
  0x80000560 => 'EOS D6000C', #PH (guess)
989
988
  );
@@ -2398,6 +2397,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2398
2397
  DataMember => 'LensType',
2399
2398
  ValueConvInv => 'int($val)', # (must truncate decimal part)
2400
2399
  PrintConv => \%canonLensTypes,
2400
+ PrintInt => 1,
2401
2401
  },
2402
2402
  23 => {
2403
2403
  Name => 'MaxFocalLength',
@@ -3056,6 +3056,7 @@ my %ciMaxFocal = (
3056
3056
  RawConv => '$val ? $val : undef', # don't use if value is zero
3057
3057
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3058
3058
  PrintConv => \%canonLensTypes,
3059
+ PrintInt => 1,
3059
3060
  },
3060
3061
  0x0e => {
3061
3062
  Name => 'MinFocalLength',
@@ -3171,6 +3172,7 @@ my %ciMaxFocal = (
3171
3172
  RawConv => '$val ? $val : undef', # don't use if value is zero
3172
3173
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3173
3174
  PrintConv => \%canonLensTypes,
3175
+ PrintInt => 1,
3174
3176
  },
3175
3177
  0x11 => { %ciMinFocal }, #9
3176
3178
  0x13 => { %ciMaxFocal }, #9
@@ -3248,6 +3250,7 @@ my %ciMaxFocal = (
3248
3250
  RawConv => '$val ? $val : undef', # don't use if value is zero
3249
3251
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3250
3252
  PrintConv => \%canonLensTypes,
3253
+ PrintInt => 1,
3251
3254
  },
3252
3255
  0x11 => { %ciMinFocal },
3253
3256
  0x13 => { %ciMaxFocal },
@@ -3343,6 +3346,7 @@ my %ciMaxFocal = (
3343
3346
  SeparateTable => 1,
3344
3347
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3345
3348
  PrintConv => \%canonLensTypes,
3349
+ PrintInt => 1,
3346
3350
  },
3347
3351
  0x113 => { %ciMinFocal },
3348
3352
  0x115 => { %ciMaxFocal },
@@ -3498,6 +3502,7 @@ my %ciMaxFocal = (
3498
3502
  SeparateTable => 1,
3499
3503
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3500
3504
  PrintConv => \%canonLensTypes,
3505
+ PrintInt => 1,
3501
3506
  },
3502
3507
  0x151 => { %ciMinFocal },
3503
3508
  0x153 => { %ciMaxFocal,
@@ -3606,6 +3611,7 @@ my %ciMaxFocal = (
3606
3611
  SeparateTable => 1,
3607
3612
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3608
3613
  PrintConv => \%canonLensTypes,
3614
+ PrintInt => 1,
3609
3615
  },
3610
3616
  0x1a9 => { %ciMinFocal },
3611
3617
  0x1ab => { %ciMaxFocal,
@@ -3657,6 +3663,7 @@ my %ciMaxFocal = (
3657
3663
  RawConv => '$val ? $val : undef', # don't use if value is zero
3658
3664
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3659
3665
  PrintConv => \%canonLensTypes,
3666
+ PrintInt => 1,
3660
3667
  },
3661
3668
  0x17 => { %ciCameraTemperature }, #PH
3662
3669
  0x1b => { %ciMacroMagnification }, #PH
@@ -3717,6 +3724,7 @@ my %ciMaxFocal = (
3717
3724
  SeparateTable => 1,
3718
3725
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3719
3726
  PrintConv => \%canonLensTypes,
3727
+ PrintInt => 1,
3720
3728
  },
3721
3729
  0xa4 => { #PH
3722
3730
  Name => 'FirmwareRevision',
@@ -3932,6 +3940,7 @@ my %ciMaxFocal = (
3932
3940
  SeparateTable => 1,
3933
3941
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3934
3942
  PrintConv => \%canonLensTypes,
3943
+ PrintInt => 1,
3935
3944
  },
3936
3945
  0xe8 => { %ciMinFocal },
3937
3946
  0xea => { %ciMaxFocal,
@@ -4056,6 +4065,7 @@ my %ciMaxFocal = (
4056
4065
  SeparateTable => 1,
4057
4066
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4058
4067
  PrintConv => \%canonLensTypes,
4068
+ PrintInt => 1,
4059
4069
  },
4060
4070
  0x155 => { %ciMinFocal },
4061
4071
  0x157 => { %ciMaxFocal,
@@ -4165,6 +4175,7 @@ my %ciMaxFocal = (
4165
4175
  SeparateTable => 1,
4166
4176
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4167
4177
  PrintConv => \%canonLensTypes,
4178
+ PrintInt => 1,
4168
4179
  },
4169
4180
  0x163 => { %ciMinFocal }, # (5DmkIII + 0x0e)
4170
4181
  0x165 => { %ciMaxFocal }, # (5DmkIII + 0x0e)
@@ -4312,6 +4323,7 @@ my %ciMaxFocal = (
4312
4323
  SeparateTable => 1,
4313
4324
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4314
4325
  PrintConv => \%canonLensTypes,
4326
+ PrintInt => 1,
4315
4327
  },
4316
4328
  0x114 => { %ciMinFocal },
4317
4329
  0x116 => { %ciMaxFocal },
@@ -4401,6 +4413,7 @@ my %ciMaxFocal = (
4401
4413
  SeparateTable => 1,
4402
4414
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4403
4415
  PrintConv => \%canonLensTypes,
4416
+ PrintInt => 1,
4404
4417
  },
4405
4418
  0xd8 => { %ciMinFocal }, #15
4406
4419
  0xda => { %ciMaxFocal }, #15
@@ -4536,6 +4549,7 @@ my %ciMaxFocal = (
4536
4549
  SeparateTable => 1,
4537
4550
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4538
4551
  PrintConv => \%canonLensTypes,
4552
+ PrintInt => 1,
4539
4553
  },
4540
4554
  0xec => { %ciMinFocal },
4541
4555
  0xee => { %ciMaxFocal,
@@ -4625,6 +4639,7 @@ my %ciMaxFocal = (
4625
4639
  SeparateTable => 1,
4626
4640
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4627
4641
  PrintConv => \%canonLensTypes,
4642
+ PrintInt => 1,
4628
4643
  },
4629
4644
  0xea => { %ciMinFocal },
4630
4645
  0xec => { %ciMaxFocal },
@@ -4706,6 +4721,7 @@ my %ciMaxFocal = (
4706
4721
  SeparateTable => 1,
4707
4722
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4708
4723
  PrintConv => \%canonLensTypes,
4724
+ PrintInt => 1,
4709
4725
  },
4710
4726
  0x168 => { %ciMinFocal },
4711
4727
  0x16a => { %ciMaxFocal },
@@ -4773,6 +4789,7 @@ my %ciMaxFocal = (
4773
4789
  SeparateTable => 1,
4774
4790
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4775
4791
  PrintConv => \%canonLensTypes,
4792
+ PrintInt => 1,
4776
4793
  },
4777
4794
  0x18b => { %ciMinFocal },
4778
4795
  0x18d => { %ciMaxFocal },
@@ -4856,6 +4873,7 @@ my %ciMaxFocal = (
4856
4873
  SeparateTable => 1,
4857
4874
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4858
4875
  PrintConv => \%canonLensTypes,
4876
+ PrintInt => 1,
4859
4877
  },
4860
4878
  0x107 => { #PH
4861
4879
  Name => 'FirmwareVersion',
@@ -4971,6 +4989,7 @@ my %ciMaxFocal = (
4971
4989
  SeparateTable => 1,
4972
4990
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4973
4991
  PrintConv => \%canonLensTypes,
4992
+ PrintInt => 1,
4974
4993
  },
4975
4994
  0xf8 => { %ciMinFocal },
4976
4995
  0xfa => { %ciMaxFocal },
@@ -5066,6 +5085,7 @@ my %ciMaxFocal = (
5066
5085
  SeparateTable => 1,
5067
5086
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5068
5087
  PrintConv => \%canonLensTypes,
5088
+ PrintInt => 1,
5069
5089
  },
5070
5090
  0x101 => { %ciMinFocal }, # (500D + 9)
5071
5091
  0x103 => { %ciMaxFocal }, # (500D + 9)
@@ -5161,6 +5181,7 @@ my %ciMaxFocal = (
5161
5181
  SeparateTable => 1,
5162
5182
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5163
5183
  PrintConv => \%canonLensTypes,
5184
+ PrintInt => 1,
5164
5185
  },
5165
5186
  0xec => { %ciMinFocal }, # (60D + 2)
5166
5187
  0xee => { %ciMaxFocal }, # (60D + 2)
@@ -5243,6 +5264,7 @@ my %ciMaxFocal = (
5243
5264
  SeparateTable => 1,
5244
5265
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5245
5266
  PrintConv => \%canonLensTypes,
5267
+ PrintInt => 1,
5246
5268
  },
5247
5269
  0x129 => { %ciMinFocal },
5248
5270
  0x12b => { %ciMaxFocal },
@@ -5355,6 +5377,7 @@ my %ciMaxFocal = (
5355
5377
  SeparateTable => 1,
5356
5378
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5357
5379
  PrintConv => \%canonLensTypes,
5380
+ PrintInt => 1,
5358
5381
  },
5359
5382
  0x186 => { %ciMinFocal },
5360
5383
  0x188 => { %ciMaxFocal },
@@ -5429,6 +5452,7 @@ my %ciMaxFocal = (
5429
5452
  SeparateTable => 1,
5430
5453
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5431
5454
  PrintConv => \%canonLensTypes,
5455
+ PrintInt => 1,
5432
5456
  },
5433
5457
  0xe4 => { %ciMinFocal }, #PH
5434
5458
  0xe6 => { %ciMaxFocal }, #PH
@@ -6840,6 +6864,8 @@ my %ciMaxFocal = (
6840
6864
  300 => 'Canon RF 1200mm F8L IS USM + RF2x', #42
6841
6865
  302 => 'Canon RF 15-30mm F4.5-6.3 IS STM', #42
6842
6866
  303 => 'Canon RF 135mm F1.8 L IS USM', #42
6867
+ 304 => 'Canon RF 24-50mm F4.5-6.3 IS STM', #42
6868
+ 305 => 'Canon RF-S 55-210mm F5-7.1 IS STM', #42
6843
6869
  # Note: add new RF lenses to %canonLensTypes with ID 61182
6844
6870
  },
6845
6871
  },
@@ -21,7 +21,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
21
21
  use Image::ExifTool::Exif;
22
22
  use Image::ExifTool::Canon;
23
23
 
24
- $VERSION = '1.59';
24
+ $VERSION = '1.60';
25
25
 
26
26
  sub WriteCRW($$);
27
27
  sub ProcessCanonRaw($$$);
@@ -698,6 +698,10 @@ sub ProcessCanonRaw($$$)
698
698
  $format ne 'string' and not $subdir;
699
699
  } else {
700
700
  $valueDataPos = $ptr;
701
+ # do MD5 of image data if requested
702
+ if ($$et{ImageDataMD5} and $tagID == 0x2005) {
703
+ $raf->Seek($ptr, 0) and $et->ImageDataMD5($raf, $size, 'raw');
704
+ }
701
705
  if ($size <= 512 or ($verbose > 2 and $size <= 65536)
702
706
  or ($tagInfo and ($$tagInfo{SubDirectory}
703
707
  or grep(/^$$tagInfo{Name}$/i, $et->GetRequestedTags()) )))
@@ -16,7 +16,7 @@ use Image::ExifTool::Exif;
16
16
  use Image::ExifTool::XMP;
17
17
  use Image::ExifTool::GPS;
18
18
 
19
- $VERSION = '1.06';
19
+ $VERSION = '1.08';
20
20
 
21
21
  sub ProcessDJIInfo($$$);
22
22
 
@@ -96,6 +96,31 @@ my %convFloat2 = (
96
96
  # (nothing yet decoded from device header)
97
97
  );
98
98
 
99
+ # thermal parameters in APP4 of DJI M3T, H20N, M2EA and some M30T images (ref PH/forum11401)
100
+ %Image::ExifTool::DJI::ThermalParams2 = (
101
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
102
+ GROUPS => { 0 => 'APP4', 2 => 'Image' },
103
+ NOTES => 'Thermal parameters extracted from APP4 of DJI M3T RJPEG files.',
104
+ 0x00 => { Name => 'AmbientTemperature', Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' }, # (NC)
105
+ 0x04 => { Name => 'ObjectDistance', Format => 'float', PrintConv => 'sprintf("%.1f m",$val)' },
106
+ 0x08 => { Name => 'Emissivity', Format => 'float', PrintConv => 'sprintf("%.2f",$val)' },
107
+ 0x0c => { Name => 'RelativeHumidity', Format => 'float', PrintConv => 'sprintf("%g %%",$val*100)' },
108
+ 0x10 => { Name => 'ReflectedTemperature',Format => 'float', PrintConv => 'sprintf("%.1f C",$val)' },
109
+ 0x65 => { Name => 'IDString', Format => 'string[16]' }, # (NC)
110
+ );
111
+
112
+ # thermal parameters in APP4 of some DJI M30T images (ref PH)
113
+ %Image::ExifTool::DJI::ThermalParams3 = (
114
+ PROCESS_PROC => \&Image::ExifTool::ProcessBinaryData,
115
+ GROUPS => { 0 => 'APP4', 2 => 'Image' },
116
+ NOTES => 'Thermal parameters extracted from APP4 of some DJI RJPEG files.',
117
+ # 0x00 - 0xaa553800 - params3 magic number
118
+ 0x04 => { Name => 'RelativeHumidity', Format => 'int16u' },
119
+ 0x06 => { Name => 'ObjectDistance', Format => 'int16u', ValueConv => '$val / 10' },
120
+ 0x08 => { Name => 'Emissivity', Format => 'int16u', ValueConv => '$val / 100' },
121
+ 0x0a => { Name => 'ReflectedTemperature',Format => 'int16u', ValueConv => '$val / 10' },
122
+ );
123
+
99
124
  %Image::ExifTool::DJI::XMP = (
100
125
  %Image::ExifTool::XMP::xmpTableDefaults,
101
126
  GROUPS => { 0 => 'XMP', 1 => 'XMP-drone-dji', 2 => 'Location' },
@@ -161,7 +186,7 @@ my %convFloat2 = (
161
186
  );
162
187
 
163
188
  #------------------------------------------------------------------------------
164
- # Process DJI infor (ref PH)
189
+ # Process DJI info (ref PH)
165
190
  # Inputs: 0) ExifTool ref, 1) dirInfo ref, 2) tag table ref
166
191
  # Returns: 1 on success
167
192
  sub ProcessDJIInfo($$$)
@@ -174,6 +199,7 @@ sub ProcessDJIInfo($$$)
174
199
  my $buff = substr($$dataPt, $dirStart, $dirLen);
175
200
  $dataPt = \$buff;
176
201
  }
202
+ $et->VerboseDir('DJIInfo', undef, length $$dataPt);
177
203
  while ($$dataPt =~ /\G\[(.*?)\](?=(\[|$))/sg) {
178
204
  my ($tag, $val) = split /:/, $1, 2;
179
205
  next unless defined $tag and defined $val;