exiftool-vendored.exe 12.56.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 (54) hide show
  1. package/bin/exiftool_files/Changes +80 -5
  2. package/bin/exiftool_files/README +2 -2
  3. package/bin/exiftool_files/config_files/example.config +1 -0
  4. package/bin/exiftool_files/config_files/rotate_regions.config +1 -1
  5. package/bin/exiftool_files/exiftool.pl +174 -99
  6. package/bin/exiftool_files/lib/Image/ExifTool/AIFF.pm +2 -2
  7. package/bin/exiftool_files/lib/Image/ExifTool/APE.pm +2 -2
  8. package/bin/exiftool_files/lib/Image/ExifTool/BuildTagLookup.pm +19 -15
  9. package/bin/exiftool_files/lib/Image/ExifTool/Canon.pm +26 -6
  10. package/bin/exiftool_files/lib/Image/ExifTool/CanonRaw.pm +5 -1
  11. package/bin/exiftool_files/lib/Image/ExifTool/DJI.pm +28 -2
  12. package/bin/exiftool_files/lib/Image/ExifTool/Exif.pm +77 -19
  13. package/bin/exiftool_files/lib/Image/ExifTool/FlashPix.pm +32 -10
  14. package/bin/exiftool_files/lib/Image/ExifTool/FujiFilm.pm +7 -3
  15. package/bin/exiftool_files/lib/Image/ExifTool/GPS.pm +7 -2
  16. package/bin/exiftool_files/lib/Image/ExifTool/Geotag.pm +30 -7
  17. package/bin/exiftool_files/lib/Image/ExifTool/JPEG.pm +14 -2
  18. package/bin/exiftool_files/lib/Image/ExifTool/Jpeg2000.pm +5 -5
  19. package/bin/exiftool_files/lib/Image/ExifTool/LIF.pm +10 -2
  20. package/bin/exiftool_files/lib/Image/ExifTool/LNK.pm +5 -4
  21. package/bin/exiftool_files/lib/Image/ExifTool/MIE.pm +3 -3
  22. package/bin/exiftool_files/lib/Image/ExifTool/MPEG.pm +2 -2
  23. package/bin/exiftool_files/lib/Image/ExifTool/MakerNotes.pm +3 -2
  24. package/bin/exiftool_files/lib/Image/ExifTool/Minolta.pm +6 -7
  25. package/bin/exiftool_files/lib/Image/ExifTool/MinoltaRaw.pm +2 -1
  26. package/bin/exiftool_files/lib/Image/ExifTool/Nikon.pm +1003 -907
  27. package/bin/exiftool_files/lib/Image/ExifTool/NikonCustom.pm +2 -2
  28. package/bin/exiftool_files/lib/Image/ExifTool/NikonSettings.pm +1 -1
  29. package/bin/exiftool_files/lib/Image/ExifTool/Olympus.pm +88 -6
  30. package/bin/exiftool_files/lib/Image/ExifTool/PNG.pm +10 -2
  31. package/bin/exiftool_files/lib/Image/ExifTool/PanasonicRaw.pm +27 -1
  32. package/bin/exiftool_files/lib/Image/ExifTool/Pentax.pm +8 -5
  33. package/bin/exiftool_files/lib/Image/ExifTool/PhaseOne.pm +14 -1
  34. package/bin/exiftool_files/lib/Image/ExifTool/Photoshop.pm +38 -7
  35. package/bin/exiftool_files/lib/Image/ExifTool/QuickTime.pm +44 -13
  36. package/bin/exiftool_files/lib/Image/ExifTool/QuickTimeStream.pl +40 -6
  37. package/bin/exiftool_files/lib/Image/ExifTool/README +19 -2
  38. package/bin/exiftool_files/lib/Image/ExifTool/RIFF.pm +34 -13
  39. package/bin/exiftool_files/lib/Image/ExifTool/Rawzor.pm +2 -2
  40. package/bin/exiftool_files/lib/Image/ExifTool/Ricoh.pm +2 -1
  41. package/bin/exiftool_files/lib/Image/ExifTool/Sigma.pm +5 -4
  42. package/bin/exiftool_files/lib/Image/ExifTool/SigmaRaw.pm +9 -3
  43. package/bin/exiftool_files/lib/Image/ExifTool/Sony.pm +24 -1
  44. package/bin/exiftool_files/lib/Image/ExifTool/TagLookup.pm +4678 -4628
  45. package/bin/exiftool_files/lib/Image/ExifTool/TagNames.pod +305 -113
  46. package/bin/exiftool_files/lib/Image/ExifTool/Validate.pm +5 -5
  47. package/bin/exiftool_files/lib/Image/ExifTool/WriteExif.pl +42 -0
  48. package/bin/exiftool_files/lib/Image/ExifTool/WriteXMP.pl +1 -1
  49. package/bin/exiftool_files/lib/Image/ExifTool/Writer.pl +150 -36
  50. package/bin/exiftool_files/lib/Image/ExifTool/XMP.pm +19 -4
  51. package/bin/exiftool_files/lib/Image/ExifTool/XMP2.pl +2 -1
  52. package/bin/exiftool_files/lib/Image/ExifTool.pm +195 -42
  53. package/bin/exiftool_files/lib/Image/ExifTool.pod +44 -9
  54. package/package.json +2 -2
@@ -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
@@ -445,6 +446,11 @@ QuickTime-based files; it extracts other track-specific and timed metadata,
445
446
  but can not yet edit tags in these locations (with the exception of
446
447
  track-level date/time tags).
447
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
+
448
454
  Alternate language tags may be accessed for
449
455
  L<ItemList|Image::ExifTool::TagNames/QuickTime ItemList Tags> and
450
456
  L<Keys|Image::ExifTool::TagNames/QuickTime Keys Tags> tags by adding
@@ -1051,7 +1057,7 @@ TagID: foreach $tagID (@keys) {
1051
1057
  if ($$tagInfo{SubIFD}) {
1052
1058
  warn "Warning: Wrong SubDirectory Start for SubIFD tag - $short $name\n" unless $isSub;
1053
1059
  } else {
1054
- 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;
1055
1061
  }
1056
1062
  if ($$tagInfo{Notes}) {
1057
1063
  my $note = $$tagInfo{Notes};
@@ -1201,6 +1207,7 @@ TagID: foreach $tagID (@keys) {
1201
1207
  $sepTable{$s} = $printConv;
1202
1208
  # add PrintHex flag to PrintConv so we can check it later
1203
1209
  $$printConv{PrintHex} = 1 if $$tagInfo{PrintHex};
1210
+ $$printConv{PrintInt} = 1 if $$tagInfo{PrintInt};
1204
1211
  $$printConv{PrintString} = 1 if $$tagInfo{PrintString};
1205
1212
  } else {
1206
1213
  $caseInsensitive = 0;
@@ -1216,22 +1223,18 @@ TagID: foreach $tagID (@keys) {
1216
1223
  next if $_ eq '' and $$printConv{$_} eq '';
1217
1224
  $_ eq 'BITMASK' and $bits = $$printConv{$_}, next;
1218
1225
  $_ eq 'OTHER' and next;
1219
- my $index;
1220
- 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+$/) {
1221
1229
  my $dig = $$tagInfo{PrintHex} || 1;
1222
- if ($_ >= 0) {
1223
- $index = sprintf('0x%.*x', $dig, $_);
1230
+ if ($index >= 0) {
1231
+ $index = sprintf('0x%.*x', $dig, $index);
1224
1232
  } elsif ($format and $format =~ /int(16|32)/) {
1225
1233
  # mask off unused bits of signed integer hex value
1226
1234
  my $mask = { 16 => 0xffff, 32 => 0xffffffff }->{$1};
1227
- $index = sprintf('0x%.*x', $dig, $_ & $mask);
1228
- } else {
1229
- $index = $_;
1235
+ $index = sprintf('0x%.*x', $dig, $index & $mask);
1230
1236
  }
1231
- } elsif (/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/ and not $$tagInfo{PrintString}) {
1232
- $index = $_;
1233
- } else {
1234
- $index = $_;
1237
+ } elsif ($$tagInfo{PrintString} or not /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/) {
1235
1238
  # translate unprintable values
1236
1239
  if ($index =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg) {
1237
1240
  $index = qq{"$index"};
@@ -2205,7 +2208,7 @@ sub WriteTagNames($$)
2205
2208
  my $wid = 0;
2206
2209
  my @keys;
2207
2210
  foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
2208
- next if /^(Notes|PrintHex|PrintString|OTHER)$/;
2211
+ next if /^(Notes|PrintHex|PrintInt|PrintString|OTHER)$/;
2209
2212
  $align = '' if $align and /[^\d]/;
2210
2213
  my $w = length($_) + length($$printConv{$_});
2211
2214
  $wid = $w if $wid < $w;
@@ -2233,6 +2236,7 @@ sub WriteTagNames($$)
2233
2236
  if (defined $key) {
2234
2237
  $index = $key;
2235
2238
  $prt = '= ' . EscapeHTML($$printConv{$key});
2239
+ $index =~ s/\.\d+$// if $$printConv{PrintInt};
2236
2240
  if ($$printConv{PrintHex}) {
2237
2241
  $index =~ s/(\.\d+)$//; # remove decimal
2238
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.65';
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',
@@ -2402,6 +2397,7 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2402
2397
  DataMember => 'LensType',
2403
2398
  ValueConvInv => 'int($val)', # (must truncate decimal part)
2404
2399
  PrintConv => \%canonLensTypes,
2400
+ PrintInt => 1,
2405
2401
  },
2406
2402
  23 => {
2407
2403
  Name => 'MaxFocalLength',
@@ -3060,6 +3056,7 @@ my %ciMaxFocal = (
3060
3056
  RawConv => '$val ? $val : undef', # don't use if value is zero
3061
3057
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3062
3058
  PrintConv => \%canonLensTypes,
3059
+ PrintInt => 1,
3063
3060
  },
3064
3061
  0x0e => {
3065
3062
  Name => 'MinFocalLength',
@@ -3175,6 +3172,7 @@ my %ciMaxFocal = (
3175
3172
  RawConv => '$val ? $val : undef', # don't use if value is zero
3176
3173
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3177
3174
  PrintConv => \%canonLensTypes,
3175
+ PrintInt => 1,
3178
3176
  },
3179
3177
  0x11 => { %ciMinFocal }, #9
3180
3178
  0x13 => { %ciMaxFocal }, #9
@@ -3252,6 +3250,7 @@ my %ciMaxFocal = (
3252
3250
  RawConv => '$val ? $val : undef', # don't use if value is zero
3253
3251
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3254
3252
  PrintConv => \%canonLensTypes,
3253
+ PrintInt => 1,
3255
3254
  },
3256
3255
  0x11 => { %ciMinFocal },
3257
3256
  0x13 => { %ciMaxFocal },
@@ -3347,6 +3346,7 @@ my %ciMaxFocal = (
3347
3346
  SeparateTable => 1,
3348
3347
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3349
3348
  PrintConv => \%canonLensTypes,
3349
+ PrintInt => 1,
3350
3350
  },
3351
3351
  0x113 => { %ciMinFocal },
3352
3352
  0x115 => { %ciMaxFocal },
@@ -3502,6 +3502,7 @@ my %ciMaxFocal = (
3502
3502
  SeparateTable => 1,
3503
3503
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3504
3504
  PrintConv => \%canonLensTypes,
3505
+ PrintInt => 1,
3505
3506
  },
3506
3507
  0x151 => { %ciMinFocal },
3507
3508
  0x153 => { %ciMaxFocal,
@@ -3610,6 +3611,7 @@ my %ciMaxFocal = (
3610
3611
  SeparateTable => 1,
3611
3612
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3612
3613
  PrintConv => \%canonLensTypes,
3614
+ PrintInt => 1,
3613
3615
  },
3614
3616
  0x1a9 => { %ciMinFocal },
3615
3617
  0x1ab => { %ciMaxFocal,
@@ -3661,6 +3663,7 @@ my %ciMaxFocal = (
3661
3663
  RawConv => '$val ? $val : undef', # don't use if value is zero
3662
3664
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3663
3665
  PrintConv => \%canonLensTypes,
3666
+ PrintInt => 1,
3664
3667
  },
3665
3668
  0x17 => { %ciCameraTemperature }, #PH
3666
3669
  0x1b => { %ciMacroMagnification }, #PH
@@ -3721,6 +3724,7 @@ my %ciMaxFocal = (
3721
3724
  SeparateTable => 1,
3722
3725
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3723
3726
  PrintConv => \%canonLensTypes,
3727
+ PrintInt => 1,
3724
3728
  },
3725
3729
  0xa4 => { #PH
3726
3730
  Name => 'FirmwareRevision',
@@ -3936,6 +3940,7 @@ my %ciMaxFocal = (
3936
3940
  SeparateTable => 1,
3937
3941
  ValueConvInv => 'int($val)', # (must truncate decimal part)
3938
3942
  PrintConv => \%canonLensTypes,
3943
+ PrintInt => 1,
3939
3944
  },
3940
3945
  0xe8 => { %ciMinFocal },
3941
3946
  0xea => { %ciMaxFocal,
@@ -4060,6 +4065,7 @@ my %ciMaxFocal = (
4060
4065
  SeparateTable => 1,
4061
4066
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4062
4067
  PrintConv => \%canonLensTypes,
4068
+ PrintInt => 1,
4063
4069
  },
4064
4070
  0x155 => { %ciMinFocal },
4065
4071
  0x157 => { %ciMaxFocal,
@@ -4169,6 +4175,7 @@ my %ciMaxFocal = (
4169
4175
  SeparateTable => 1,
4170
4176
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4171
4177
  PrintConv => \%canonLensTypes,
4178
+ PrintInt => 1,
4172
4179
  },
4173
4180
  0x163 => { %ciMinFocal }, # (5DmkIII + 0x0e)
4174
4181
  0x165 => { %ciMaxFocal }, # (5DmkIII + 0x0e)
@@ -4316,6 +4323,7 @@ my %ciMaxFocal = (
4316
4323
  SeparateTable => 1,
4317
4324
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4318
4325
  PrintConv => \%canonLensTypes,
4326
+ PrintInt => 1,
4319
4327
  },
4320
4328
  0x114 => { %ciMinFocal },
4321
4329
  0x116 => { %ciMaxFocal },
@@ -4405,6 +4413,7 @@ my %ciMaxFocal = (
4405
4413
  SeparateTable => 1,
4406
4414
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4407
4415
  PrintConv => \%canonLensTypes,
4416
+ PrintInt => 1,
4408
4417
  },
4409
4418
  0xd8 => { %ciMinFocal }, #15
4410
4419
  0xda => { %ciMaxFocal }, #15
@@ -4540,6 +4549,7 @@ my %ciMaxFocal = (
4540
4549
  SeparateTable => 1,
4541
4550
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4542
4551
  PrintConv => \%canonLensTypes,
4552
+ PrintInt => 1,
4543
4553
  },
4544
4554
  0xec => { %ciMinFocal },
4545
4555
  0xee => { %ciMaxFocal,
@@ -4629,6 +4639,7 @@ my %ciMaxFocal = (
4629
4639
  SeparateTable => 1,
4630
4640
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4631
4641
  PrintConv => \%canonLensTypes,
4642
+ PrintInt => 1,
4632
4643
  },
4633
4644
  0xea => { %ciMinFocal },
4634
4645
  0xec => { %ciMaxFocal },
@@ -4710,6 +4721,7 @@ my %ciMaxFocal = (
4710
4721
  SeparateTable => 1,
4711
4722
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4712
4723
  PrintConv => \%canonLensTypes,
4724
+ PrintInt => 1,
4713
4725
  },
4714
4726
  0x168 => { %ciMinFocal },
4715
4727
  0x16a => { %ciMaxFocal },
@@ -4777,6 +4789,7 @@ my %ciMaxFocal = (
4777
4789
  SeparateTable => 1,
4778
4790
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4779
4791
  PrintConv => \%canonLensTypes,
4792
+ PrintInt => 1,
4780
4793
  },
4781
4794
  0x18b => { %ciMinFocal },
4782
4795
  0x18d => { %ciMaxFocal },
@@ -4860,6 +4873,7 @@ my %ciMaxFocal = (
4860
4873
  SeparateTable => 1,
4861
4874
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4862
4875
  PrintConv => \%canonLensTypes,
4876
+ PrintInt => 1,
4863
4877
  },
4864
4878
  0x107 => { #PH
4865
4879
  Name => 'FirmwareVersion',
@@ -4975,6 +4989,7 @@ my %ciMaxFocal = (
4975
4989
  SeparateTable => 1,
4976
4990
  ValueConvInv => 'int($val)', # (must truncate decimal part)
4977
4991
  PrintConv => \%canonLensTypes,
4992
+ PrintInt => 1,
4978
4993
  },
4979
4994
  0xf8 => { %ciMinFocal },
4980
4995
  0xfa => { %ciMaxFocal },
@@ -5070,6 +5085,7 @@ my %ciMaxFocal = (
5070
5085
  SeparateTable => 1,
5071
5086
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5072
5087
  PrintConv => \%canonLensTypes,
5088
+ PrintInt => 1,
5073
5089
  },
5074
5090
  0x101 => { %ciMinFocal }, # (500D + 9)
5075
5091
  0x103 => { %ciMaxFocal }, # (500D + 9)
@@ -5165,6 +5181,7 @@ my %ciMaxFocal = (
5165
5181
  SeparateTable => 1,
5166
5182
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5167
5183
  PrintConv => \%canonLensTypes,
5184
+ PrintInt => 1,
5168
5185
  },
5169
5186
  0xec => { %ciMinFocal }, # (60D + 2)
5170
5187
  0xee => { %ciMaxFocal }, # (60D + 2)
@@ -5247,6 +5264,7 @@ my %ciMaxFocal = (
5247
5264
  SeparateTable => 1,
5248
5265
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5249
5266
  PrintConv => \%canonLensTypes,
5267
+ PrintInt => 1,
5250
5268
  },
5251
5269
  0x129 => { %ciMinFocal },
5252
5270
  0x12b => { %ciMaxFocal },
@@ -5359,6 +5377,7 @@ my %ciMaxFocal = (
5359
5377
  SeparateTable => 1,
5360
5378
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5361
5379
  PrintConv => \%canonLensTypes,
5380
+ PrintInt => 1,
5362
5381
  },
5363
5382
  0x186 => { %ciMinFocal },
5364
5383
  0x188 => { %ciMaxFocal },
@@ -5433,6 +5452,7 @@ my %ciMaxFocal = (
5433
5452
  SeparateTable => 1,
5434
5453
  ValueConvInv => 'int($val)', # (must truncate decimal part)
5435
5454
  PrintConv => \%canonLensTypes,
5455
+ PrintInt => 1,
5436
5456
  },
5437
5457
  0xe4 => { %ciMinFocal }, #PH
5438
5458
  0xe6 => { %ciMaxFocal }, #PH
@@ -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;