exiftool_vendored 13.50.0 → 13.52.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/bin/Changes +28 -0
  3. data/bin/META.json +1 -1
  4. data/bin/META.yml +1 -1
  5. data/bin/README +3 -3
  6. data/bin/exiftool +3 -3
  7. data/bin/lib/Image/ExifTool/APP12.pm +5 -5
  8. data/bin/lib/Image/ExifTool/ASF.pm +9 -9
  9. data/bin/lib/Image/ExifTool/BuildTagLookup.pm +28 -10
  10. data/bin/lib/Image/ExifTool/Canon.pm +107 -4
  11. data/bin/lib/Image/ExifTool/Charset.pm +2 -2
  12. data/bin/lib/Image/ExifTool/DJI.pm +70 -8
  13. data/bin/lib/Image/ExifTool/EXE.pm +3 -3
  14. data/bin/lib/Image/ExifTool/Flash.pm +2 -8
  15. data/bin/lib/Image/ExifTool/FlashPix.pm +9 -9
  16. data/bin/lib/Image/ExifTool/Font.pm +2 -2
  17. data/bin/lib/Image/ExifTool/ID3.pm +3 -3
  18. data/bin/lib/Image/ExifTool/LIF.pm +3 -3
  19. data/bin/lib/Image/ExifTool/LNK.pm +382 -43
  20. data/bin/lib/Image/ExifTool/M2TS.pm +5 -3
  21. data/bin/lib/Image/ExifTool/MIE.pm +2 -2
  22. data/bin/lib/Image/ExifTool/MXF.pm +2 -2
  23. data/bin/lib/Image/ExifTool/Matroska.pm +2 -4
  24. data/bin/lib/Image/ExifTool/Microsoft.pm +3 -3
  25. data/bin/lib/Image/ExifTool/Nikon.pm +51 -6
  26. data/bin/lib/Image/ExifTool/PDF.pm +2 -2
  27. data/bin/lib/Image/ExifTool/PLIST.pm +2 -2
  28. data/bin/lib/Image/ExifTool/Pentax.pm +2 -2
  29. data/bin/lib/Image/ExifTool/Photoshop.pm +5 -5
  30. data/bin/lib/Image/ExifTool/QuickTime.pm +13 -10
  31. data/bin/lib/Image/ExifTool/QuickTimeStream.pl +3 -20
  32. data/bin/lib/Image/ExifTool/README +12 -10
  33. data/bin/lib/Image/ExifTool/Reconyx.pm +3 -3
  34. data/bin/lib/Image/ExifTool/SigmaRaw.pm +2 -2
  35. data/bin/lib/Image/ExifTool/TagLookup.pm +45 -11
  36. data/bin/lib/Image/ExifTool/TagNames.pod +112 -10
  37. data/bin/lib/Image/ExifTool/WTV.pm +4 -4
  38. data/bin/lib/Image/ExifTool/XMP.pm +29 -3
  39. data/bin/lib/Image/ExifTool.pm +12 -9
  40. data/bin/lib/Image/ExifTool.pod +3 -2
  41. data/bin/perl-Image-ExifTool.spec +1 -1
  42. data/lib/exiftool_vendored/version.rb +1 -1
  43. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 119da28d5499012533651a09438cf1c0b551bb65e4b97815bc86190c7b439beb
4
- data.tar.gz: 11292b43f6d89879e7eef760270799f803ec5bc15cdcaf8eb9c57fdeb7d9f9cc
3
+ metadata.gz: f1432f9788115500c5dc934cf7a08f704b8ac43891cd615e31613b08b296d6e4
4
+ data.tar.gz: 64a324bd2b96853ea8324c43fe1af74a4aa8b57fcda53253d5ec84b28371b59c
5
5
  SHA512:
6
- metadata.gz: 36b76bee5489e79558b03b5eabf21f0e59d9d60c4702818468f82dd50141f652caa8395a791d117d502d3e7aff95d6ceb139e741fa5351c0cf5925936331d45b
7
- data.tar.gz: 39b786e84e02df42bc8021b97084fa899810a4b8207e5bb91fc92dc990e4768efb1600bfc83497f7ae0d1db2cab02677633e054cc23fe693e30490778dd09f23
6
+ metadata.gz: 3712cd77765affd98d21ec3a8602dc4a2d2f86ccff56c3eb44f437cd7711182e9c7aaaccef566f3bfd045499f72a3641d01b05dec5891cf34059b7d76444892f
7
+ data.tar.gz: 248b84f36b0dc2f2cc653ef1ee0832adbcbce7d386dc482941a85db67fa2704a23d7a0724cb3d10527aac782a5ee32a11aaca2f0da3277b4180862a5fdf6b7f0
data/bin/Changes CHANGED
@@ -7,6 +7,34 @@ RSS feed: https://exiftool.org/rss.xml
7
7
  Note: The most recent production release is Version 13.50. (Other versions are
8
8
  considered development releases, and are not uploaded to MetaCPAN.)
9
9
 
10
+ Feb. 27, 2026 - Version 13.52
11
+
12
+ - Added a number of new XMP tags written by Adobe software
13
+ - Added UTF-16 support for a few different metadata types in which only UCS-2
14
+ was previously implemented (github #396)
15
+ - Added a few more Canon FlashModel values and decode FlashModel for the
16
+ 5DmkII (thanks Peter Wem, github #390)
17
+ - Added a new Canon LensType (github #395)
18
+ - Added some missing file attribute bits to two of the new LNK tags
19
+ - Decode internal serial number for the 5DmkII (thanks Peter Wem, github #398)
20
+ - Decode another OwnerName for the 5DmkII (thanks Peter Wem, github #397)
21
+ - Decode some timed GPS for a couple of new DJI drones
22
+ - Enable WindowsLongPath by default only if Win32::API is available
23
+ - Renamed the Pentax K3III AFInfo tag to AFInfoK3III
24
+
25
+ Feb. 19, 2026 - Version 13.51
26
+
27
+ - Added a new Nikon LensID (thanks Johan)
28
+ - Decode more tags from Windows LNK files
29
+ - Decode another LIGOGPSINFO variant (github #394)
30
+ - Decode some new Canon tags (thanks Peter Wem, github #389, #390, #393)
31
+ - Decode some new Nikon tags
32
+ - Split decoding on Nikon BurstGroupID into separate tags
33
+ - Fixed round-off error in GPSDateTime seconds for camm6 metadata in MP4
34
+ videos introduced in 13.45
35
+ - Fixed bug generating the default-language version of
36
+ QuickTime:LocationInformation (github #391)
37
+
10
38
  Feb. 7, 2026 - Version 13.50 (production release)
11
39
 
12
40
  - Added a few new Sony lenses (thanks Jos Roost)
data/bin/META.json CHANGED
@@ -50,6 +50,6 @@
50
50
  }
51
51
  },
52
52
  "release_status" : "stable",
53
- "version" : "13.50",
53
+ "version" : "13.52",
54
54
  "x_serialization_backend" : "JSON::PP version 4.06"
55
55
  }
data/bin/META.yml CHANGED
@@ -31,5 +31,5 @@ recommends:
31
31
  Time::HiRes: '0'
32
32
  requires:
33
33
  perl: '5.004'
34
- version: '13.50'
34
+ version: '13.52'
35
35
  x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
data/bin/README CHANGED
@@ -111,8 +111,8 @@ your home directory, then you would type the following commands in a
111
111
  terminal window to extract and run ExifTool:
112
112
 
113
113
  cd ~/Desktop
114
- gzip -dc Image-ExifTool-13.50.tar.gz | tar -xf -
115
- cd Image-ExifTool-13.50
114
+ gzip -dc Image-ExifTool-13.52.tar.gz | tar -xf -
115
+ cd Image-ExifTool-13.52
116
116
  ./exiftool t/images/ExifTool.jpg
117
117
 
118
118
  Note: These commands extract meta information from one of the test images.
@@ -158,7 +158,7 @@ for calculating digest values and providing other features listed below:
158
158
  POSIX::strptime (for inverse date/time conversion)
159
159
  Time::Piece (alternative to POSIX::strptime)
160
160
  Unicode::LineBreak (for column alignment of alternate-language output)
161
- Win32::API (for proper handling of Windows file times)
161
+ Win32::API (for proper handling of Windows file names/times)
162
162
  Win32::FindFile (for Windows Unicode directory support, app only)
163
163
  Win32API::File (for Windows Unicode file names and file times)
164
164
  Compress::Raw::Lzma (for reading encoded 7z files)
data/bin/exiftool CHANGED
@@ -11,7 +11,7 @@ use strict;
11
11
  use warnings;
12
12
  require 5.004;
13
13
 
14
- my $version = '13.50';
14
+ my $version = '13.52';
15
15
 
16
16
  $^W = 1; # enable global warnings
17
17
 
@@ -5530,7 +5530,7 @@ C<E<lt>> to avoid confusion with the C<E<lt>=> operator which sets the tag
5530
5530
  value from the contents of a file. A single space at the start of the
5531
5531
  string is removed if it exists, but all other whitespace in the string is
5532
5532
  preserved. See note 8 below about using the redirection feature with
5533
- list-type stags, shortcuts or when using wildcards in tag names.
5533
+ list-type tags, shortcuts or when using wildcards in tag names.
5534
5534
 
5535
5535
  See L</COPYING EXAMPLES> for examples using B<-tagsFromFile>.
5536
5536
 
@@ -6136,7 +6136,7 @@ with this command:
6136
6136
 
6137
6137
  produces output like this:
6138
6138
 
6139
- -- Generated by ExifTool 13.50 --
6139
+ -- Generated by ExifTool 13.52 --
6140
6140
  File: a.jpg - 2003:10:31 15:44:19
6141
6141
  (f/5.6, 1/60s, ISO 100)
6142
6142
  File: b.jpg - 2006:05:23 11:57:38
@@ -14,7 +14,7 @@ use strict;
14
14
  use vars qw($VERSION);
15
15
  use Image::ExifTool qw(:DataAccess :Utils);
16
16
 
17
- $VERSION = '1.14';
17
+ $VERSION = '1.15';
18
18
 
19
19
  sub ProcessAPP12($$$);
20
20
  sub ProcessDucky($$$);
@@ -114,8 +114,8 @@ sub WriteDucky($$$);
114
114
  Priority => 0,
115
115
  Avoid => 1,
116
116
  # (ignore 4-byte character count at start of value)
117
- ValueConv => '$self->Decode(substr($val,4),"UCS2","MM")',
118
- ValueConvInv => 'pack("N",length $val) . $self->Encode($val,"UCS2","MM")',
117
+ ValueConv => '$self->Decode(substr($val,4),"UTF16","MM")',
118
+ ValueConvInv => 'pack("N",length $val) . $self->Encode($val,"UTF16","MM")',
119
119
  },
120
120
  3 => { #PH
121
121
  Name => 'Copyright',
@@ -123,8 +123,8 @@ sub WriteDucky($$$);
123
123
  Avoid => 1,
124
124
  Groups => { 2 => 'Author' },
125
125
  # (ignore 4-byte character count at start of value)
126
- ValueConv => '$self->Decode(substr($val,4),"UCS2","MM")',
127
- ValueConvInv => 'pack("N",length $val) . $self->Encode($val,"UCS2","MM")',
126
+ ValueConv => '$self->Decode(substr($val,4),"UTF16","MM")',
127
+ ValueConvInv => 'pack("N",length $val) . $self->Encode($val,"UTF16","MM")',
128
128
  },
129
129
  );
130
130
 
@@ -17,7 +17,7 @@ use Image::ExifTool qw(:DataAccess :Utils);
17
17
  use Image::ExifTool::Exif;
18
18
  use Image::ExifTool::RIFF;
19
19
 
20
- $VERSION = '1.26';
20
+ $VERSION = '1.27';
21
21
 
22
22
  sub ProcessASF($$;$);
23
23
  sub ProcessContentDescription($$$);
@@ -549,7 +549,7 @@ sub ProcessContentDescription($$$)
549
549
  my $len = shift @len;
550
550
  next unless $len;
551
551
  return 0 if $pos + $len > $dirLen;
552
- my $val = $et->Decode(substr($$dataPt,$pos,$len),'UCS2','II');
552
+ my $val = $et->Decode(substr($$dataPt,$pos,$len),'UTF16','II');
553
553
  $et->HandleTag($tagTablePtr, $tag, $val);
554
554
  $pos += $len;
555
555
  }
@@ -594,7 +594,7 @@ sub ReadASF($$$$$)
594
594
  my ($et, $dataPt, $pos, $format, $size) = @_;
595
595
  my @vals;
596
596
  if ($format == 0) { # unicode string
597
- $vals[0] = $et->Decode(substr($$dataPt,$pos,$size),'UCS2','II');
597
+ $vals[0] = $et->Decode(substr($$dataPt,$pos,$size),'UTF16','II');
598
598
  } elsif ($format == 2) { # 4-byte boolean
599
599
  @vals = ReadValue($dataPt, $pos, 'int32u', undef, $size);
600
600
  foreach (@vals) {
@@ -631,7 +631,7 @@ sub ProcessExtendedContentDescription($$$)
631
631
  my $nameLen = unpack("x${pos}v", $$dataPt);
632
632
  $pos += 2;
633
633
  return 0 if $pos + $nameLen + 4 > $dirLen;
634
- my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UCS2','II','Latin');
634
+ my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UTF16','II','Latin');
635
635
  $tag =~ s/^WM\///; # remove leading "WM/"
636
636
  $pos += $nameLen;
637
637
  my ($dType, $dLen) = unpack("x${pos}v2", $$dataPt);
@@ -667,7 +667,7 @@ sub ProcessMetadata($$$)
667
667
  my ($index, $stream, $nameLen, $dType, $dLen) = unpack("x${pos}v4V", $$dataPt);
668
668
  $pos += 12;
669
669
  return 0 if $pos + $nameLen + $dLen > $dirLen;
670
- my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UCS2','II','Latin');
670
+ my $tag = Image::ExifTool::Decode(undef,substr($$dataPt,$pos,$nameLen),'UTF16','II','Latin');
671
671
  $tag =~ s/^WM\///; # remove leading "WM/"
672
672
  $pos += $nameLen;
673
673
  my $val = ReadASF($et,$dataPt,$pos,$dType,$dLen);
@@ -702,8 +702,8 @@ sub ProcessPicture($$$)
702
702
  my $str = substr($$dataPt, $dirStart+5, $n);
703
703
  if ($str =~ /^((?:..)*?)\0\0((?:..)*?)\0\0/s) {
704
704
  my ($mime, $desc) = ($1, $2);
705
- $et->HandleTag($tagTablePtr, 1, $et->Decode($mime,'UCS2','II'));
706
- $et->HandleTag($tagTablePtr, 2, $et->Decode($desc,'UCS2','II')) if length $desc;
705
+ $et->HandleTag($tagTablePtr, 1, $et->Decode($mime,'UTF16','II'));
706
+ $et->HandleTag($tagTablePtr, 2, $et->Decode($desc,'UTF16','II')) if length $desc;
707
707
  }
708
708
  $et->HandleTag($tagTablePtr, 3, substr($$dataPt, $dirStart+5+$n, $picLen));
709
709
  return 1;
@@ -731,12 +731,12 @@ sub ProcessCodecList($$$)
731
731
  my $nameLen = Get16u($dataPt, $pos + 2) * 2;
732
732
  $pos += 4;
733
733
  return 0 if $pos + $nameLen + 2 > $dirLen;
734
- my $name = $et->Decode(substr($$dataPt,$pos,$nameLen),'UCS2','II');
734
+ my $name = $et->Decode(substr($$dataPt,$pos,$nameLen),'UTF16','II');
735
735
  $et->HandleTag($tagTablePtr, "${type}Name", $name);
736
736
  my $descLen = Get16u($dataPt, $pos + $nameLen) * 2;
737
737
  $pos += $nameLen + 2;
738
738
  return 0 if $pos + $descLen + 2 > $dirLen;
739
- my $desc = $et->Decode(substr($$dataPt,$pos,$descLen),'UCS2','II');
739
+ my $desc = $et->Decode(substr($$dataPt,$pos,$descLen),'UTF16','II');
740
740
  $et->HandleTag($tagTablePtr, "${type}Description", $desc);
741
741
  my $infoLen = Get16u($dataPt, $pos + $descLen);
742
742
  $pos += $descLen + 2 + $infoLen;
@@ -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.65';
38
+ $VERSION = '3.66';
39
39
  @ISA = qw(Exporter);
40
40
 
41
41
  sub NumbersFirst($$);
@@ -2262,22 +2262,33 @@ sub WriteTagNames($$)
2262
2262
  print HTMLFILE "<table class='inner sep' cellspacing=1>\n";
2263
2263
  my $align = ' class=r';
2264
2264
  my $wid = 0;
2265
- my @keys;
2265
+ my (@keys, @bits);
2266
2266
  foreach (sort { NumbersFirst($a,$b) } keys %$printConv) {
2267
- next if /^(Notes|PrintHex|PrintInt|PrintString|OTHER)$/;
2267
+ next if /^(Notes|PrintHex|PrintInt|PrintString|OTHER|BITMASK)$/;
2268
2268
  $align = '' if $align and /[^\d]/;
2269
2269
  my $w = length($_) + length($$printConv{$_});
2270
2270
  $wid = $w if $wid < $w;
2271
2271
  push @keys, $_;
2272
- if ($$printConv{$_} =~ /[\0-\x1f\x7f-\xff]/) {
2273
- warn "Warning: Special characters in $tableName PrintConv ($$printConv{$_})\n";
2272
+ next unless $$printConv{$_} =~ /[\0-\x1f\x7f-\xff]/;
2273
+ warn "Warning: Special characters in $tableName PrintConv ($$printConv{$_})\n";
2274
+ }
2275
+ my $bits = $$printConv{BITMASK};
2276
+ if ($bits) {
2277
+ $align = '';
2278
+ foreach (sort { NumbersFirst($a,$b) } keys %$bits) {
2279
+ my $w = length($_) + length($$bits{$_}) + 4;
2280
+ $wid = $w if $wid < $w;
2281
+ push @bits, $_;
2282
+ next unless $$bits{$_} =~ /[\0-\x1f\x7f-\xff]/;
2283
+ warn "Warning: Special characters in $tableName PrintConv BITMASK ($$bits{$_})\n";
2274
2284
  }
2275
2285
  }
2276
2286
  $wid = length($tableName)+7 if $wid < length($tableName)+7;
2277
2287
  # print in multiple columns if there is room
2278
2288
  my $cols = int(110 / ($wid + 4));
2279
- $cols = 1 if $cols < 1 or $cols > @keys or @keys < 4;
2280
- my $rows = int((scalar(@keys) + $cols - 1) / $cols);
2289
+ my $items = @keys + @bits;
2290
+ $cols = 1 if $cols < 1 or $cols > $items or $items < 4;
2291
+ my $rows = int(($items + $cols - 1) / $cols);
2281
2292
  my ($r, $c);
2282
2293
  print HTMLFILE '<tr class=h>';
2283
2294
  for ($c=0; $c<$cols; ++$c) {
@@ -2287,11 +2298,18 @@ sub WriteTagNames($$)
2287
2298
  for ($r=0; $r<$rows; ++$r) {
2288
2299
  print HTMLFILE '<tr>';
2289
2300
  for ($c=0; $c<$cols; ++$c) {
2290
- my $key = $keys[$r + $c*$rows];
2291
- my ($index, $prt);
2301
+ my ($key, $val, $index, $prt);
2302
+ my $n = $r + $c * $rows;
2303
+ if ($n < @keys) {
2304
+ $key = $keys[$n];
2305
+ $val = $$printConv{$key};
2306
+ } elsif ($n < $items) {
2307
+ $key = 'Bit ' . $bits[$n - @keys];
2308
+ $val = $$bits{$bits[$n - @keys]};
2309
+ }
2292
2310
  if (defined $key) {
2293
2311
  $index = $key;
2294
- $prt = '= ' . EscapeHTML($$printConv{$key});
2312
+ $prt = '= ' . EscapeHTML($val);
2295
2313
  $index =~ s/\.\d+$// if $$printConv{PrintInt};
2296
2314
  if ($$printConv{PrintHex}) {
2297
2315
  $index =~ s/(\.\d+)$//; # remove decimal
@@ -88,7 +88,7 @@ sub ProcessCTMD($$$);
88
88
  sub ProcessExifInfo($$$);
89
89
  sub SwapWords($);
90
90
 
91
- $VERSION = '5.03';
91
+ $VERSION = '5.05';
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)
@@ -540,6 +540,8 @@ $VERSION = '5.03';
540
540
  757 => 'Canon EF 400mm f/2.8L IS III USM', #IB
541
541
  758 => 'Canon EF 600mm f/4L IS III USM', #IB
542
542
 
543
+ 923 => 'Meike/SKY 85mm f/1.8 DCM', #github395
544
+
543
545
  1136 => 'Sigma 24-70mm f/2.8 DG OS HSM | A', #IB (017)
544
546
  # (STM lenses - 0x10xx)
545
547
  4142 => 'Canon EF-S 18-135mm f/3.5-5.6 IS STM',
@@ -1022,6 +1024,29 @@ $VERSION = '5.03';
1022
1024
  0x80000560 => 'EOS D6000C', #PH (guess)
1023
1025
  );
1024
1026
 
1027
+ # flash models (github390)
1028
+ my %flashModel = (
1029
+ 0 => 'n/a',
1030
+ # 1 - seen this for various PowerShot/IXUS models
1031
+ 4 => 'Speedlite 540EZ',
1032
+ 5 => 'Speedlite 380EX',
1033
+ 6 => 'Speedlite 550EX',
1034
+ 8 => 'Speedlite ST-E2',
1035
+ 9 => 'Speedlite MR-14EX',
1036
+ 12 => 'Speedlite 580EX',
1037
+ 13 => 'Speedlite 430EX',
1038
+ 17 => 'Speedlite 580EX II',
1039
+ 18 => 'Speedlite 430EX II',
1040
+ 22 => 'Speedlite 600EX-RT',
1041
+ 23 => 'Speedlite 600EX II-RT',
1042
+ 24 => 'Speedlite 90EX',
1043
+ 25 => 'Speedlite 430EX III-RT',
1044
+ 31 => 'Speedlite EL-1 ver2',
1045
+ 33 => 'Speedlite EL-5',
1046
+ 34 => 'Speedlite EL-10',
1047
+ # 127 - seen a lot, currently ignored
1048
+ );
1049
+
1025
1050
  my %canonQuality = (
1026
1051
  -1 => 'n/a', # (PH, EOS M MOV video)
1027
1052
  1 => 'Economy',
@@ -2526,8 +2551,11 @@ my %offOn = ( 0 => 'Off', 1 => 'On' );
2526
2551
  PrintConvInv => '$val',
2527
2552
  },
2528
2553
  28 => {
2529
- Name => 'FlashActivity',
2530
- RawConv => '$val==-1 ? undef : $val',
2554
+ Name => 'FlashModel', #github390
2555
+ # (don't know what bit 7 is for, but it is set for most models except 1Ds)
2556
+ Mask => 0x7f,
2557
+ RawConv => '$val == 127 ? undef : $val',
2558
+ PrintConv => \%flashModel,
2531
2559
  },
2532
2560
  29 => {
2533
2561
  Name => 'FlashBits',
@@ -3969,6 +3997,7 @@ my %ciMaxFocal = (
3969
3997
  Name => 'HighlightTonePriority',
3970
3998
  PrintConv => \%offOn,
3971
3999
  },
4000
+ 0x13 => { Name => 'FlashModel', Mask => 0x7f, PrintConv => \%flashModel }, #github390
3972
4001
  0x1b => { %ciMacroMagnification }, #PH
3973
4002
  0x15 => { #PH (580 EX II)
3974
4003
  Name => 'FlashMeteringMode',
@@ -4053,6 +4082,11 @@ my %ciMaxFocal = (
4053
4082
  # some firmwares have a null instead of a space after the version number
4054
4083
  RawConv => '$val=~/^\d+\.\d+\.\d+\s*$/ ? $val : undef',
4055
4084
  },
4085
+ 0x18e => { #github397
4086
+ Name => 'OwnerName',
4087
+ Priority => 0,
4088
+ Format => 'string[32]',
4089
+ },
4056
4090
  0x1bb => {
4057
4091
  Name => 'FileIndex',
4058
4092
  Groups => { 2 => 'Image' },
@@ -4787,6 +4821,14 @@ my %ciMaxFocal = (
4787
4821
  NOTES => 'CameraInfo tags for the EOS R5 and R6.',
4788
4822
  # (see forum16111 for more notes on these tags)
4789
4823
  # 0x0a5d - some sort of sequence number starting from 1 (ref forum16111)
4824
+ 0x09da => { #github393
4825
+ Name => 'CameraTemperature',
4826
+ Groups => { 2 => 'Camera' },
4827
+ ValueConv => '$val - 128',
4828
+ ValueConvInv => '$val + 128',
4829
+ PrintConv => '"$val C"',
4830
+ PrintConvInv => '$val=~s/ ?C//; $val',
4831
+ },
4790
4832
  0x0af1 => { #forum15210/15579
4791
4833
  Name => 'ShutterCount',
4792
4834
  Format => 'int32u',
@@ -5588,6 +5630,7 @@ my %ciMaxFocal = (
5588
5630
  0x03 => { %ciFNumber }, #PH
5589
5631
  0x04 => { %ciExposureTime }, #PH
5590
5632
  0x06 => { %ciISO }, #PH
5633
+ 0x13 => { Name => 'FlashModel', Mask => 0x7f, PrintConv => \%flashModel }, #github390
5591
5634
  0x15 => { #PH (580 EX II)
5592
5635
  Name => 'FlashMeteringMode',
5593
5636
  PrintConv => {
@@ -7095,9 +7138,17 @@ my %ciMaxFocal = (
7095
7138
  %binaryDataAttrs,
7096
7139
  FIRST_ENTRY => 0,
7097
7140
  GROUPS => { 0 => 'MakerNotes', 2 => 'Camera' },
7098
- 9 => {
7141
+ 0 => { #github398 (5DmkII,5DmkIII,5DmkIV,5DS,5DSR)
7142
+ Name => 'InternalSerialNumber2',
7143
+ Format => 'string[9]',
7144
+ Notes => 'could be the number on a barcode sticker of the main circuit board',
7145
+ RawConv => '$val =~ /^\w{6}/ ? $val : undef',
7146
+
7147
+ },
7148
+ 9 => { # (other models)
7099
7149
  Name => 'InternalSerialNumber',
7100
7150
  Format => 'string',
7151
+ RawConv => '$val =~ /^\w{6}/ ? $val : undef',
7101
7152
  },
7102
7153
  );
7103
7154
 
@@ -7626,6 +7677,19 @@ my %ciMaxFocal = (
7626
7677
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
7627
7678
  },
7628
7679
  0x0e7 => { Name => 'AverageBlackLevel', Format => 'int16u[4]' }, #IB
7680
+ 0x26b => { #github389
7681
+ Name => 'FlashOutput',
7682
+ ValueConv => '$val >= 255 ? 255 : exp(($val-200)/16*log(2))',
7683
+ ValueConvInv => '$val == 255 ? 255 : 200 + log($val)*16/log(2)',
7684
+ PrintConv => '$val == 255 ? "Strobe or Misfire" : sprintf("%.0f%%", $val * 100)',
7685
+ PrintConvInv => '$val =~ /^(\d(\.?\d*))/ ? $1 / 100 : 255',
7686
+ },
7687
+ 0x26c => { #github389
7688
+ Name => 'FlashBatteryLevel',
7689
+ # calibration taken from ColorData3
7690
+ PrintConv => '$val ? sprintf("%.2fV", $val * 5 / 186) : "n/a"',
7691
+ PrintConvInv => '$val=~/^(\d+\.\d+)\s*V?$/i ? int($val*186/5+0.5) : 0',
7692
+ },
7629
7693
  0x280 => { #PH
7630
7694
  Name => 'RawMeasuredRGGB',
7631
7695
  Format => 'int32u[4]',
@@ -8115,6 +8179,19 @@ my %ciMaxFocal = (
8115
8179
  SubDirectory => { TagTable => 'Image::ExifTool::Canon::ColorCalib' }
8116
8180
  },
8117
8181
  0x114 => { Name => 'AverageBlackLevel', Format => 'int16u[4]' }, #IB
8182
+ 0x198 => { #github389
8183
+ Name => 'FlashOutput',
8184
+ ValueConv => '$val >= 255 ? 255 : exp(($val-200)/16*log(2))',
8185
+ ValueConvInv => '$val == 255 ? 255 : 200 + log($val)*16/log(2)',
8186
+ PrintConv => '$val == 255 ? "Strobe or Misfire" : sprintf("%.0f%%", $val * 100)',
8187
+ PrintConvInv => '$val =~ /^(\d(\.?\d*))/ ? $1 / 100 : 255',
8188
+ },
8189
+ 0x199 => { #github389
8190
+ Name => 'FlashBatteryLevel',
8191
+ # calibration taken from ColorData3
8192
+ PrintConv => '$val ? sprintf("%.2fV", $val * 5 / 186) : "n/a"',
8193
+ PrintConvInv => '$val=~/^(\d+\.\d+)\s*V?$/i ? int($val*186/5+0.5) : 0',
8194
+ },
8118
8195
  0x1ad => {
8119
8196
  Name => 'RawMeasuredRGGB',
8120
8197
  Condition => '$$self{ColorDataVersion} == 10',
@@ -8570,6 +8647,19 @@ my %ciMaxFocal = (
8570
8647
  Name => 'PerChannelBlackLevel',
8571
8648
  Format => 'int16u[4]',
8572
8649
  },
8650
+ 0x299 => { #github389
8651
+ Name => 'FlashOutput',
8652
+ ValueConv => '$val >= 255 ? 255 : exp(($val-200)/16*log(2))',
8653
+ ValueConvInv => '$val == 255 ? 255 : 200 + log($val)*16/log(2)',
8654
+ PrintConv => '$val == 255 ? "Strobe or Misfire" : sprintf("%.0f%%", $val * 100)',
8655
+ PrintConvInv => '$val =~ /^(\d(\.?\d*))/ ? $1 / 100 : 255',
8656
+ },
8657
+ 0x29a => { #github389
8658
+ Name => 'FlashBatteryLevel',
8659
+ # calibration taken from ColorData3
8660
+ PrintConv => '$val ? sprintf("%.2fV", $val * 5 / 186) : "n/a"',
8661
+ PrintConvInv => '$val=~/^(\d+\.\d+)\s*V?$/i ? int($val*186/5+0.5) : 0',
8662
+ },
8573
8663
  # 0x326 - PerChannelBlackLevel again
8574
8664
  0x32a => {
8575
8665
  Name => 'NormalWhiteLevel',
@@ -8812,6 +8902,19 @@ my %ciMaxFocal = (
8812
8902
  Name => 'PerChannelBlackLevel',
8813
8903
  Format => 'int16u[4]',
8814
8904
  },
8905
+ 0x203 => { #github389
8906
+ Name => 'FlashOutput',
8907
+ ValueConv => '$val >= 255 ? 255 : exp(($val-200)/16*log(2))',
8908
+ ValueConvInv => '$val == 255 ? 255 : 200 + log($val)*16/log(2)',
8909
+ PrintConv => '$val == 255 ? "Strobe or Misfire" : sprintf("%.0f%%", $val * 100)',
8910
+ PrintConvInv => '$val =~ /^(\d(\.?\d*))/ ? $1 / 100 : 255',
8911
+ },
8912
+ 0x204 => { #github389
8913
+ Name => 'FlashBatteryLevel',
8914
+ # calibration taken from ColorData3
8915
+ PrintConv => '$val ? sprintf("%.2fV", $val * 5 / 186) : "n/a"',
8916
+ PrintConvInv => '$val=~/^(\d+\.\d+)\s*V?$/i ? int($val*186/5+0.5) : 0',
8917
+ },
8815
8918
  # 0x290 - PerChannelBlackLevel again
8816
8919
  0x294 => {
8817
8920
  Name => 'NormalWhiteLevel',
@@ -77,10 +77,10 @@ my %unicode2byte = (
77
77
  PDFDoc => 0x181,
78
78
  Unicode => 0x200, # (UCS2)
79
79
  UCS2 => 0x200,
80
- UTF16 => 0x200,
80
+ UTF16 => 0x200, # (UCS2 with surrogate pairs added)
81
81
  Symbol => 0x201,
82
82
  JIS => 0x201,
83
- UCS4 => 0x400,
83
+ UCS4 => 0x400, # (UTF32)
84
84
  MacChineseCN => 0x803,
85
85
  MacChineseTW => 0x803,
86
86
  MacHebrew => 0x803, # (directional characters not supported)
@@ -18,7 +18,7 @@ use Image::ExifTool::XMP;
18
18
  use Image::ExifTool::GPS;
19
19
  use Image::ExifTool::Protobuf;
20
20
 
21
- $VERSION = '1.16';
21
+ $VERSION = '1.17';
22
22
 
23
23
  sub ProcessDJIInfo($$$);
24
24
  sub ProcessSettings($$$);
@@ -36,7 +36,9 @@ sub ProcessSettings($$$);
36
36
  'dvtm_PP-101.proto' => 1, # Osmo Pocket 3
37
37
  'dvtm_oq101.proto' => 1, # Osmo 360
38
38
  'dvtm_wa345e.proto' => 1, # Matrice 4E
39
- 'dvtm_wm261.proto' => 1, # Mavic Pro 3
39
+ 'dvtm_wm261.proto' => 1, # Mavic 3 Pro
40
+ 'dvtm_Mavic4.proto' => 1, # Mavic 4 Pro
41
+ 'dvtm_Mini5Pro.proto' => 1, # Mini 5 Pro
40
42
  # dvtm_wm169.proto seems to be DJI O3 but the structure is unknown
41
43
  );
42
44
 
@@ -246,8 +248,9 @@ my %convFloat2 = (
246
248
  dvtm_wm265e.proto (Mavic 3), dvtm_pm320.proto (Matrice 30),
247
249
  dvtm_Mini4_Pro.proto (Mini 4 Pro), dvtm_dji_neo.proto (DJI Neo),
248
250
  dvtm_Air3.proto (Air 3), dvtm_Air3s.proto (Air 3s), dvtm_PP-101.proto (Osmo
249
- Pocket 3), dvtm_oq101.proto (Osmo 360), dvtm_wa345e.proto (Matrice 4E) and
250
- dvtm_wm261.proto (Mavic Pro 3).
251
+ Pocket 3), dvtm_oq101.proto (Osmo 360), dvtm_wa345e.proto (Matrice 4E),
252
+ dvtm_wm261.proto (Mavic 3 Pro), dvtm_Mavic4.proto (Mavic 4 Pro) and
253
+ dvtm_Mini5Pro.proto (Mini 5 Pro).
251
254
 
252
255
  Note that with the protobuf format, numerical tags missing from the output
253
256
  for a given protocol should be considered to have the default value of 0.
@@ -255,7 +258,7 @@ my %convFloat2 = (
255
258
  Protocol => {
256
259
  Notes => "typically protobuf field 1-1-1, but ExifTool doesn't rely on this",
257
260
  RawConv => q{
258
- unless ($Image::ExifTool::DJI::knownProtocol{$val}) {
261
+ unless ($Image::ExifTool::DJI::knownProtocol{$val} or $val =~ /^dbginfo/) {
259
262
  $self->Warn("Unknown protocol $val (please submit sample for testing)");
260
263
  }
261
264
  return $val;
@@ -473,7 +476,7 @@ my %convFloat2 = (
473
476
  PrintConv => 'Image::ExifTool::Exif::PrintFNumber($val)',
474
477
  },
475
478
  'dvtm_Mini4_Pro_3-2-32-1' => { Name => 'ColorTemperature', Format => 'unsigned' },
476
- # dvtm_Mini4_Pro_3-2-37-1 - something to do with battery level or time remaining?
479
+ 'dvtm_Mini4_Pro_3-2-37-1' => { Name => 'Temperature', Format => 'float' }, # (NC)
477
480
  'dvtm_Mini4_Pro_3-3-4-1' => {
478
481
  Name => 'GPSInfo',
479
482
  SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
@@ -714,9 +717,9 @@ my %convFloat2 = (
714
717
  PrintConv => '$self->ConvertDateTime($val)',
715
718
  },
716
719
  #
717
- # Mavic Pro 3
720
+ # Mavic 3 Pro
718
721
  #
719
- 'dvtm_wm261_1-1-5' => { Name => 'SerialNumber', Notes => 'Mavic Pro 3' },
722
+ 'dvtm_wm261_1-1-5' => { Name => 'SerialNumber', Notes => 'Mavic 3 Pro' },
720
723
  'dvtm_wm261_1-1-10' => 'Model',
721
724
  'dvtm_wm261_2-3' => {
722
725
  Name => 'FrameInfo',
@@ -761,8 +764,67 @@ my %convFloat2 = (
761
764
  ValueConv => '$val =~ tr/-/:/; $val',
762
765
  PrintConv => '$self->ConvertDateTime($val)',
763
766
  },
767
+ #
768
+ # Mavic 4 Pro
769
+ #
770
+ 'dvtm_Mavic4_1-1-5' => { Name => 'SerialNumber', Notes => 'Mavic 4 Pro' },
771
+ 'dvtm_Mavic4_1-1-10' => 'Model',
772
+ # dvtm_Mavic4_2-2-1-4 - model code?
773
+ # dvtm_Mavic4_2-2-1-5 - frame rate again
774
+ 'dvtm_Mavic4_2-3' => {
775
+ Name => 'FrameInfo',
776
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::FrameInfo' },
777
+ },
778
+ 'dvtm_Mavic4_3-1-2' => {
779
+ Name => 'TimeStamp',
780
+ Groups => { 2 => 'Time' },
781
+ Format => 'unsigned',
782
+ ValueConv => '$val / 1e6',
783
+ },
784
+ # dvtm_Mavic4_3-2-1-4 - string: model code?
785
+ # dvtm_Mavic4_3-2-1-5 - float: frame rate again
786
+ 'dvtm_Mavic4_3-2-9-1' => { Name => 'ISO', Format => 'float' },
787
+ 'dvtm_Mavic4_3-2-10-1' => {
788
+ Name => 'ShutterSpeed',
789
+ Format => 'rational',
790
+ PrintConv => 'Image::ExifTool::Exif::PrintExposureTime($val)',
791
+ },
792
+ 'dvtm_Mavic4_3-2-24-1' => { Name => 'ColorTemperature', Format => 'unsigned' },
793
+ # dvtm_Mavic4_3-2-32-1 - unsigned: color temperature again
794
+ 'dvtm_Mavic4_3-2-37-1' => { Name => 'Temperature', Format => 'float' }, # (NC)
795
+ 'dvtm_Mavic4_3-3-3' => { # (NC)
796
+ Name => 'DroneInfo',
797
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::DroneInfo' },
798
+ },
799
+ 'dvtm_Mavic4_3-3-4-1' => {
800
+ Name => 'GPSInfo',
801
+ Condition => '$$self{CoordUnits} = 1', # (stores in degrees)
802
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
803
+ },
804
+ 'dvtm_Mavic4_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' }, # (NC)
805
+ 'dvtm_Mavic4_3-3-5-1' => { Name => 'RelativeAltitude', Format => 'float', ValueConv => '$val / 1000' }, # (NC)
806
+ # dvtm_Mavic4_3-4-1-4 - string: model code?
807
+ #
808
+ # Mini 5 Pro
809
+ #
810
+ 'dvtm_Mini5Pro_1-1-5' => { Name => 'SerialNumber', Notes => 'Mini 5 Pro' }, # (NC)
811
+ 'dvtm_Mini5Pro_1-1-10' => 'Model', # (NC)
812
+ 'dvtm_Mini5Pro_3-2-37-1' => { Name => 'Temperature', Format => 'float' }, # (NC)
813
+ 'dvtm_Mini5Pro_3-3-4-1' => {
814
+ Name => 'GPSInfo',
815
+ Condition => '$$self{CoordUnits} = 1', # (NC)
816
+ SubDirectory => { TagTable => 'Image::ExifTool::DJI::GPSInfo' },
817
+ },
818
+ 'dvtm_Mini5Pro_3-3-4-2' => { Name => 'AbsoluteAltitude', Format => 'int64s', ValueConv => '$val / 1000' }, # (NC)
764
819
  );
765
820
 
821
+ # debug info (not yet extracted)
822
+ # Mavic 4 Pro (ref forum17855)
823
+ # dbginfo_wa341_2-1-29-12 - Absolute Altitude
824
+ # dbginfo_wa341_2-1-29-14 - Relative Altitude
825
+ # dbginfo_wa341_2-1-29-16 - VPS Height (Ultrasonic)
826
+ # dbginfo_wa341_2-1-4-200-198 - Sensor Temperature
827
+
766
828
  %Image::ExifTool::DJI::DroneInfo = (
767
829
  GROUPS => { 0 => 'Protobuf', 1 => 'DJI', 2 => 'Camera' },
768
830
  PROCESS_PROC => \&Image::ExifTool::Protobuf::ProcessProtobuf,
@@ -22,7 +22,7 @@ use strict;
22
22
  use vars qw($VERSION);
23
23
  use Image::ExifTool qw(:DataAccess :Utils);
24
24
 
25
- $VERSION = '1.25';
25
+ $VERSION = '1.26';
26
26
 
27
27
  sub ProcessPEResources($$);
28
28
  sub ProcessPEVersion($$);
@@ -942,7 +942,7 @@ sub ReadUnicodeStr($$$;$)
942
942
  }
943
943
  $pos += 2 if $pos & 0x03;
944
944
  my $to = $et ? $et->Options('Charset') : 'UTF8';
945
- return (Image::ExifTool::Decode(undef,$str,'UCS2','II',$to), $pos);
945
+ return (Image::ExifTool::Decode(undef,$str,'UTF16','II',$to), $pos);
946
946
  }
947
947
 
948
948
  #------------------------------------------------------------------------------
@@ -1355,7 +1355,7 @@ sub ProcessEXE($$)
1355
1355
  } else { # misc debug info
1356
1356
  next unless $n > 12;
1357
1357
  my $exe = substr($buf2,12);
1358
- $exe = $et->Decode($exe, 'UCS2') if Get32u(\$buf2,8);
1358
+ $exe = $et->Decode($exe, 'UTF16') if Get32u(\$buf2,8);
1359
1359
  $exe =~ s/\0.*//; # truncate at null
1360
1360
  $tagTablePtr = GetTagTable('Image::ExifTool::EXE::Misc');
1361
1361
  $et->HandleTag($tagTablePtr, 12, $exe, DataPt => \$buf2, DataPos => $of);