exiftool_vendored 12.57.0 → 12.58.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +14 -0
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +2 -2
  6. data/bin/config_files/rotate_regions.config +1 -1
  7. data/bin/exiftool +25 -21
  8. data/bin/lib/Image/ExifTool/AIFF.pm +2 -2
  9. data/bin/lib/Image/ExifTool/APE.pm +2 -2
  10. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +13 -14
  11. data/bin/lib/Image/ExifTool/Canon.pm +26 -6
  12. data/bin/lib/Image/ExifTool/DJI.pm +28 -2
  13. data/bin/lib/Image/ExifTool/Exif.pm +24 -5
  14. data/bin/lib/Image/ExifTool/FlashPix.pm +2 -2
  15. data/bin/lib/Image/ExifTool/FujiFilm.pm +1 -0
  16. data/bin/lib/Image/ExifTool/JPEG.pm +14 -2
  17. data/bin/lib/Image/ExifTool/LNK.pm +5 -4
  18. data/bin/lib/Image/ExifTool/MPEG.pm +2 -2
  19. data/bin/lib/Image/ExifTool/MakerNotes.pm +2 -2
  20. data/bin/lib/Image/ExifTool/Minolta.pm +6 -7
  21. data/bin/lib/Image/ExifTool/Nikon.pm +385 -110
  22. data/bin/lib/Image/ExifTool/Pentax.pm +8 -5
  23. data/bin/lib/Image/ExifTool/Photoshop.pm +3 -3
  24. data/bin/lib/Image/ExifTool/QuickTime.pm +5 -5
  25. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +1 -1
  26. data/bin/lib/Image/ExifTool/README +8 -0
  27. data/bin/lib/Image/ExifTool/RIFF.pm +3 -3
  28. data/bin/lib/Image/ExifTool/Rawzor.pm +2 -2
  29. data/bin/lib/Image/ExifTool/Sigma.pm +4 -4
  30. data/bin/lib/Image/ExifTool/Sony.pm +23 -1
  31. data/bin/lib/Image/ExifTool/TagLookup.pm +4457 -4441
  32. data/bin/lib/Image/ExifTool/TagNames.pod +76 -12
  33. data/bin/lib/Image/ExifTool/Validate.pm +5 -5
  34. data/bin/lib/Image/ExifTool/WriteExif.pl +42 -0
  35. data/bin/lib/Image/ExifTool/Writer.pl +3 -1
  36. data/bin/lib/Image/ExifTool/XMP.pm +2 -2
  37. data/bin/lib/Image/ExifTool.pm +57 -12
  38. data/bin/perl-Image-ExifTool.spec +1 -1
  39. data/lib/exiftool_vendored/version.rb +1 -1
  40. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c02a2a1efe1fc3f63f7527ed968432fc73d7e1ebeda7cfbf424413b8907bd0c
4
- data.tar.gz: 5140c2587870d324d63d4d35beb70d1cbbecb92a78fb6ea55d9885cf9f320c1b
3
+ metadata.gz: daebca4fbc1adcea00bcf7dc637e328f4534a115f69a17f10bca60f8a21dee01
4
+ data.tar.gz: 512c1da726768d49d97b8262303f8c524b4ea23ccc8c25f1350f93a121813be4
5
5
  SHA512:
6
- metadata.gz: edd012dc39bc24a6b257f147e5d698648c686aa54e1ac04229cd3cd4880a91d96e21f6f017305a6d763826470ef1f990e94221320bd1d7ee0a73fb5cb2b32ab4
7
- data.tar.gz: 78856db2a60493444afe450c663d190553147b651140c2f18a2a2641e8c9bc0d5af7f31bd0db4a5f55c89f72b460119192889f4f10190cad3a21bffae976e630
6
+ metadata.gz: 6d29ac70643b583a0d01c512e2054700e15cdf60091042ed4de7c3de85feca75fcd94b2201691a0360875c02b293cc00632c6dce29888e735a488dac50712c70
7
+ data.tar.gz: cee8f9dcbe026dc2e5bb1de5db902904c460c6e71cf4ab9ac64b9f2a8357c3857be328912f1deedf3f51c00f99b50f07b463884e60f235f858ef33bf5cd417f7
data/bin/Changes CHANGED
@@ -7,6 +7,20 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 12.50. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Mar. 15, 2023 - Version 12.58
11
+
12
+ - Added Extra ImageDataMD5 tag to calculate MD5 of image data only
13
+ - Added support for reading DJI APP4 and APP7 JPEG segments
14
+ - Added a new SonyModelID value
15
+ - Decode a few new Nikon tags (thanks Warren Hatch)
16
+ - Downgraded "Windows file times" to a minor warning when Win32::API or
17
+ Win32API::File is not installed while reading metadata
18
+ - Patched possible runtime warning when API IgnoreTags option is used to
19
+ ignore FileType
20
+ - Fixed problem extracting NetName from Windows LNK files
21
+ - Fixed issue where the %C filename format code would increment the count on
22
+ an output filename collision, but it is supposed to count the input files
23
+
10
24
  Feb. 23, 2023 - Version 12.57
11
25
 
12
26
  - Added two new Nikon Z lenses (thanks LibRaw)
data/bin/META.json CHANGED
@@ -47,5 +47,5 @@
47
47
  }
48
48
  },
49
49
  "release_status" : "stable",
50
- "version" : "12.57"
50
+ "version" : "12.58"
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.57
31
+ version: 12.58
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.57.tar.gz | tar -xf -
111
- cd Image-ExifTool-12.57
110
+ gzip -dc Image-ExifTool-12.58.tar.gz | tar -xf -
111
+ cd Image-ExifTool-12.58
112
112
  ./exiftool t/images/ExifTool.jpg
113
113
 
114
114
  Note: These commands extract meta information from one of the test images.
@@ -17,7 +17,7 @@
17
17
  # RotateMPRegionCW90
18
18
  # RotateMPRegionCW180
19
19
  # RotateMPRegionCW270
20
- # These tags will rotate a MWG Region clockwise 90, 180, or 270 degrees.
20
+ # These tags will rotate an MP Region clockwise 90, 180, or 270 degrees.
21
21
  # Example:
22
22
  # exiftool -config rotate_regions.config "-RegionInfoMP<RotateMPRegionCW90" FILE
23
23
  #
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '12.57';
14
+ my $version = '12.58';
15
15
 
16
16
  # add our 'lib' directory to the include list BEFORE 'use Image::ExifTool'
17
17
  BEGIN {
@@ -255,17 +255,15 @@ my %optArgs = (
255
255
  '-csvdelim' => 1,
256
256
  '-d' => 1, '-dateformat' => 1,
257
257
  '-D' => 0, # necessary to avoid matching lower-case equivalent
258
- '-echo' => 1, '-echo1' => 1, '-echo2' => 1, '-echo3' => 1, '-echo4' => 1,
259
- '-efile' => 1, '-efile1' => 1, '-efile2' => 1, '-efile3' => 1, '-efile4' => 1,
260
- '-efile!' => 1, '-efile1!' => 1, '-efile2!' => 1, '-efile3!' => 1, '-efile4!' => 1,
258
+ '-echo' => 1, '-echo#' => 1,
259
+ '-efile' => 1, '-efile#' => 1, '-efile!' => 1, '-efile#!' => 1,
261
260
  '-ext' => 1, '--ext' => 1, '-ext+' => 1, '--ext+' => 1,
262
261
  '-extension' => 1, '--extension' => 1, '-extension+' => 1, '--extension+' => 1,
263
- '-fileorder' => 1, '-fileorder0' => 1, '-fileorder1' => 1, '-fileorder2' => 1,
264
- '-fileorder3' => 1, '-fileorder4' => 1, '-fileorder5' => 1,
262
+ '-fileorder' => 1, '-fileorder#' => 1,
265
263
  '-geotag' => 1,
266
264
  '-globaltimeshift' => 1,
267
265
  '-i' => 1, '-ignore' => 1,
268
- '-if' => 1, '-if0' => 1, '-if1' => 1, '-if2' => 1, '-if3' => 1, '-if4' => 1, '-if5' => 1,
266
+ '-if' => 1, '-if#' => 1,
269
267
  '-lang' => 0, # (optional arg; cannot begin with "-")
270
268
  '-listitem' => 1,
271
269
  '-o' => 1, '-out' => 1,
@@ -4192,7 +4190,6 @@ sub NextUnusedFilename($;$)
4192
4190
  }
4193
4191
  ++$copy;
4194
4192
  ++$alpha;
4195
- ++$seq;
4196
4193
  }
4197
4194
  }
4198
4195
 
@@ -4398,9 +4395,13 @@ sub ReadStayOpen($)
4398
4395
  undef $optArgs;
4399
4396
  next unless $lastOpt eq '-stay_open' or $lastOpt eq '-@';
4400
4397
  } else {
4401
- $optArgs = $optArgs{$arg};
4402
4398
  $lastOpt = lc $arg;
4403
- $optArgs = $optArgs{$lastOpt} unless defined $optArgs;
4399
+ $optArgs = $optArgs{$arg};
4400
+ unless (defined $optArgs) {
4401
+ $optArgs = $optArgs{$lastOpt};
4402
+ # handle options with trailing numbers
4403
+ $optArgs = $optArgs{"$1#$2"} if not defined $optArgs and $lastOpt =~ /^(.*?)\d+(!?)$/;
4404
+ }
4404
4405
  next unless $lastOpt =~ /^-execute\d*$/;
4405
4406
  }
4406
4407
  $processArgs = 1;
@@ -4765,8 +4766,9 @@ L<Image::ExifTool::TagNames|Image::ExifTool::TagNames> for documentation on
4765
4766
  available tag names. A tag name may include leading group names separated
4766
4767
  by colons (eg. C<-EXIF:CreateDate>, or C<-Doc1:XMP:Creator>), and each group
4767
4768
  name may be prefixed by a digit to specify family number (eg.
4768
- C<-1IPTC:City>). Use the B<-listg> option to list available group names by
4769
- family.
4769
+ C<-1IPTC:City>). (Note that the API SavePath and SaveFormat options must be
4770
+ used for the family 5 and 6 groups respectively to be available.) Use the
4771
+ B<-listg> option to list available group names by family.
4770
4772
 
4771
4773
  A special tag name of C<All> may be used to indicate all meta information
4772
4774
  (ie. B<-All>). This is particularly useful when a group name is specified
@@ -4774,10 +4776,11 @@ to extract all information in a group (but beware that unless the B<-a>
4774
4776
  option is also used, some tags in the group may be suppressed by same-named
4775
4777
  tags in other groups). The wildcard characters C<?> and C<*> may be used in
4776
4778
  a tag name to match any single character and zero or more characters
4777
- respectively. These may not be used in a group name, with the exception that
4778
- a group name of C<*> (or C<All>) may be used to extract all instances of a
4779
- tag (as if B<-a> was used). Note that arguments containing wildcards must
4780
- be quoted on the command line of most systems to prevent shell globbing.
4779
+ respectively. These may not be used in a group name, with the exception
4780
+ that a group name of C<*> (or C<All>) may be used to extract all instances
4781
+ of a tag (as if B<-a> was used). Note that arguments containing wildcards
4782
+ must be quoted on the command line of most systems to prevent shell
4783
+ globbing.
4781
4784
 
4782
4785
  A C<#> may be appended to the tag name to disable the print conversion on a
4783
4786
  per-tag basis (see the B<-n> option). This may also be used when writing or
@@ -4856,8 +4859,8 @@ are removed if the containing group is deleted:
4856
4859
  - Deleting EXIF only removes ExifIFD which also deletes
4857
4860
  InteropIFD and MakerNotes.
4858
4861
 
4859
- MOV/MP4 video:
4860
- - Deleting ItemList also deletes Keys tags
4862
+ MOV/MP4 Video:
4863
+ - Deleting ItemList also deletes Keys tags.
4861
4864
 
4862
4865
  Notes:
4863
4866
 
@@ -5491,8 +5494,9 @@ which case the string is loaded from the contents of the file. Tag names in
5491
5494
  the format file or string begin with a C<$> symbol and may contain leading
5492
5495
  group names and/or a trailing C<#> (to disable print conversion). Case is
5493
5496
  not significant. Braces C<{}> may be used around the tag name to separate
5494
- it from subsequent text. Use C<$$> to represent a C<$> symbol, and C<$/>
5495
- for a newline.
5497
+ it from subsequent text (and must be used if subsequent text begins with an
5498
+ alphanumeric character, hyphen, underline, colon or number sign). Use C<$$>
5499
+ to represent a C<$> symbol, and C<$/> for a newline.
5496
5500
 
5497
5501
  Multiple B<-p> options may be used, each contributing a line (or more) of
5498
5502
  text to the output. Lines beginning with C<#[HEAD]> and C<#[TAIL]> are
@@ -5519,7 +5523,7 @@ with this command:
5519
5523
 
5520
5524
  produces output like this:
5521
5525
 
5522
- -- Generated by ExifTool 12.57 --
5526
+ -- Generated by ExifTool 12.58 --
5523
5527
  File: a.jpg - 2003:10:31 15:44:19
5524
5528
  (f/5.6, 1/60s, ISO 100)
5525
5529
  File: b.jpg - 2006:05:23 11:57:38
@@ -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.51';
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
@@ -1206,6 +1207,7 @@ TagID: foreach $tagID (@keys) {
1206
1207
  $sepTable{$s} = $printConv;
1207
1208
  # add PrintHex flag to PrintConv so we can check it later
1208
1209
  $$printConv{PrintHex} = 1 if $$tagInfo{PrintHex};
1210
+ $$printConv{PrintInt} = 1 if $$tagInfo{PrintInt};
1209
1211
  $$printConv{PrintString} = 1 if $$tagInfo{PrintString};
1210
1212
  } else {
1211
1213
  $caseInsensitive = 0;
@@ -1221,22 +1223,18 @@ TagID: foreach $tagID (@keys) {
1221
1223
  next if $_ eq '' and $$printConv{$_} eq '';
1222
1224
  $_ eq 'BITMASK' and $bits = $$printConv{$_}, next;
1223
1225
  $_ eq 'OTHER' and next;
1224
- my $index;
1225
- 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+$/) {
1226
1229
  my $dig = $$tagInfo{PrintHex} || 1;
1227
- if ($_ >= 0) {
1228
- $index = sprintf('0x%.*x', $dig, $_);
1230
+ if ($index >= 0) {
1231
+ $index = sprintf('0x%.*x', $dig, $index);
1229
1232
  } elsif ($format and $format =~ /int(16|32)/) {
1230
1233
  # mask off unused bits of signed integer hex value
1231
1234
  my $mask = { 16 => 0xffff, 32 => 0xffffffff }->{$1};
1232
- $index = sprintf('0x%.*x', $dig, $_ & $mask);
1233
- } else {
1234
- $index = $_;
1235
+ $index = sprintf('0x%.*x', $dig, $index & $mask);
1235
1236
  }
1236
- } elsif (/^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/ and not $$tagInfo{PrintString}) {
1237
- $index = $_;
1238
- } else {
1239
- $index = $_;
1237
+ } elsif ($$tagInfo{PrintString} or not /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$/) {
1240
1238
  # translate unprintable values
1241
1239
  if ($index =~ s/([\x00-\x1f\x80-\xff])/sprintf("\\x%.2x",ord $1)/eg) {
1242
1240
  $index = qq{"$index"};
@@ -2210,7 +2208,7 @@ sub WriteTagNames($$)
2210
2208
  my $wid = 0;
2211
2209
  my @keys;
2212
2210
  foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
2213
- next if /^(Notes|PrintHex|PrintString|OTHER)$/;
2211
+ next if /^(Notes|PrintHex|PrintInt|PrintString|OTHER)$/;
2214
2212
  $align = '' if $align and /[^\d]/;
2215
2213
  my $w = length($_) + length($$printConv{$_});
2216
2214
  $wid = $w if $wid < $w;
@@ -2238,6 +2236,7 @@ sub WriteTagNames($$)
2238
2236
  if (defined $key) {
2239
2237
  $index = $key;
2240
2238
  $prt = '= ' . EscapeHTML($$printConv{$key});
2239
+ $index =~ s/\.\d+$// if $$printConv{PrintInt};
2241
2240
  if ($$printConv{PrintHex}) {
2242
2241
  $index =~ s/(\.\d+)$//; # remove decimal
2243
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
@@ -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.07';
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;